Суффиксный массив — это отсортированный массив всех суффиксов данной строки. Определение похоже на Suffix Tree, которое является сжатым набором всех суффиксов данного текста.
Let the given string be "banana". 0 banana 5 a 1 anana Sort the Suffixes 3 ana 2 nana ----------------> 1 anana 3 ana alphabetically 0 banana 4 na 4 na 5 a 2 nana The suffix array for "banana" is {5, 3, 1, 0, 4, 2}
Мы обсудили наивный алгоритм построения суффиксного массива . Наивный алгоритм состоит в том, чтобы рассмотреть все суффиксы, отсортировать их с помощью алгоритма сортировки O (nLogn) и при сортировке поддерживать исходные индексы. Временная сложность алгоритма Наивный составляет O (n 2 Logn), где n — количество символов во входной строке.
В этом посте обсуждается алгоритм O (nLogn) для построения массива суффиксов. Давайте сначала обсудим алгоритм O (n * Logn * Logn) для простоты. Идея состоит в том, чтобы использовать тот факт, что строки, которые должны быть отсортированы, являются суффиксами одной строки.
Сначала мы сортируем все суффиксы по первому символу, затем по первым 2 символам, затем по первым 4 символам и т. Д., В то время как количество символов, которые нужно рассмотреть, меньше 2n. Важным моментом является то, что если мы отсортировали суффиксы по первым 2 символам i , то мы можем отсортировать суффиксы по первым 2 i + 1 символам за O (nLogn), используя алгоритм сортировки nLogn, такой как Merge Sort. Это возможно, поскольку два суффикса можно сравнить за время O (1) (нам нужно сравнить только два значения, см. Пример и код ниже).
Функция сортировки называется O (Logn) раз (обратите внимание, что мы увеличиваем количество символов, которое должно учитываться в степени 2). Поэтому общая временная сложность становится O (nLognLogn). См. Http://www.stanford.edu/class/cs97si/suffix-array.pdf для получения дополнительной информации.
Давайте построим суффиксный массив в примере строки «банан», используя приведенный выше алгоритм.
Сортировка по первым двум символам. Присвойте ранг всем суффиксам, используя значение ASCII первого символа. Простой способ присвоить ранг — сделать «str [i] — 'a'» для i-го суффикса strp []
Index Suffix Rank 0 banana 1 1 anana 0 2 nana 13 3 ana 0 4 na 13 5 a 0
Для каждого символа мы также сохраняем ранг следующего смежного символа, т. Е. Ранг символа в str [i + 1] (это необходимо для сортировки суффиксов по первым 2 символам). Если символ является последним, мы сохраняем следующий ранг как -1
Index Suffix Rank Next Rank 0 banana 1 0 1 anana 0 13 2 nana 13 0 3 ana 0 13 4 na 13 0 5 a 0 -1
Сортировка всех суффиксов в соответствии с рангом и смежным рангом. Ранг считается первой цифрой или MSD, а соседний ранг считается второй цифрой.
Index Suffix Rank Next Rank 5 a 0 -1 1 anana 0 13 3 ana 0 13 0 banana 1 0 2 nana 13 0 4 na 13 0
Сортировать по первым четырем символам
Присвойте новые ранги всем суффиксам. Чтобы назначить новые ранги, мы рассмотрим отсортированные суффиксы один за другим. Присвойте 0 как новый ранг первому суффиксу. Для присвоения рангов оставшимся суффиксам мы рассматриваем пару рангов суффикса непосредственно перед текущим суффиксом. Если предыдущая пара рангов суффикса такая же, как предыдущий ранг суффикса непосредственно перед ним, тогда присвойте ему тот же ранг. В противном случае присваивайте ранг предыдущего суффикса плюс один.
Index Suffix Rank 5 a 0 [Assign 0 to first] 1 anana 1 (0, 13) is different from previous 3 ana 1 (0, 13) is same as previous 0 banana 2 (1, 0) is different from previous 2 nana 3 (13, 0) is different from previous 4 na 3 (13, 0) is same as previous
Для каждого суффикса str [i] также храните ранг следующего суффикса в str [i + 2]. Если в i + 2 нет следующего суффикса, мы сохраняем следующий ранг как -1
Index Suffix Rank Next Rank 5 a 0 -1 1 anana 1 1 3 ana 1 0 0 banana 2 3 2 nana 3 3 4 na 3 -1
Сортировка всех суффиксов в соответствии с рангом и следующим рангом.
Index Suffix Rank Next Rank 5 a 0 -1 3 ana 1 0 1 anana 1 1 0 banana 2 3 4 na 3 -1 2 nana 3 3
|
Джава
|
Выход:
Following is suffix array for banana 5 3 1 0 4 2
Обратите внимание, что в приведенном выше алгоритме используется стандартная функция сортировки, поэтому временная сложность равна O (nLognLogn). Мы можем использовать Radix Sort, чтобы уменьшить сложность времени до O (nLogn).
Обратите внимание, что суффиксные массивы также могут быть созданы за O (n) время. Мы скоро будем обсуждать O (n) алгоритмы.
Ссылки:
http://www.stanford.edu/class/cs97si/suffix-array.pdf
http://www.cbcb.umd.edu/confcour/Fall2012/lec14b.pdf
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Алгоритм Касая для построения массива LCP из суффиксного массива
- Suffix Tree Application 4 — построение линейного суффиксного массива времени
- Алгоритм Бойера Мура | Good Suffix эвристический
- Суффикс Массив | Комплект 1 (Введение)
- Подсчет k-мер по суффиксному массиву
- Подсчет отдельных подстрок строки с использованием Suffix Array
- LCA для общих или n-арных деревьев (подход Sparse Matrix DP)
- Алгоритм Z (Алгоритм поиска по линейному времени)
- Самый длинный префикс, который также является суффиксом
- Обобщенное дерево суффиксов 1
- Поиск по шаблону с использованием дерева суффиксов
- Построение Суффикса Укконена — Часть 2
- Построение суффикс-дерева Укконена — часть 1
- Построение Суффикса Укконена — Часть 3
- Построение Суффикса Укконена — Часть 6
0.00 (0%) 0 votes