Обратное преобразование Барроуза-Уиллера — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «==Обратное преобразование Барроуза-Уиллера== Если отсортировать символы последнего столб…»)
 
м (Перенаправление на Преобразование Барроуза-Уилера)
 
(не показано 29 промежуточных версий 3 участников)
Строка 1: Строка 1:
==Обратное преобразование Барроуза-Уиллера==
+
#перенаправление [[Преобразование Барроуза-Уилера]]
Если отсортировать символы последнего столбца матрицы перестановок - а перед началом обратного преобразования нам известен только он - то мы получим первый столбец данной матрицы,так как строки матрицы были отсортированы в лексикографическом порядке.
 
Известно, что символы последнего столбца предшествуют символам первого, находящимся в той же строке, поскольку использовался циклический сдвиг. Таким образом, мы имеем уже список пар, состоящих из символа последнего столбца и следующего за ним символа первого столбца. После сортировки этих пар мы обретаем знание о двух первых столбцах матрицы. И так далее, пока мы не получим всю матрицу перестановок, после чего выписываем строку с заданным номером. Рассмотрим этот алгоритм на конкретном примере. Пусть дана строка "абракадабра". В результате преобразования получаем набор ("рдакраааабб", 3).
 
{|
 
|
 
{| border="1"
 
  |а||...||р
 
  |-
 
  |а||...||д
 
  |-
 
  |а||...||а
 
  |-
 
  |а||...||к
 
  |-
 
  |а||...||р
 
  |-
 
  |б||...||а
 
  |-
 
  |б||...||а
 
  |-
 
  |д||...||а
 
  |-
 
  |к||...||а
 
  |-
 
  |р||...||б
 
  |-
 
  |р||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аа||...||р
 
  |-
 
  |аб||...||д
 
  |-
 
  |аб||...||а
 
  |-
 
  |ад||...||к
 
  |-
 
  |ак||...||р
 
  |-
 
  |бр||...||а
 
  |-
 
  |бр||...||а
 
  |-
 
  |да||...||а
 
  |-
 
  |ка||...||а
 
  |-
 
  |ра||...||б
 
  |-
 
  |ра||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |ааб||...||р
 
  |-
 
  |абр||...||д
 
  |-
 
  |абр||...||а
 
  |-
 
  |ада||...||к
 
  |-
 
  |ака||...||р
 
  |-
 
  |бра||...||а
 
  |-
 
  |бра||...||а
 
  |-
 
  |даб||...||а
 
  |-
 
  |кад||...||а
 
  |-
 
  |раа||...||б
 
  |-
 
  |рак||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабр||...||р
 
  |-
 
  |абра||...||д
 
  |-
 
  |абра||...||а
 
  |-
 
  |адаб||...||к
 
  |-
 
  |акад||...||р
 
  |-
 
  |браа||...||а
 
  |-
 
  |брак||...||а
 
  |-
 
  |дабр||...||а
 
  |-
 
  |када||...||а
 
  |-
 
  |рааб||...||б
 
  |-
 
  |рака||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабра||...||р
 
  |-
 
  |абраа||...||д
 
  |-
 
  |абрак||...||а
 
  |-
 
  |адабр||...||к
 
  |-
 
  |акада||...||р
 
  |-
 
  |брааб||...||а
 
  |-
 
  |брака||...||а
 
  |-
 
  |дабра||...||а
 
  |-
 
  |кадаб||...||а
 
  |-
 
  |раабр||...||б
 
  |-
 
  |ракад||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабрак||...||р
 
  |-
 
  |абрааб||...||д
 
  |-
 
  |абрака||...||а
 
  |-
 
  |адабра||...||к
 
  |-
 
  |акадаб||...||р
 
  |-
 
  |браабр||...||а
 
  |-
 
  |бракад||...||а
 
  |-
 
  |дабраа||...||а
 
  |-
 
  |кадабр||...||а
 
  |-
 
  |раабра||...||б
 
  |-
 
  |ракада||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабрака||...||р
 
  |-
 
  |абраабр||...||д
 
  |-
 
  |абракад||...||а
 
  |-
 
  |адабраа||...||к
 
  |-
 
  |акадабр||...||р
 
  |-
 
  |браабра||...||а
 
  |-
 
  |бракада||...||а
 
  |-
 
  |дабрааб||...||а
 
  |-
 
  |кадабра||...||а
 
  |-
 
  |раабрак||...||б
 
  |-
 
  |ракадаб||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабракад||...||р
 
  |-
 
  |абраабра||...||д
 
  |-
 
  |абракада||...||а
 
  |-
 
  |адабрааб||...||к
 
  |-
 
  |акадабра||...||р
 
  |-
 
  |браабрак||...||а
 
  |-
 
  |бракадаб||...||а
 
  |-
 
  |дабраабр||...||а
 
  |-
 
  |кадабраа||...||а
 
  |-
 
  |раабрака||...||б
 
  |-
 
  |ракадабр||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабракада||...||р
 
  |-
 
  |абраабрак||...||д
 
  |-
 
  |абракадаб||...||а
 
  |-
 
  |адабраабр||...||к
 
  |-
 
  |акадабраа||...||р
 
  |-
 
  |браабрака||...||а
 
  |-
 
  |бракадабр||...||а
 
  |-
 
  |дабраабра||...||а
 
  |-
 
  |кадабрааб||...||а
 
  |-
 
  |раабракад||...||б
 
  |-
 
  |ракадабра||...||б
 
  |}
 
| ||
 
|
 
{| border="1"
 
  |аабракадаб||р
 
  |-
 
  |абраабрака||д
 
  |-
 
  |абракадабр||а
 
  |-
 
  |адабраабра||к
 
  |-
 
  |акадабрааб||р
 
  |-
 
  |браабракад||а
 
  |-
 
  |бракадабра||а
 
  |-
 
  |дабраабрак||а
 
  |-
 
  |кадабраабр||а
 
  |-
 
  |раабракада||б
 
  |-
 
  |ракадабраа||б
 
  |}
 
|}
 
Зная номер исходной строки - 3, мы воспроизводим входные данные - "абракадабра". Как несложно посчитать сложность данного алгоритма <tex> 0(N^3logN) </tex>.
 
Однако, данный алгоритм можно оптимизировать. Заметим, что при каждом проявлении доселе неизвестного столбца выполнялись одни и те же действия. А именно, из строки, начинающейся с некоторого символа последнего столбца получалась строка, в которой этот символ находится на первой позиции.
 

Текущая версия на 22:43, 31 января 2019