Run-length encoding (RLE) – самый распространенный и простой алгоритм сжатия информации. В нем последовательно повторяющиеся символы заменяются одним символом, указывающим на нужное количество повторов.
К примеру, есть строка АААААА, для хранения которой нужно 6 байт (по байту на символ). Принцип сжатия сводится к тому, что мы употребляем 6А, благодаря чему занимаем только 2 байта и экономим 4 байта памяти. Если количество повторов в исходном коде сайта большое, эффективность алгоритма будет крайне высокой.
Но при этом у алгоритма есть недостаток. Он практически неэффективен при последовательностях символов, которые не повторяются. К примеру, есть последовательность БВБВБВ, занимающая 6 байт. Применение алгоритма приведет к такой последовательности 1Б1В1Б1В1Б1В на целых 12 байт. Но решить эту проблему можно – для этого предусмотрено несколько методик.
Группа алгоритмов LZ (по фамилиям разработчиков Лемпэла и Зива) направлена на сжатие встречавшихся ранее последовательностей символов. В процессе применения алгоритмов разрабатывается динамическая таблица (словарь), в которой есть список встречавшихся последовательностей и их закодированных значений. Эффективность сжатия при этом намного выше, чем у RLE-алгоритмов.
Gzip – самая известная и эффективная реализация описанного выше принципа сжатия. Ранее в Интернете использовали два подхода к сжатию gzip, а также deflate. Они отличались тем, что gzip отправлял начало потока данных с указанием, что эти данные gzip-сжатые, а deflate не отправлял. Процесс gzip оказался проще, поэтому было решено поддерживать повсеместно только его.