>> Преобразование Барроуза-Уилера
HTML
LATEX PS
PDF
|== > К
списку публикаций Д.В.Хмелева To the
list of publications of D.V.Khmelev
Преобразование Барроуза-Уилера, массив суффиксов и сжатие
словарей
Д.В.Хмелёв
18 ноября 2003
Настоящая статья победила в конкурсе статей о сжатии
01.08.2003-31.10.2003 на сервере http://www.compression.ru/.
Статья содержит много математических символов и некоторых
браузерах может отображаться некорректно. Кроме того, HTML-вариант не включает в
себя алгоритмы. Для корректного просмотра и распечатки статьи используйте PS-
или PDF-варианты.
Аннотация
В статье (а) строго обоснована обратимость преобразования
Барроуза-Уилера (BWT), (б) разобрана связь BWT с суффиксными массивами, (в)
выявлены условия при которых из BWT можно восстановить заодно и и суффиксный
массив, (г) приведены базовые алгоритмы обращения BWT. Кроме того, на основе
анализа BWT предложено новое преобразование, которое может быть полезно для
сжатия словарей или данных словарного типа.
1
Введение2
Преобразование BW и его обратимость3
Суффиксный массив и BWT4
Алгоритмы восстановления T и s по B и I5
Преобразование данных словарного типа 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 будем обозначать
Ј ( < ). Обозначим через
S
kT циклический сдвиг текста 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), буквы которого заданы соотношением
(другими словами,
B
i=(S
s(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) |
и в случае равенства B
d(i)=B
d(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:
Если
лексикографически отсортировать буквы последнего столбца и поместить их в первый
столбец, то получается таблица
в
которой буквы первого столбца B
d(i)
совпадают с T[
si] в силу лексикографического
порядка. Теперь, вспомнив, что пары B
iB
d(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) |
С другой стороны,
B
j=(S
s(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).
| |
Это, в частности, означает,
что B
d(j)=B
d(j+1), откуда в силу определения (
3)
вытекает неравенство
d(j) <
d(j+1). Обозначим r=
d(j), s=
d(j+1). Выражая вышесказанное через r и s, получим
B
r=B
s и r < s. В силу B
r=B
s,
порядок между
|
|
|
|
=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 и S
0T=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(S
j+1T). Обозначим B=BW(T)=BW(S
j+1T). Значит,
перестановка
d, что строится по BW(T) и
BW(S
j+1T), одна и та же. Применяя лемму
3
к S
j+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) |
Обозначим через I
k
позицию разделителя $
k в тексте B:
Раз
уж B
d(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(I
k-1))=$
k, а потому в силу структуры (
14)
концептуальной матрицы 0
Ј dlk(I
k-1) < n. Поскольку T
k не содержит
разделителей, для всех m=1, ..., l
k-1
выполнено
dm(I
k-1)
і n. Таким образом,
m(k
-1)=l
k, и оба заявленных утверждения
верны. q.e.d.
Рассмотрим теперь текст ЩB, полученный из текста B с помощью замены всех
символов-разделителей $k на один символ-разделитель $, который
предшествует всем символам алфавита A исходного текста T:
|
^
B
|
i
|
= |
м п н п о
|
|
|
|
если Bi=$k
при некотором 0 Ј k Ј n-1. | |
| |
| |
(18) |
По
ЩB
i можно построить перестановку
Щd,
удовлетворяющую условию:
|
^
B
|
Щd(i)
|
Ј |
^
B
|
Щd(i+1)
|
при i=0,ј,N-1, | |
(19) |
и в случае равенства
ЩB
d(i)=
ЩB
d(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(
ЩI
k) < n эквивалентно условию
dm(
ЩI
k) < 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 легко восстановить номера
разделителей $. При известных номерах можно восстановить I
k, и
перестановка
w восстанавливается из порядка
d-1(I
k). Можно
восстановить
w и с другого конца: зная I
k
можно восстановить
g, откуда однозначно находится
w =
g-1°z.
Наконец, поскольку d - неприводима, в силу
леммы 1
легко восстанавливается и перестановка s. q.e.d.
5.2 Применение для сжатия
Теперь
покажем, как теорему
3
можно применять на практике. Предположим, что у нас имеестся n
последовательностей символов T
0, ..., T
n-1, порядок которых нам не существеннен. Это может быть
словарь, либо набор статей в корпусе текстов (такие статьи обычно содержат все
необходимые читателю выходные данные) и т.п. Объединим эти тексты в один текст,
разделив их с помощью специальных символов разделителей, которые нигде больше в
T
0, ..., T
n-1 не встречаются:
Теперь
необходимо задать какой-то лексикографический порядок на разделителях.
Теорема
3
допускает
произвольный порядок, лишь бы разделители лексикографически
предшествовали всем символам из текстов T
0, ..., T
n-1. Практика показывает, что для данных типа словаря
является выгодным порядок разделителей, отвечающий лексикографическому порядку
текстов T
k: $
j < $
kЫT
j < T
k. Если строки T
0,
..., T
n-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 < 2
30, n
» N/1000, то
количество дополнительной информации не превосходит 0.0023N байт, а хорошая
группировка может, наверное, улучшить сжатие больше чем на 1%.
Возможны и другие хитрости. Например, можно разбивать разделители на группы и
передавать информацию о перестановках внутри этих групп. В общем, этот метод
представляется многообещающим в плане улучшения сжатия.
6 Благодарности
Автор пользуется случаем
выразить признательность Е. Шелвину и В. Юкину за обсуждение
алгоритма
4.
СПИСОК ЛИТЕРАТУРЫ
- [1]
- Д. Ватолин, А. Ратушняк, М. Смирнов и В. Юкин.
Методы сжатия данных. - М.:Диалог-МИФИ, 2002. - 384 с. 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.
http://www.compression.ru/download/articles/bwt/burrows_wheeler_1994_pdf.rar
- [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
Суффиксный массив и BWT4
Алгоритмы восстановления T и s по B и I5
Преобразование данных словарного типа 5.1
Теория 5.2
Применение для сжатия 5.3
Применение в качестве фильтра
©2003 Д.Хмелёв