2004 г.
Семёнов Ю.А. (ГНЦ ИТЭФ),
Майкл Барроуз и Давид Вилер (Burrows-Wheeler) в 1994 году предложили свой алгоритм преобразования (BWT). Этот алгоритм работает с блоками данных и обеспечивает эффективное сжатие без потери информации. В результате преобразования блок данных имеет ту же длину, но другой порядок расположения символов. Алгоритм тем эффективнее, чем больший блок данных преобразуется (например,
256-512 Кбайт).
Последовательность S, содержащая N символов ({S(0),… S(N-1)}), подвергается N циклическим сдвигам (вращениям), лексикографической сортировке, а последний символ при каждом вращении извлекается. Из этих символов формируется строка L, где i-ый символ является последним символом i-го вращения. Кроме строки L создается индекс I исходной строки S в упорядоченном списке вращений. Существует эффективный алгоритм восстановления исходной последовательности символов S на основе строки L и индекса I. Процедура сортировки объединяет результаты вращений с идентичными начальными символами. Предполагается, что символы в S соответствуют алфавиту, содержащему K символов.
Для пояснения работы алгоритма возьмем последовательность S= “abraca” (N=6), алфавит X
= {‘a','b','c','r'}.
1. Формируем матрицу из N*N элементов, чьи строки представляют собой результаты циклического сдвига (вращений) исходной последовательности S, отсортированных лексикографически. По крайней мере одна из строк M содержит исходную последовательность S. Пусть I является индексом строки S. В приведенном примере индекс I=1, а матрица M имеет вид:
Номер строки |
|
0 |
aabrac |
1 |
abraca |
2 |
acaabr |
3 |
bracaa |
4 |
caabra |
5 |
racaab |
2. Пусть строка L представляет собой последнюю колонку матрицы M с символами L[0],…,L[N-1]
(соответствуют M[0,N-1],…,M[N-1,N-1]). Формируем строку последних символов вращений. Окончательный результат характеризуется (L,I). В данном примере L='caraab',
I =1.
Процедура декомпрессии использует L и I. Целью этой процедуры является получение исходной последовательности из N символов (S).
1. Сначала вычисляем первую колонку матрицы M (F). Это делается путем сортировки символов строки L. Каждая колонка исходной матрицы M представляет собой перестановки исходной последовательности S. Таким образом, первая колонка F и L являются перестановками S. Так как строки в M упорядочены, размещение символов в F также упорядочено.
F='aaabcr'.
2. Рассматриваем ряды матрицы M, которые начинаются с заданного символа ch. Строки матрицы М упорядочены лексикографически, поэтому строки, начинающиеся с ch упорядочены аналогичным образом. Определим матрицу M', которая получается из строк матрицы M путем циклического сдвига на один символ вправо. Для каждого i=0,…,
N-1 и каждого j=0,…,N-1,
M'[i,j] = m[i,(j-1) mod N]
В рассмотренном примере M и M' имеют вид:
Строка |
M |
M' |
0 |
aabrac |
caabra |
1 |
abraca |
aabraс |
2 |
acaabr |
racaab |
3 |
bracaa |
abraca |
4 |
caabra |
acaabr |
5 |
racaab |
bracaa |
Подобно M каждая строка M' является вращением S, и для каждой строки M существует соответствующая строка M'.
M' получена из M так, что строки M' упорядочены лексикографически, начиная со второго символа. Таким образом, если мы рассмотрим только те строки M', которые начинаются с заданного символа ch, они должны следовать упорядоченным образом с учетом второго символа. Следовательно, для любого заданного символа ch, строки M, которые начинаются с ch, появляются в том же порядке что и в M', начинающиеся с ch. В нашем примере это видно на примере строк, начинающихся с ‘a'. Строки ‘aabrac', ‘abraca' и ‘acaabr' имеют номера 0,
1 и 2 в M и 1, 3, 4 в M'.
Используя F и L, первые колонки M и M' мы вычислим вектор Т, который указывает на соответствие между строками двух матриц, с учетом того, что для каждого j
= 0,…,N-1 строки j M' соответствуют строкам T[j] M.
Если L[j] является к-ым появлением ch в L, тогда T[j]=1, где F[i] является к-ым появлением ch в F. Заметьте, что Т представляет соответствие один в один между элементами F и элементами L, а F[T[j]]
= L[j]. В нашем примере T равно: (4 0 5 1 2 3).
3. Теперь для каждого i = 0,…, N-1 символы L[i] и F[i] являются соответственно последними и первыми символами строки i матрицы M. Так как каждая строка является вращением S, символ L[i] является циклическим предшественником символа F[i] в S. Из Т мы имеем F[T[j]]
= L[j]. Подставляя i =T[j], мы получаем символ L[T(j)], который циклически предшествует символу L[j] в S.
Индекс I указывает на строку М, где записана строка S. Таким образом, последний символ S равен L[I]. Мы используем вектор T для получения предшественников каждого символа: для каждого i
= 0,…,N-1 S[N-1-i] = L[T i [I]], где T 0 [x] =x, а T i+1 [x] = T[T i [x]. Эта процедура позволяет восстановить первоначальную последовательность символов S
(‘abraca').
Последовательность T i [I] для i =0,…,N-1 не обязательно является перестановкой чисел 0,…,N-1. Если исходная последовательность S является формой Z
p для некоторой подстановки Z и для некоторого p>1, тогда последовательность T
i [I] для i = 0,…,N-1 будет также формой Z 'p для некоторой субпоследовательности Z'. Таким образом, если S
= ‘cancan', Z = ‘can' и p=2, последовательность T i [I] для i = 0,…,N-1 будет [2,4,0,2,4,0].
Описанный выше алгоритм упорядочивает вращения исходной последовательности символов S и формирует строку L, состоящую из последних символов вращений. Для того, чтобы понять, почему такое упорядочение приводит к более эффективному сжатию, рассмотрим воздействие на отдельную букву в обычном слове английского текста.
Возьмем в качестве примера букву “t” в слове ‘the' и предположим, что исходная последовательность содержит много таких слов. Когда список вращений упорядочен, все вращения, начинающиеся с ‘he', будут взаимно упорядочены. Один отрезок строки L будет содержать непропорционально большое число ‘t', перемешанных с другими символами, которые могут предшествовать ‘he', такими как пробел, ‘s', ‘T' и ‘S'.
Аналогичные аргументы могут быть использованы для всех символов всех слов, таким образом, любая область строки L будет содержать большое число некоторых символов. В результате вероятность того, что символ ‘ch' встретится в данной точке L, весьма велика, если ch встречается вблизи этой точки L, и мала в противоположном случае. Это свойство способствует эффективной работе локально адаптивных алгоритмов сжатия, где кодируется относительное положение идентичных символов. В случае применения к строке L, такой кодировщик будет выдавать малые числа, которые могут способствовать эффективной работе последующего кодирования, например, посредством алгоритма Хафмана.
Ссылки
-
J.Ziv and A.Lempel. A universal algorithm for sequential data compression.
IEEE Transactions on Information Theory. Vol. IT-23, N.3, May 1977, pp.
337-343.
-
J.Ziv and A.Lempel. Compression of individual sequences via variable
rate coding. IEEE Transactions on Information Theory. Vol. IT-24. N.5,
September 1978, pp. 530-535.
-
M.Burrows and D.J.Wheeler. A block-sorting Lossless Data Compression
Algorithm. Digital Systems Research Center. SRC report 124. May 10, 1994.
-
J.L.Bently, D.D.Sleator, R.E.Tarjan, and V.K.Wei. A locally adaptive
data compression algorithm. Communications of the ACM, Vol. 29, No. 4,
April 1986, pp. 320-330
-
http://www.ics.uci.edu/~dan/pubs/DataCompression.html
(Saleem Bhatti)
-
http://www.speednet/~spenser/ted/DataCompression.html
-
http://www.iicm.edu/jucs_1_8/differencial_ziv_lempel_text/html/paper.html
Смотри http://web2.airmail/markn/articles/bwt/bwt.htm
Назад: 2.6.2. Локально адаптивный алгоритм сжатия
Оглавление: Телекоммуникационные технологии
Вперёд: 2.6.4. Метод Шеннона-Фано