Подтвердить что ты не робот

Как отсортировать суффиксы массивов при сортировке блоков

Я читаю алгоритм сортировки блоков из бумаги Берроуза и Уилера. Это шаг алгоритма:

Предположим, что S = abracadabra

Инициализировать массив W из N слов W [0,..., N - 1], так что W [i] содержит символы S '[i,..., я + k - 1], расположенные так, что целочисленные сравнения по словам согласуются с лексикографическими сравнениями в k-символьных строках. Пакет символов в словах имеет два преимущества: он позволяет одновременно сравнивать два байта по байтам с использованием выравненных запросов доступа к памяти и позволяет исключить многие медленные случаи.

(Примечание: S' - это оригинальный S с добавленными к нему символами k EOF, k - количество символов, которые вписываются в машинное слово (я на 32-битной машине, поэтому k=4)

EOF = '$'

Исправьте меня, если я ошибаюсь:

S'= abracadabra$$$$  
W= abra brac raca acad cada adab dabr abra bra$ ra$$ a$$$

Затем алгоритм говорит, что вам нужно отсортировать массив суффиксов S (с именем V), индексируя его в массив W.

Я не совсем понимаю, как вы можете сортировать суффиксы путем индексирования в W. Например: в какой-то момент сортировки предположим, что вы получаете два суффикса i и j, и вам нужно их сравнить. Поскольку вы индексируете на W, вы проверяете по 4 символа в то время.
 Предположим, что они имеют одинаковые первые 4 символа. Затем вам нужно будет проверить, для каждого суффикса их следующие 4 символа, и вы делаете это, обратившись с 4-й позиции каждого суффикса в W. Это правильно? Действительно ли эта "упаковка символов в слова" действительно ускоряет процесс?

4b9b3361

Ответ 1

То, как вы описываете это в вопросе, абсолютно точно. И да, это ускоряет работу, потому что, как вы сказали, она сравнивает по четыре символа за раз.

Есть два замечания, которые нужно сделать:

  • Когда вы сравниваете суффиксы я и j, как в вашем примере, вы действительно сравниваете записи W [i] и W [j]. Результат такой же, как если бы вы лексикографически сравнивали четверку символов S [i..i + 3] и S [j..j + 3], поэтому вы сохранили вычислительное время, эквивалентное трехзначным сравнениям. И да, если результат указывает на то, что две четверки идентичны, вам нужно продолжить сравнение W [i + 1] и W [j + 1], однако: вы не делаете это сразу, Как работает их алгоритм, это сортировка по методу radix. То есть вы помещаете суффиксы в ведра сразу после первоначального сравнения (возможно, оба в одном и том же ведре), а затем внутренне сортируете ведра, рекурсивно.
  • Алгоритм, описанный в оригинальной работе Берроуза и Уилера (из которых вы цитируете: здесь есть копия здесь), которая с 1994 года, не является оптимальным алгоритмом построения массива суффикса. Во-первых, в 2003 году было открыто несколько методов O (N) прямого строительства; во-вторых, с тех пор были сделаны многие дальнейшие улучшения в реализации. Ядром документа 1994 года является идея использования преобразования Берроуза-Уилера в качестве основы для сжатия строк, а не точного способа генерации самого преобразования.

Ответ 2

Массив V не является массивом суффикса, а массивом индексов в W. После завершения сортировки V должен содержать индексы в W такие, что если

V[i] <= V[j]

затем

 W[V[i]] <= W[V[j]].

Надеюсь, я сказал, что правильно:) У них ТОЧНО матч не проблема, и любой заказ в порядке. Дело в том, что когда вы применяете обратное преобразование, вам нужно восстановить W, чтобы восстановить исходную строку, а идентичные элементы W не вызовут проблемы с этим.