Преобразование Барроуза-Уилера

Материал из Викиконспекты
Перейти к: навигация, поиск

Определение

Определение:
Преобразование Барроуза — Уилера (Burrows-Wheeler transform, BWT) — это алгоритм, используемый в техниках сжатия данных для преобразования исходных данных.

bzip2 использует преобразование Барроуза-Уилера для превращения последовательностей многократно чередующихся символов в строки одинаковых символов, затем применяет преобразование MTF (англ. move-to-front), и в конце кодирование Хаффмана.

Описание алгоритма

Преобразование выполняется в три этапа. На первом этапе составляется таблица всех циклических сдвигов входной строки. На втором этапе производится лексикографическая (в алфавитном порядке) сортировка строк таблицы. На третьем этапе в качестве выходной строки выбирается последний столбец таблицы преобразования. Следующий пример иллюстрирует описанный алгоритм:

Пусть нам дана исходная строка [math]s = [/math]"ABACABA".

Трансформация
Вход Все
Перестановки
Сортировка
Строк
Выход
ABACABA
ABACABA
BACABAA
ACABAAB
CABAABA
ABAABAC
BAABACA
AABACAB
AABACAB
ABAABAC
ABACABA
ACABAAB
BAABACA
BACABAA
CABAABA 
BCABAAA

Результат вкратце запишем так: [math]BWT(s)=[/math]("BCABAAA", 3), где 3 - это номер исходной строки в отсортированной матрице, так как он может понадобиться для обратного преобразования.

Следует заметить, что иногда в исходной строке приводится так называемый символ конца строки $, который в преобразовании будет считаться последним символом, тогда сохранение номера исходной строки не требуется. При аналогичном вышеприведённом преобразовании та строчка в матрице, которая будет заканчиваться на символ конца строки и будет исходной ("ABACABA$"). При этом при сортировке матрицы данный символ будет рассматриваться как самый последний после всех символов алфавита. Тогда результат можно записать так [math]BWT(s)=[/math]"$CBBAAAA". Он будет эквивалентен первому, так как также содержит все символы исходной строки.

Обратное преобразование

Пусть нам дано: [math]BWT(s)=[/math]("BCABAAA", 3). Тогда выпишем в столбик нашу преобразованную последовательность символов "BCABAAA". Запишем её как последний столбик предыдущей матрицы (при прямом преобразовании Барроуза — Уилера), при этом все предыдущие столбцы оставляем пустыми. Далее построчно отсортируем матрицу, затем в предыдущий столбец запишем "BCABAAA". Опять построчно отсортируем матрицу. Продолжая таким образом, можно восстановить полный список всех циклических перестановок строки, которую нам надо найти. Выстроив полный отсортированный список перестановок, выберем строку с номером, который нам был изначально дан. В итоге мы получим искомую строку. Алгоритм обратного преобразования описан в таблице ниже:

Обратное преобразование
Вход
BCABAAA
Добавление 1 Сортировка 1 Добавление 2 Сортировка 2 Добавление 3 Сортировка 3 Добавление 4
B
C
A
B
A
A
A
A
A
A
A
B
B
C
BA
CA
AA
BA
AB
AB
AC
AA
AB
AB
AC
BA
BA
CA
BAA
CAB
AAB
BAC
ABA
ABA
ACA
AAB
ABA
ABA
ACA
BAA
BAC
CAB
BAAB
CABA
AABA
BACA
ABAA
ABAC
ACAB
Сортировка 4 Добавление 5 Сортировка 5 Добавление 6 Сортировка 6 Добавление 7 Сортировка 7
AABA
ABAA
ABAC
ACAB
BAAB
BACA
CABA
BAABA
CABAA
AABAC
BACAB
ABAAB
ABACA
ACABA
AABAC
ABAAB
ABACA
ACABA
BAABA
BACAB
CABAA
BAABAC
CABAAB
AABACA
BACABA
ABAABA
ABACAB
ACABAA
AABACA
ABAABA
ABACAB
ACABAA
BAABAC
BACABA
CABAAB
BAABACA
CABAABA
AABACAB
BACABAA
ABAABAC
ABACABA
ACABAAB
AABACAB
ABAABAC
ABACABA
ACABAAB
BAABACA
BACABAA
CABAABA
Результат
ABACABA

Следует также заметить, что если нам было бы дано [math]BWT(s)=[/math]"$CBBAAAA", то мы также получили бы нашу исходную строку, только с символом конца строки $ на конце: ABACABA$.

Ссылки