Материал из Викиконспекты
|
|
(не показано 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