Обратное преобразование Барроуза-Уиллера

Материал из Викиконспекты
Версия от 07:39, 2 января 2011; 192.168.0.2 (обсуждение) (Новая страница: «==Обратное преобразование Барроуза-Уиллера== Если отсортировать символы последнего столб…»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Обратное преобразование Барроуза-Уиллера

Если отсортировать символы последнего столбца матрицы перестановок - а перед началом обратного преобразования нам известен только он - то мы получим первый столбец данной матрицы,так как строки матрицы были отсортированы в лексикографическом порядке. Известно, что символы последнего столбца предшествуют символам первого, находящимся в той же строке, поскольку использовался циклический сдвиг. Таким образом, мы имеем уже список пар, состоящих из символа последнего столбца и следующего за ним символа первого столбца. После сортировки этих пар мы обретаем знание о двух первых столбцах матрицы. И так далее, пока мы не получим всю матрицу перестановок, после чего выписываем строку с заданным номером. Рассмотрим этот алгоритм на конкретном примере. Пусть дана строка "абракадабра". В результате преобразования получаем набор ("рдакраааабб", 3).

а ... р
а ... д
а ... а
а ... к
а ... р
б ... а
б ... а
д ... а
к ... а
р ... б
р ... б
аа ... р
аб ... д
аб ... а
ад ... к
ак ... р
бр ... а
бр ... а
да ... а
ка ... а
ра ... б
ра ... б
ааб ... р
абр ... д
абр ... а
ада ... к
ака ... р
бра ... а
бра ... а
даб ... а
кад ... а
раа ... б
рак ... б
аабр ... р
абра ... д
абра ... а
адаб ... к
акад ... р
браа ... а
брак ... а
дабр ... а
када ... а
рааб ... б
рака ... б
аабра ... р
абраа ... д
абрак ... а
адабр ... к
акада ... р
брааб ... а
брака ... а
дабра ... а
кадаб ... а
раабр ... б
ракад ... б
аабрак ... р
абрааб ... д
абрака ... а
адабра ... к
акадаб ... р
браабр ... а
бракад ... а
дабраа ... а
кадабр ... а
раабра ... б
ракада ... б
аабрака ... р
абраабр ... д
абракад ... а
адабраа ... к
акадабр ... р
браабра ... а
бракада ... а
дабрааб ... а
кадабра ... а
раабрак ... б
ракадаб ... б
аабракад ... р
абраабра ... д
абракада ... а
адабрааб ... к
акадабра ... р
браабрак ... а
бракадаб ... а
дабраабр ... а
кадабраа ... а
раабрака ... б
ракадабр ... б
аабракада ... р
абраабрак ... д
абракадаб ... а
адабраабр ... к
акадабраа ... р
браабрака ... а
бракадабр ... а
дабраабра ... а
кадабрааб ... а
раабракад ... б
ракадабра ... б
аабракадаб р
абраабрака д
абракадабр а
адабраабра к
акадабрааб р
браабракад а
бракадабра а
дабраабрак а
кадабраабр а
раабракада б
ракадабраа б

Зная номер исходной строки - 3, мы воспроизводим входные данные - "абракадабра". Как несложно посчитать сложность данного алгоритма [math] 0(N^3logN) [/math]. Однако, данный алгоритм можно оптимизировать. Заметим, что при каждом проявлении доселе неизвестного столбца выполнялись одни и те же действия. А именно, из строки, начинающейся с некоторого символа последнего столбца получалась строка, в которой этот символ находится на первой позиции.