Усиление степени сжатия текста: различия между версиями
Irina (обсуждение | вклад) |
Irina (обсуждение | вклад) |
||
Строка 31: | Строка 31: | ||
Пример 1. Пусть строка s = mississippi. Для k = 1 имеем <math>i_s = mssp, s_s = isis, p_s = ip \;</math>. Следовательно, <math>H_1(s) = \frac{4}{11} H_0 (mssp) + \frac{4}{11} H_0 (isis) + \frac{2}{11} H_0 (ip) = \frac{6}{11} + \frac{4}{11} + \frac{2}{11} = \frac{12}{11}.</math> | '''Пример 1'''. Пусть строка s = mississippi. Для k = 1 имеем <math>i_s = mssp, s_s = isis, p_s = ip \;</math>. Следовательно, <math>H_1(s) = \frac{4}{11} H_0 (mssp) + \frac{4}{11} H_0 (isis) + \frac{2}{11} H_0 (ip) = \frac{6}{11} + \frac{4}{11} + \frac{2}{11} = \frac{12}{11}.</math> | ||
Версия от 21:57, 8 января 2017
Ключевые слова и синонимы
Модели сжатия высокого порядка; сжатие с учетом контекста
Постановка задачи
Неформально техника усиления представляет собой метод, который при применении к определенному классу алгоритмов повышает их эффективность. Повышение должно быть доказуемым и четко определенным в виде одного или нескольких параметров, характеризующих эффективность работы алгоритма. Примеры подобных «усилителей» можно найти в сегментах рандомизированных алгоритмов (здесь усилитель позволяет превратить алгоритм BPP в RP [6]) и теории вычислительного обучения (в данном случае усилитель позволяет повысить точность прогнозирования у слабого обучающего алгоритма [10]). Задача усиления сжатия заключается в разработке техники, повышающей эффективность сжатия широкого класса алгоритмов. В частности, результатом работы Ферраджины и др. явилась обобщенная техника, позволяющая «заставить» компрессор, не использовавший контекстной информации вовсе, всегда использовать наилучший возможный контекст.
Классические алгоритмы Хаффмана и арифметического кодирования [1] могут служить примерами статистических алгоритмов сжатия, обычно кодирующих входной символ в соответствии с общей частотой его вхождения в данных, подлежащих сжатию. [Динамические версии этих алгоритмов рассматривают частоту схождения символа в уже просканированной порции входных данных.] Этот подход эффективен и прост в реализации, однако обеспечивает невысокий уровень сжатия. Эффективность работы статистических алгоритмов сжатия можно повысить в результате использования моделей более высокого порядка, получающих более качественную оценку частоты встречаемости входных символов. Алгоритм сжатия PPM [9] реализует эту идею за сбора данных о частоте вхождения всех символов, попадающих в любой контекст длины k, и сжатия их при помощи арифметического кодирования. Длина контекста k представляет собой параметр алгоритма, который определяется подлежащими сжатию данными: он будет разным при сжатии текста на английском языке, последовательности ДНК или документа в формате XML. Можно привести и другие примеры сложных программ сжатия, таких как алгоритмы Лемпеля-Зива и Барроуза-Уилера [9], использующих информацию о контексте неявным образом. Все эти алгоритмы, учитывающие контекст, хороши по критерию эффективности работы, однако сложны для реализации и анализа.
Применение техники усиления Ферраджины и др. к алгоритмам Хаффмана и арифметического кодирования позволяет получить новый алгоритм сжатия со следующими характеристиками:
(i) новый алгоритм использует усиленный алгоритм сжатия в качестве черного ящика;
(ii) новый алгоритм выполняет сжатие в стиле PPM, автоматически выбирая оптимальное значение k;
(iii) асимптотическая эффективность нового алгоритма по соотношению времени и памяти соответствует эффективности усиленного алгоритма сжатия.
В следующих разделах будет изложено точное формальное обоснование перечисленных характеристик.
Основные результаты
Нотация. Эмпирическая энтропия
Пусть s – строка над алфавитом [math]\displaystyle{ \Sigma = \{ a_1, ..., a_h \} \; }[/math]. Обозначим для каждого [math]\displaystyle{ a_i \in \Sigma \; }[/math] за [math]\displaystyle{ n_i \; }[/math] количество вхождений [math]\displaystyle{ a_i \; }[/math] в s. Эмпирическая энтропия нулевого порядка строки s определяется как [math]\displaystyle{ H_0(s) = - \sum^h_{i = 1} (n_i / |s|) \; log (n_i / |s|) }[/math], где все алгоритмы берутся по основанияю 2, а 0 log 0 = 0. Хорошо известно, что [math]\displaystyle{ H_0 \; }[/math] представляет собой максимальный уровень сжатия, которого можно достичь при использовании уникального декодируемого кода, в котором каждому символу алфавита назначается уникальное кодовое слово. Более высокой степени сжатия можно достичь, если кодовое слово символа зависит от k символов, следующих за ним (то есть от его контекста). [Большинство алгоритмов сжатия данных обычно рассматривают контекст, предшествующий кодируемым символам. В данном описании используется нестандартный «прямой» контекст для упрощения нотации в последующих разделах. Работа с «прямым» контекстом эквивалентна работе с традиционным «обратным» контекстом для обращенной строки s (подробнее см. в [3]).] Определим [math]\displaystyle{ w_s \; }[/math] как строку единичных символов, непосредственно предшествующих вхождениям w в s. Например, для s = bcabcabdca получим [math]\displaystyle{ ca_s = bbd \; }[/math]. Значение
(1) [math]\displaystyle{ H_k(s) = \frac{1}{|s|} \sum_{w \in \Sigma^k} |w_s| \; H_0(w_s) }[/math]
представляет эмпирическую энтропию k-го порядка для s и является нижней границей степени сжатия, которой можно достичь при использовании кодовых слов, которые зависят только от k символов, непоследственно следующих за кодируемым.
Пример 1. Пусть строка s = mississippi. Для k = 1 имеем [math]\displaystyle{ i_s = mssp, s_s = isis, p_s = ip \; }[/math]. Следовательно, [math]\displaystyle{ H_1(s) = \frac{4}{11} H_0 (mssp) + \frac{4}{11} H_0 (isis) + \frac{2}{11} H_0 (ip) = \frac{6}{11} + \frac{4}{11} + \frac{2}{11} = \frac{12}{11}. }[/math]
Отметим, что эмпирическая энтропия определяется для любой строки и может использоваться для измерения эффективности алгоритмов сжатия без каких-либо предположений о входных данных. К сожалению, для некоторых строк (с очень высокой сжимаемостью) эмпирическая энтропия обеспечивает слишком консервативное значение нижней границы. Например, для [math]\displaystyle{ s = a^n \; }[/math] имеет место [math]\displaystyle{ |s| \; H_k(s) = 0 }[/math] для любого [math]\displaystyle{ k \ge 0 \; }[/math]. Чтобы лучше справляться со строками с высокой сжимаемостью, в работе [7] было введено понятие модифицированной эмпирической энтропии нулевого порядка [math]\displaystyle{ H_0^*(s) \; }[/math], имеющей следующее свойство: [math]\displaystyle{ |s| \; H^*_0(s) }[/math] по меньшей мере равно количеству бит, необходимых для записи длины s в двоичной форме. Модифицированная эмпирическая энтропия k-го порядка [math]\displaystyle{ H^*_k \; }[/math] определяется как максимальная степень сжатия, которой можно достичь при просмотре не более чем k символов, следующих за кодируемым.
Преобразование Барроуза-Уилера
Пусть дана строка s. Преобразование Барроуза-Уилера [2] (bwt) включает три основных этапа:
(1) добавить в концу строки s специальный символ $, который меньше любого другого символа в [math]\displaystyle{ \Sigma \; }[/math];
(2) сформировать концептуальную матрицу [math]\displaystyle{ \mathcal{M} \; }[/math], строки которой содержат круговые сдвиги строки s$, отсортированные в лексикографическом порядке;
(3) построить преобразованный текст [math]\displaystyle{ \hat{s} = bwt(s) \; }[/math], взяв последний столбец матрицы [math]\displaystyle{ \mathcal{M} \; }[/math] (см. рис. 1).
В работе [2] Барроуз и Уилер доказали, что [math]\displaystyle{ \hat{s} \; }[/math] является перестановкой s и что можно восстановить s из [math]\displaystyle{ \hat{s} \; }[/math] за время O(|s|).
Чтобы убедиться в мощи преобразования bwt, рассмотрим ситуацию с точки зрения эмпирической энтропии. Зафиксируем целое положительное число k. Первые k столбцов матрицы bwt содержат все подстроки s длины k, лексикограчфически упорядоченные (а также k подстрок, содержащих символ $). Для любой подстроки w строки s длины k символы, непосредственно предшествующие каждому вхождению w в s, сгруппированы вместе в множество последовательных позиций в [math]\displaystyle{ \hat{s} \; }[/math], поскольку они являются последними символами строк матрицы [math]\displaystyle{ \mathcal{M} \; }[/math], которым предшествуют символы w. Используя нотацию, предложенную при определении [math]\displaystyle{ Н_k \; }[/math], можно перефразировать это свойство так, чтобы символы [math]\displaystyle{ w_s \; }[/math] были последовательными в [math]\displaystyle{ \hat{s} \; }[/math] или, что эквивалентно, чтобы [math]\displaystyle{ \hat{s} \; }[/math] содержало в качестве подстроки перестановку [math]\displaystyle{ \pi_w (w_s) \; }[/math] строки [math]\displaystyle{ w_s \; }[/math].
Пример 2. Пусть s = mississippi и k = 1. На рис. 1 показано, что [math]\displaystyle{ \hat{s} [1, 4] = pssm \; }[/math] является перестановкой [math]\displaystyle{ i_s = mssp \; }[/math]. Кроме того, [math]\displaystyle{ \hat{s} [6, 7] = pi \; }[/math] является перестановкой [math]\displaystyle{ p_s = ip \; }[/math], а [math]\displaystyle{ \hat{s} [8, 11] = ssii \; }[/math] – перестановкой [math]\displaystyle{ s_s = isis \; }[/math].
Поскольку перестановка строки не меняет ее (модифицированной) эмпирической энтропии нулевого порядка (то есть HQ{JIW{WS)) = H0(WS)), преобразование Барроуза-Уилера может рассматриваться как способ свести задачу сжатия строки s вплоть до энтропии k-го порядка к задаче сжатия отдельных фрагментов s вплоть до их энтропии нулевого порядка. Чтобы убедиться в этом, рассмотрим разбиение строки s на подстроки JIW{WS), изменяя w над Sk. Из этого следует, что s = \_\w€zk fw^s), где J – оператор конкатенации над строками.3
3 Помимо tw2 jjk 7iw(ws), строка s также содержит последние k символов s (не входящие ни в какой ws) и специальный символ $. Для простоты в дальнейшем изложении эти символы будут игнорироваться.
Из (1) следует, что J2 \JIW{WS)\H0{JIW{WS)) = Xj wsjH0(ws) = jsjHk(s): w2
Следовательно, для сжатия строки s вплоть до js достаточно сжать каждую ее подстроку JIW{WS) вплоть до эмпирической энтропии нулевого порядка. Заметим, однако, что при использовании вышеприведенной схемы параметр k необходимы выбрать заранее. Более того, подобную схему нельзя применить к H*, определенной в терминах контекстов длины не более k. В результате на данный момент не известно эффеективной процедуры для вычисления разбиения s согласно H*(s). Усилитель сжатия [3] представляет собой естественное дополнение bwt и позволяет сжимать любую строку s до Hk(s) (или H*(s)) одновременно для всех k > 0.