HTML
LATEX
PS
PDF
|== > К списку публикаций
To the list of publications
Преобразование Барроуза-Уилера, массив суффиксов и сжатие
словарей
Преобразование Барроуза-Уилера, массив суффиксов и сжатие
словарей
Д.В.Хмелёв
18 ноября 2003
Настоящая статья победила в конкурсе статей о сжатии
01.08.2003-31.10.2003 на сервере http://www.compression.ru/.
Статья содержит много математических символов и
некоторых браузерах может отображаться некорректно. Кроме того,
HTML-вариант не включает в себя алгоритмы. Для корректного просмотра
и распечатки статьи используйте PS- или
PDF-варианты.
Аннотация
В статье (а) строго обоснована обратимость преобразования
Барроуза-Уилера (BWT), (б) разобрана связь BWT с суффиксными
массивами, (в) выявлены условия при которых из BWT
можно восстановить заодно и и суффиксный массив, (г) приведены
базовые алгоритмы обращения BWT. Кроме того, на основе анализа BWT
предложено новое преобразование, которое может быть полезно для
сжатия словарей или данных словарного типа.
1 Введение
2 Преобразование BW и его обратимость
3 Суффиксный массив и BWT
4 Алгоритмы восстановления T и s по B и I
5 Преобразование данных словарного типа
5.1 Теория
5.2 Применение для сжатия
5.3 Применение в качестве фильтра
1 Введение
Преобразование Барроуза-Уилера, изобретённое Д.Дж. Уилером в 1983 году
и впервые опубликованное в совместной статье с Барроузом [3]
применяется как для сжатия текстов без потерь, так и для сжатия
дополнительной индексной информации к тексту. Тем не менее, до сих пор
отсутствует математически ясное обоснование некоторых фактов о
преобразовании, в частности, обратимости и возможности восстановить
суффиксный массив. Настоящая статья заполняет этот пробел. Кроме
того, здесь предложена новая модификация преобразования, которую можно
использовать для улучшения сжатия данных вроде словарных или корпусных.
Преобразование Барроуза-Уилера будет называться BW-преобразованием
или просто BWT от Burrows-Wheeler Transformation.
В разделе 2 доказана обратимость
BW-преобразования. Раздел 3 освещает тесную связь между
суффиксными массивами и BW-преобразованием, включая способ
извлечения суффиксного массива из преобразования BW.
Раздел 4 содержит базовые алгоритмы связанные с
BW-преобразованием. Наконец, раздел 5
включает описание, обоснование и алгоритм нового метода для сжатия
данных типа словаря. Предложенный метод можно также использовать для
предварительной группировки данных с целью повышения сжатия.
Автор придерживается той точки зрения, что построение алгоритма должно
выполняться только после кристально математически ясного понимания
ситуации. До того судить о верности алгоритма можно лишь на
интуитивном уровне, а интуиция может подвести. Как ни странно, теория
BW-преобразования, находится в зачаточном состоянии в то время
как багаж наработанных алгоритмов уже достаточно велик. Настоящая
работа исправляет этот крен и является чисто теоретической.
2 Преобразование BW и его обратимость
Пусть текст T состоит из 1+N букв, занумерованных с нуля:
T[0..N]. Буквы T[i] принадлежат некоторому упорядоченному
алфавиту A. Лексикографический порядок (строгий) на
строках из букв алфавита A будем обозначать Ј
( < ). Обозначим через SkT циклический сдвиг текста T на k
символов влево:
|
(SkT)[j]=T[(j+k) mod n+1]. |
|
Существует перестановка s чисел {0,ј,N}, которая удовлетворяет
условию
|
Ss(i)T Ј Ss(i+1)T, i=0,ј,N-1. |
| (1) |
Преобразование Барроуза-Уилера текста T есть текст B[0..N]=BW(T),
буквы которого заданы соотношением
(другими словами,
Bi=(Ss(i)-1T)[0]=T[s(i)-1 mod N+1]).
Теорема 1 [Барроуз-Уилер]
Для восстановления исходного текста T из преобразования B
достаточно знать число I, отвечающее условию s(I)=0 (или
Ss(I)T=T).
Далее изложено формальное доказательство
теоремы 1, основанное на изучении перестановки
d чисел {0,ј,N}, удовлетворяющей условию:
|
Bd(i) Ј Bd(i+1) при i=0,ј,N-1, |
| (3) |
и в случае равенства Bd(i)=Bd(i+1) выполнено
d(i) < d(i+1). Перестановка d однозначно определяется текстом
B и её можно подсчитать за время O(N) с помощью сортировки
подсчётом (см. далее алгоритм 1 в разделе 4).
Перестановку d можно рассматривать в качестве отображения
d:{0,ј,N}®{0,ј,N}. Итерацию k отображения d
обозначим через dk=d°dk-1, причём d0(i) є i,
d1(i)=d(i).
Теорема 2
При всех m=1,ј,N+1 верны утверждения
|
Bd(i)јBdm(i) Ј Bd(i+1)јBdm(i+1) при i=0,ј, N-1, |
| (4) |
и
|
BiBd(i)јBdm-1(i)=(Ss(i)-1T)[0..m-1] при i=0,ј, N. |
| (5) |
Обычно обратимость BW-преобразования поясняют при помощи составления
«концептуальной» таблицы M размерности (N+1)×(N+1),
последний столбец которой составлен из букв Bi:
Если лексикографически отсортировать буквы последнего столбца и
поместить их в первый столбец, то получается таблица
в которой буквы первого столбца Bd(i) совпадают с
T[si] в силу лексикографического порядка. Теперь, вспомнив, что
пары BiBd(i) суть префиксы всех циклических перестановок
исходного текста, можно отсортировать эти пары и получить второй
столбец матрицы, который даст тройки букв и т.д.
Таким образом, конечно, можно восстановить всю матрицу. Зная номер I
строки, отвечающей исходному тексту T, легко найти сам текст T,
поскольку s(I)=0 и Ss(I)T=T.
Обычно после такого объяснения, используя аналогии различной степени
неточности, без строгого доказательства предлагается метод для
восстановления T, который заключается в том, T[i]=Bdi(I),
i=0, ..., N. Автору не удалось обнаружить ни одного
строгого доказательства правильности этого метода. Некое подобие
обоснования дано в оригинальной работе Барроуза и Уилера [3], но
они в действительности пользуются преобразованием d-1 и
обосновывают алгоритм только для этого случая.
Теорема 2 призвана внести ясность в обоснование
BW-преобразования и его обращения. Из неё вытекает, что действительно
|
M= |
ж з з з з
з з з и
|
|
ц ч ч ч ч
ч ч ч ш
|
= |
ж з з з з
з з з и
|
|
ц ч ч ч ч
ч ч ч ш
|
. |
|
Доказательство. [Доказательство теоремы 2 проводится
индукцией по m=1, ..., N+1] База индукции m=1. В силу
определения (3) при всех i=0, ..., N-1 верно
сравнение Bd(i) Ј Bd(i+1). В силу
определения (2) выполнено Bi=(Ss(i)-1T)[0].
Пусть утверждения теоремы верны при m-1. Докажем их для
m. В силу предположения индукции
|
Bd(i)јBdm-1(i) Ј Bd(i+1)ј Bdm-1(i+1) при i=0,ј, N-1 |
| (6) |
Кроме того,
|
BiBd(i)јBdm-2(i)=(Ss(i)-1T)[0..m-2] при i=0,ј, N |
| (7) |
Набор строк
|
(BiBd(i)јBdm-2(i), i=0,ј,N) |
| (8) |
совпадает с точностью до перестановки d с набором строк
|
(Bd(j)Bd2(j)јBdm-1(j), j=0,ј,N). |
| (9) |
В силу (6),
набор (9) лексикографически упорядочен, а в
силу (7) набор (8)
есть набор префиксов длины m-1 всех циклических сдвигов исходного
текста.
Однако, в силу определения (1) перестановки s
набор (Ss(i)T)[0..m-2] также является лексикографически
упорядоченным набором префиксов длины m-1 всех циклических сдвигов
текста T.
Поэтому
|
Bd(j)Bd2(j)јBdm-1(j)=(Ss(j)T)[0..m-2] при j=0,ј, N |
| (10) |
С другой стороны, Bj=(Ss(j)-1T)[0]. Поэтому
|
BjBd(j)Bd2(j)јBdm-1(j)=(Ss(j)-1T)[0..m-1] при j=0,ј, N, |
|
как и требуется в (5).
Остаётся доказать (4), то есть, что набор строк
|
(Bd(j)Bd2(j)јBdm(d(j)), j=0,ј,N). |
|
лексикографически упорядочен. Если
|
Bd(j)јBdm-1(j) № Bd(j+1)јBdm-1(j+1), |
|
то, в силу (6)
|
Bd(j)јBdm-1(j) < Bd(j+1)јBdm-1(j+1), |
|
откуда вытекает
|
Bd(j)јBdm-1(j)Bdm(j) < Bd(j+1)јBdm-1(j+1)Bdm(j+1). |
|
Поэтому предположим, что
|
Bd(j)јBdm-1(j)=Bd(j+1)јBdm-1(j+1). |
|
Это, в частности, означает, что Bd(j)=Bd(j+1), откуда в
силу определения (3) вытекает неравенство
d(j) < d(j+1). Обозначим r=d(j), s=d(j+1). Выражая
вышесказанное через r и s, получим Br=Bs и r < s.
В силу Br=Bs, порядок между
|
|
| |
| |
=Bd(j+1)Bd2(j+1)јBdm(j+1) |
|
|
|
|
совпадает с порядком между
|
Bd(r)јBdm-1(r) и Bd(s)јBdm-1(s) |
|
Напомним (см. (10)), что
|
Bd(r)јBdm-1(r)=(Ss(r)T)[0..m-2] и Bd(s)јBdm-1(s)=(Ss(s)T)[0..m-2] |
|
Из определения (1) и неравенства r < s, получается сравнение
|
(Ss(r)T)[0..m-2] Ј (Ss(s)T)[0..m-2], |
|
что даёт требуемый в (4) порядок.
q.e.d.
Воспользуемся теоремой 2 при m=N+1. Тогда
при всех i=0, ..., N выполнено
Подстановка i=I с учётом s(I)=0 и S0T=T даёт
Доказательство. [Доказательство теоремы 1]
Поскольку перестановка d однозначно определяется по B
(см. (3)), получаем, что текст T действительно
однозначно определяется текстом B и числом I по
формуле (11).
q.e.d.
3 Суффиксный массив и BWT
Перестановку s называют иногда суффиксным массивом или
массивом суффиксов. Это не совсем точно: разные определения
суффиксного массива пояснены в конце раздела. Суффиксные массивы
играют важную роль в индексации информации. Например, с их помощью
легко найти все повторяющиеся подстроки текста и много других важных
характеристик текста (см., например, [2]).
Теорема 1 позволяет восстановить исходный текст
T из преобразованного текста B и индекса I. Поскольку
перестановка s несёт важную информацию о тексте, возникает
естественный вопрос: можно ли попутно восстановить перестановку s?
Оказывается, можно!
Наивный подход заключается в следующем. Известно, что
s(I)=0. Естественно положить s(d(I))=1, ...,
s(dN(I))=N. Проблема заключается в том, что набор чисел
I, d(I), ..., dN(I) может и не оказаться
перестановкой чисел 0, ..., N. Пример, когда
это не так, был построен ещё Барроузом и Уилером [3].
Действительно, пусть T[0..5]=»канкан». Тогда матрица из
лексикографически отсортированных строк выглядит так:
то есть s
=(1,4,0,3,2,5), B=»ккннаа» и I=2. Перестановка
d есть
Очевидно, имеется цикл
0[( d) || (® )]4[( d) || (® )]2[( d) || (® )]0,
и наивный подход проваливается.
Из теоремы 2 вытекает следующая лемма:
Лемма 1
Предположим, что
|
{I,d(I),ј,dN(I)}={0,ј,N}. |
| (12) |
Тогда
Что означает условие (12)? Оно означает
неприводимость перестановки d.
Перестановка d называется неприводимой, если при некотором
j совпадают множества {j, d(j), ..., dN(j)}={0,
..., N}.
Лемма 2
Пусть при некотором j выполнено равенство {j, d(j), ...,
dN(j)}={0, ..., N}. Тогда
1) dN+1(j)=j;
2) При всех i О {0, ..., N} выполнено
|
{i,d(i),ј, dN(i)}={0,ј,N}. |
|
3) При всех i О {0, ..., N} имеем dN+1(i)=i.
Доказательство.
Утверждения 2) и 3) легко вытекают из утверждения 1), которое и
будет показано далее. В силу того, что d - перестановка,
|
d{j,d(j),ј,dN(j)}=d{0,ј,N}={0,ј,N}. |
|
С другой стороны,
|
d{j,d(j),јdN-1(j)} = {d(j),d2(j),јdN(j)}={0,ј,N}\{j}. |
|
Таким образом, единственным возможным значением для d(dN(j))
является j.
q.e.d.
Не следует путать неприводимую перестановку с циклической.
Перестановка d называется циклической, если при некотором
K выполнено d(i)=i+K mod N+1 для всех i О {0, ..., N}.
Циклическая перестановка является неприводимой тогда и только тогда,
когда N+1 и K взаимно просты: НОД(N+1,K)=1. Подкрепляющий
пример: преобразование BW(T) определяется упорядочиванием
циклических перестановок (сдвигов) текста SjT. Для
одновременного восстановления текста T и перестановки s
желательна (в силу леммы 1) неприводимость d.
Лемма 3
Предположим, что символ T[N] отличен от всех остальных символов
текста T: T[N] № T[i], i=0, ј, N-1.
Тогда перестановка d - неприводима.
Доказательство.
В силу теоремы 2
Поскольку символ T[N] отличен от всех остальных символов,
di(I) № I при i=1,ј,N. Если бы среди чисел di(I)
оказалось два одинаковых, например, dj(I)=dk(I),
1 Ј j < k Ј N, то dj+s(I)=dj+(s mod k-j)(I), а
потому dj+s(I) № I при всех s > 0, что противоречит условию
dN+1(I)=I. Поэтому все числа di(I), i=1, ..., N
различны, а вместе с I они составляют множество чисел
Неприводимость перестановки d следует из
леммы 2.
q.e.d.
Лемма 4
Предположим, что какой-нибудь символ T[j] отличен от всех
остальных символов текста T: T[j] № T[i], i № j.
Тогда перестановка d - неприводимая.
Доказательство.
Рассмотрим циклический сдвиг Sj+1T, у которого
Ясно, что BW(T)=BW(Sj+1T). Обозначим B=BW(T)=BW(Sj+1T).
Значит, перестановка d, что строится по BW(T) и BW(Sj+1T),
одна и та же. Применяя лемму 3 к
Sj+1T получаем неприводимость d.
q.e.d.
Лирическое отступление. Вышесказанное не означает, конечно же,
что не существует алгоритма, восстанавливающего перестановку s для
неприводимых d. Составление такого алгоритма - интересная
задача, которая «закруглила» бы теорию преобразования
Барроуза-Уилера. Автор настоящей статьи не относится к математикам,
которые любят доказывать результаты в максимальной общности. Поэтому
здесь дана лишь правдоподобная гипотеза о строении d, которая
верна для строки «канкан» (см. начало раздела).
Назовём перестановку d допустимой, если она может
возникнуть для какого-нибудь текста T: d
=d(BW(T)) при
некотором T[0..N].
Гипотеза 1
Пусть k > 0, n > 0 - разложение числа N+1 на целые множители:
N+1=kn. Тогда допустима перестановка d со свойствами:
1) dk(0)=0,
2) множество
{0,d(0),ј,dk-1(0)} содержит k разных чисел,
3) dj(i)=dj(0)+i при j=0, ..., k-1, и
i=0,...,n-1.
Других допустимых перестановок d нет.
Если N+1 - простое число, то из гипотезы вытекает,
что возможны 2 варианта: либо d - неприводима (случай
k×n=(N+1)×1), либо d(i)=i при всех i (случай
k×n=1×(N+1)). Например, первый случай возникает если
буква T[N] отличается от всех остальных. Второй - если текст
T[0..N] есть повторение одной буквы (например,
T[0..N]=aN+1). Конец
лирического отступления.
Обозначим $=T[N] - последний символ T, отличный от всех остальных.
Будем называть символ $ разделителем. Название
обуславливается тем, что этот символ отделяет начало текста от конца.
В разделе 5 будет использовано несколько
разделителей, чтобы представить несколько текстов в одной строке. В
принципе, возможны различные порядки $ относительно других букв
алфавита A. Обычно выбирают $ либо лексикографически
младшим, либо лексикографически старшим в A. В первом
случае s0=0, а во втором случае sN=N. Суффиксным
массивом называют перестановку s, из которой убран индекс,
указывающий на $.
С точки обозначений наиболее простым является соглашение о
лексикографически старшем $. Тогда перестановка
s
=(s0,ј,sN-1,N), а суффиксный массив - это набор
(s0,ј,sN-1). Обычно это упрощает алгоритмы обработки
строк, см., например, [2]
Таким образом, чтобы найти перестановку s можно воспользоваться
любым из многочисленных методов построения суффиксных массивов для
текста T [4,5,6], а потом просто
добавить суффикс, отвечающий символу T[N]. В приведённых
статьях [4,5,6] обычно делается
предположение, что $ Ј A.
Для индекса I, отвечающего s(I)=0 выполнено
BI=T[N]=$. Поэтому, чтобы избежать необходимости кодировать
символ $ достаточно передать текст Bў=B[0..I-1]B[I+1..N] и номер
I. Очевидно, по этой информации легко восстановить
|
B=Bў[0..I-1] $ Bў[I..N-1]. |
|
Обладая этой информацией, по формулам (11)
и (13) можно восстановить T и s.
4 Алгоритмы восстановления T и s по B и I
После прочтения предыдущих разделов не должно вызывать затруднений
построение текста B (или текста Bў). Остался незатронутым только
вопрос о нахождении d по тексту B.
Алгоритм 1 [Нахождение d]
Пусть A={a1,ј,an}, причём
ai < ai+1.
Для просмотра
алгоритма обращайтес к PS- или
PDF-версии.
Нетрудно видеть, что алгоритм 1 есть всего навсего
модификация сортировки подсчётом.
Пользуясь формулой
не представляет труда создать алгоритм, восстанавливающий текст T по
BW-преобразованию B и индексу I.
Алгоритм 2 [Восстановление T]
Для просмотра
алгоритма обращайтес к PS- или
PDF-версии.
Если перестановка d неприводима, то в силу
леммы 1,
Поэтому алгоритм попутного восстановления перестановки s выглядит
следующим образом.
Алгоритм 3 [Одновременное восстановление T и s]
Предполагается, что перестановка d неприводима.
Для просмотра
алгоритма обращайтес к PS- или
PDF-версии.
Используя рассуждения, приведённые в конце раздела 3
легко модифицировать алгоритмы 1, 2,
3 для восстановления текста непосредственно из массива
Bў с учётом лексикографического положения разделителя $
относительно других букв алфавита.
5 Преобразование данных словарного типа
5.1 Теория
Пусть текст T[0..N] состоит из n частей, которые разделены
специальными символами $0, ..., $n-1, нигде более в
тексте T не встречающимися, причём T[N]=$n-1.
Будем считать, что позиции i0, ..., in-1 разделителей
упорядочены:
|
0 Ј i0 < ј < in-1=N, причём T[ik]=$k, k=0,ј,n-1. |
|
Другими словами,
Кроме того, пусть разделители лексикографически
предшествуют всем остальным буквам алфавита A:
|
$k < a для всех a О A\{$0, ј,$n-1} и для всех k=0,ј,n-1. |
|
Каковы свойства у BW(T)? В силу того, что разделители
предшествуют всем остальным символам алфавита, они будут стоять
(некоторой перестановкой) в первом столбце концептуальной матрицы
лексикографически отсортированных сдвигов T:
где w - перестановка, удовлетворяющая условию
|
$w(0) < $w(1) < ј < $w(n-1). |
| (15) |
Обозначим через Ik позицию разделителя $k в тексте B:
Раз уж Bd(j)=$w(j),
|
d(j)=Iw(j), при j=0,ј,n-1. |
| (16) |
Пусть lk - длина фрагмента Tk:
|
|
| |
| |
=ik-(ik-1+1), при k=1,ј,n-1. |
|
|
|
|
Определим также
|
m(k)= |
min
| {m | dm(Ik) < n}, и положим m(-1) є m(n-1). |
| (17) |
Лемма 5
При каждом k=0, ..., n-1 верны утверждения
1) lk=m(k-1).
2)
Tk=(Sik-1T)[1..lk]=Bd(Ik-1)јBdm(k-1)(Ik-1).
(здесь i-1 є in-1, I-1 є In-1).
Доказательство.
В силу того, что разделитель $k-1 непосредственно предшествует
строке Tk, из теоремы 2 вытекает, что
Заметим, что d(dlk(Ik-1))=$k, а потому в силу
структуры (14) концептуальной матрицы
0 Ј dlk(Ik-1) < n. Поскольку Tk не содержит
разделителей, для всех m=1, ..., lk-1 выполнено
dm(Ik-1) і n. Таким образом, m(k-1)=lk, и оба
заявленных утверждения верны.
q.e.d.
Рассмотрим теперь текст ЩB, полученный из текста B с помощью
замены всех символов-разделителей $k на один символ-разделитель
$, который предшествует всем символам алфавита A
исходного текста T:
|
|
^
B
|
i
|
= |
м п н
п о
|
| |
| |
если Bi=$k при некотором 0 Ј k Ј n-1. |
|
|
|
|
| (18) |
По ЩBi можно построить перестановку Щd, удовлетворяющую
условию:
|
|
^
B
|
Щd(i)
|
Ј |
^
B
|
Щd(i+1)
|
при i=0,ј,N-1, |
| (19) |
и в случае равенства ЩBd(i)=ЩBd(i+1) выполнено
Щd(i) < Щd(i+1). Алгоритм построения Щd совпадает с
алгоритмом 1 построения d, только надо на вход подать
ЩB вместо B.
Легко видеть, что условия (19) и (3)
различаются лишь при i=0, ..., n-1, причём для i=0, ...,
n-1 имеем Bd(i)=$w(i) (см.
также (16)) и ЩBЩd(i)=$.
Поэтому справедлива следующая лемма.
Лемма 6
d(i)=Щd(i) при i=n, ..., N.
Обозначим через ЩI0 < ј < ЩIn-1 позиции разделителя
$ в ЩB:
|
|
^
B
|
[ |
^
I
|
k
|
]=$ при k=0, ј, n-1. |
|
Из определения ЩB вытекает
Лемма 7
{ЩI0,ј,ЩIn-1}={I0,ј,In-1}. Другими
словами, набор чисел (ЩI0,ј,ЩIn-1) есть
перестановка набора чисел (I0,ј,In-1).
Из определения (19) перестановки Щd
вытекает, что
|
|
^
d
|
(k)= |
^
I
|
k
|
при k=0, ј, n-1. |
| (20) |
Пусть g - это и есть перестановка чисел {0, ..., n-1},
переводящая набор (ЩI0,ј,ЩIn-1) в набор
(I0,ј,In-1):
Кстати говоря, в этой перестановке известен последний элемент:
g(n-1)=n-1. По аналогии с (17) определим
|
|
^
m
|
(k)= |
min
| {m | |
^
d
|
m
|
( |
^
I
|
k
|
) < n}, и положим |
^
m
|
(-1) є |
^
m
|
(n-1). |
| (22) |
Поскольку Щd(i)=d(i) при i=n, ..., N, то условие
Щdm(ЩIk) < n эквивалентно условию dm(ЩIk) < n. Поэтому
справедливо тождество
Для упрощения формулировок, положим ЩI-1 є ЩIn-1,
g(-1) є g(n-1).
Теорема 3
Обозначим
|
|
^
T
|
j
|
= |
^
B
|
Щd(ЩIj-1)
|
ј |
^
B
|
ЩdЩm(j-1)(ЩIj-1)
|
при j=0,ј,n-1. |
| (24) |
Для
всех k=0, ..., n-1,
Другими словами, наборы строк
|
( |
^
T
|
j
|
| j=0,ј,n-1) и ( |
^
T
|
k
|
| k=0,ј,n-1) |
|
совпадают с точностью до перестановки, явная формула для которой в
терминах g дана тождеством (25).
Доказательство.
Пользуясь определением текста ЩB и леммой 6,
можно упростить выражение (24):
|
|
^
T
|
j
|
=Bd(ЩIj-1)јBdЩm(j-1)(ЩIj-1). |
|
Подставим теперь j=g(k-1)+1. Тогда
j-1=g(k-1) и формула приобретает вид
|
|
^
T
|
g(k-1)+1
|
=Bd(ЩIg(k-1))јBdЩm(g(k-1))(ЩIg(k-1)). |
|
что с учётом тождеств (23)
и (21) даёт упростить выражение справа до
|
Bd(Ik-1)јBdm(k-1)(Ik-1)=Tk |
|
в силу утверждения 2) леммы 5.
q.e.d.
Теорема 4 Имеет место тождество
Доказательство.
При i і n тождество (26) доказано в
лемме 6. В силу (20) и
определения (21) выполнено тождество
Щd(g(k))=ЩIg(k)=Ik при k=0,ј,n-1. Если же
подставить k=w(i), i=0,ј,n-1, то
из (16) получаем
|
|
^
d
|
(g(w(i)))=Iw(i)=d(i). |
| q.e.d. |
Теорема 5
Текст T (включая разделители с их порядком w) и перестановка
s однозначно восстанавливаются по набору (ЩB, I, z),
где текст ЩB определён в (18), целое число I
определяется из условия s(I)=0, и z
=g°w.
Замечание 1
В силу леммы 3 перестановка d
неприводима (последний символ $n-1 отличен от всех остальных).
Это согласуется с выводом теоремы 5, который
справедлив лишь при неприводимой перестановке d.
Доказательство.
В силу (26) с помощью z
=g°w и Щd
однозначно восстанавливается перестановка d.
Обозначим ЩT
=T0$јTn-1$. В
силу (11), используя известное I и найденную d,
можно получить
|
|
^
T
|
= |
^
B
|
d(I)
|
ј |
^
B
|
dN+1(I)
|
. |
|
Зная ЩT легко восстановить номера разделителей $. При
известных номерах можно восстановить Ik, и перестановка w
восстанавливается из порядка d-1(Ik). Можно восстановить
w и с другого конца: зная Ik можно восстановить g, откуда
однозначно находится w
=g-1°z.
Наконец, поскольку d - неприводима, в силу леммы 1 легко
восстанавливается и перестановка s.
q.e.d.
5.2 Применение для сжатия
Теперь покажем, как теорему 3 можно применять на
практике. Предположим, что у нас имеестся n последовательностей
символов T0, ..., Tn-1, порядок которых нам не
существеннен. Это может быть словарь, либо набор статей в корпусе
текстов (такие статьи обычно содержат все необходимые читателю
выходные данные) и т.п. Объединим эти тексты в один текст, разделив их
с помощью специальных символов разделителей, которые нигде больше в
T0, ..., Tn-1 не встречаются:
Теперь необходимо задать какой-то лексикографический порядок на
разделителях. Теорема 3 допускает
произвольный порядок, лишь бы разделители лексикографически
предшествовали всем символам из текстов T0, ..., Tn-1.
Практика показывает, что для данных типа словаря является выгодным
порядок разделителей, отвечающий лексикографическому порядку текстов
Tk: $j < $kЫTj < Tk. Если строки T0, ...,
Tn-1 уже были лексикографически отсортированы, то такой порядок
задать ещё проще: $j < $kЫj < k.
После определения порядка символов следует воспользоваться сортировкой
суффиксов для построения перестановки s, удовлетворяющей
условию (1).
Замечание 2
Если Вы пользуетесь языком Си, тексты Ti не содержат символа с
кодом 0, и порядок на суффиксах задаётся по правилу
$j < $kЫj < k, то можно разделять тексты Ti только
одним символом - с кодом 0, и воспользоваться следующей функцией
для сравнения суффиксов T[i..N] и T[j..N] при сортировке:
int N; /* длина минус 1 */
unsigned char *T; /* текст T[0..N] */
int suffix_compare(int i, int j){
int res=strcmp(T+i,T+j);
if(res==0) res=i-j;
return res;
}
Получив перестановку s, необходимо построить текст ЩB по
правилу:
|
|
^
B
|
i
|
= |
м н
о
|
| |
если Ss(i)-1T[0] № $k, k=0,ј,n-1, |
|
| |
если Ss(i)-1T[0]=$k, при некотором k=0,ј,n-1. |
|
|
|
|
Текст ЩB можно подвергнуть сжатию с использованием разнообразных
методов: RLE, MTF, DC (Distance Coding), 01BFA (Е.Шелвин), MTH,
Huffman, ARI, не считая 0-1 кодирования и прочих хитростей. Реализация
этих методов подробно описана другими авторами (см.
книгу [1]).
Приведём алгоритм восстановления набора текстов ЩTj, j=0, ...,
n-1, который является некоторой перестановкой текстов Tk, из
текста ЩB. Алгоритм пользуется соотношением (24).
Отметим, что никакой дополнительной информации, кроме самого текста
ЩB не требуется (в отличие от алгоритмов 2
и 3).
Алгоритм 4 [Восстановление ЩTj]
На выходе алгоритма определены переменные:
n - количество фрагментов,
Щlj - длина фрагмента j при j=0,ј,n-1,
ЩTj[0..Щlj-1] - фрагмент ЩTj, j=0,ј,n-1.
Для просмотра
алгоритма обращайтес к PS- или
PDF-версии.
5.3 Применение в качестве фильтра
В силу теоремы 5 для однозначного восстановления
исходного текста T из ЩB необходимо ещё передать перестановку
z
=g°w и номер I строки T в концептуальной матрице
M. Эта информация позволяет полностью восстановить исходный текст.
Основной трюк заключается в том, что справедлива формула
Доказательство теоремы 5 описывает метод восстановления
T и s.
В связи с этим возникает естественное предложение о применении ЩB
в качестве предварительного фильтра неоднородных данных. Именно, можно
назначить во входных данных разделитель (например, символ конца
предложения - точку), и попытаться сгруппировать данные так, чтобы
было больше близких контекстов в ЩB. При этом можно свободно
выбрать порядок на разделителях $k.
Имеет ли смысл такая группировка может показать только практика. При
условии равновероятности всех перестановок для оптимального
кодирования z можно использовать арифметическое сжатие: первое
число - одно из n, следующее - одно из n-1 оставшихся и т.д.
Таким образом сжатая информация о z будет требовать
|
|
| |
log2(n)+log2(n-1)+ј+log2(1)= |
|
| |
= log2(n!) » |
n(log(n)-1)
ln2
|
» 1.44 n(log(n)-1) бит. |
|
|
|
|
Если брать объём N < 230, n » N/1000, то количество
дополнительной информации не превосходит 0.0023N байт, а хорошая
группировка может, наверное, улучшить сжатие больше чем на 1%.
Возможны и другие хитрости. Например, можно разбивать разделители на
группы и передавать информацию о перестановках внутри этих групп. В
общем, этот метод представляется многообещающим в плане
улучшения сжатия.
6 Благодарности
Автор пользуется случаем выразить признательность Е. Шелвину и В. Юкину
за обсуждение алгоритма 4.
СПИСОК ЛИТЕРАТУРЫ
- [1]
-
Д. Ватолин, А. Ратушняк, М. Смирнов, и В. Юкин.
Методы сжатия данных.
Диалог-МИФИ, Москва, 2002.
http://www.compression.ru.
- [2]
-
M. I. Abouelhoda, S. Kurtz, and E. Ohlebusch.
The enhanced suffix array and its applications to genome analysis.
In Proceedings of the 2nd Workshop on Algorithms in
Bioinformatics, number 2452 in LNCS, pages 449-463, 2002.
http://theorie.informatik.uni-ulm.de/Personen/eo/PAPERS/WABI02.pdf.
- [3]
-
M. Burrows and D. J. Wheeler.
A block-sorting lossless data compression algorithm.
Technical Report 124, Digital SRC, Palo Alto, 1994.
- [4]
-
J. Kärkkäinen and P. Sanders.
Simple linear work suffix array construction.
In 30th International Colloquium on Automata, Languages and
Programming, number 2719 in LNCS, pages 943-955, 2003.
http://citeseer.nj.nec.com/arkk03simple.html.
- [5]
-
N. J. Larsson and K. Sadakane.
Faster suffix sorting.
Technical Report LU-CS-TR:99-214, LUNDFD6/(NFCS-3140)/1-20/(1999),
Department of Computer Science, Lund University, Sweden, May 1999.
http://www.compression.ru/download/articles/bwt/sada_larsson_1999_pdf.rar.
- [6]
-
U. Manber and G. Myers.
Suffix arrays: a new method for on-line string searches.
SIAM J. Comput., 22(5):935-948, 1993.
1 Введение
2 Преобразование BW и его обратимость
3 Суффиксный массив и BWT
4 Алгоритмы восстановления T и s по B и I
5 Преобразование данных словарного типа
5.1 Теория
5.2 Применение для сжатия
5.3 Применение в качестве фильтра
©2003Д.Хмелёв