Суффиксный массив — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Поиск строки максимальной длины, ветвящейся влево и вправо 1.0)
(Поиск строки максимальной длины, ветвящейся влево и вправо)
Строка 16: Строка 16:
 
* Позволяет найти наименьший циклический сдвиг строки за время <tex>O(|s| \log(|s|))</tex>.
 
* Позволяет найти наименьший циклический сдвиг строки за время <tex>O(|s| \log(|s|))</tex>.
 
* Позволяет найти максимальную по длине строку, ветвящуюся влево и вправо за время <tex>SA + O(n)</tex>, где <tex>SA</tex> {{---}} время построения суффиксного массива.
 
* Позволяет найти максимальную по длине строку, ветвящуюся влево и вправо за время <tex>SA + O(n)</tex>, где <tex>SA</tex> {{---}} время построения суффиксного массива.
 
===Поиск строки максимальной длины, ветвящейся влево и вправо===
 
{{Определение
 
|definition=
 
'''Строка <tex>s</tex> называется ветвящейся вправо в <tex>t</tex>''' (англ. ''right branching string''), если существуют символы <tex>c</tex> и <tex>d</tex>, такие что <tex>c</tex> <tex>\ne</tex> <tex>d</tex> : <tex>sc</tex> и <tex>sd</tex> {{---}} подстроки <tex>t</tex>. Аналогично, '''ветвящаяся влево''' (англ. ''left branching''), если <tex>cs</tex> и <tex>ds</tex> {{---}} подстроки <tex>t</tex>.
 
}}
 
{{Определение
 
|definition=
 
'''Левый символ''' для позиции <tex>i</tex> строки <tex>S</tex> {{---}} это символ <tex>S(i-1)</tex>.
 
}}
 
 
Что бы найти максимальную строку, ветвящуюся влево и вправо, строится суффиксный массив из которого исключается суффикс равный самой строке, к примеру для строки <tex>aabcabd</tex> :
 
{| class="wikitable" border = 1
 
|-
 
!Суффиксный массив
 
|- style = "text-align = right"
 
| 1 |<tex>abcabd</tex>
 
|-
 
| 2 |<tex>abd</tex>
 
|-
 
| 3 |<tex>bcabd</tex>
 
|-
 
| 4 |<tex>bd</tex>
 
|-
 
| 5 |<tex>cabd</tex>
 
|-
 
| 6 |<tex>d</tex>
 
|}
 
 
Далее вычисляется <tex>LCP</tex> для суффиксного массива, и находятся левые символы суффиксов:
 
{| class="wikitable" border = 1
 
|-
 
!Левый символ
 
!Суффиксный массив
 
!LCP
 
|- style = "text-align = center"
 
| 1 |<tex>a</tex>||<tex>abcabd</tex>||<tex>\#</tex>
 
|-
 
| 2 |<tex>c</tex>||<tex>abd</tex>||<tex>2</tex>
 
|-
 
| 3 |<tex>a</tex>||<tex>bcabd</tex>||<tex>0</tex>
 
|-
 
| 4 |<tex>a</tex>||<tex>bd</tex>||<tex>1</tex>
 
|-
 
| 5 |<tex>b</tex>||<tex>cabd</tex>||<tex>0</tex>
 
|-
 
| 6 |<tex>b</tex>||<tex>d</tex>||<tex>0</tex>
 
|}
 
Максимальная строка, ветвящаяся влево и вправо, находится путём проверки значений <tex>LCP</tex> и левого символа:
 
Ветвление вправо:
 
*Если <tex>LCP</tex> от пары суффиксов <tex>s_1</tex> и <tex>s_2</tex> больше нуля и не равен длинам этих суффиксов, то строка <tex>s</tex>, равная <tex>s_1[1..LCP(s_1,s_2)]</tex>, ветвится вправо.
 
Ветвление влево:
 
*Если левые символы <tex>s_1</tex> и <tex>s_2</tex> не равны, то строка <tex>s</tex>, равная <tex>s_1[1..LCP(s_1,s_2)]</tex>, ветвится влево.
 
 
Если выполнены оба условия, то строка ветвится вправо и влево.
 
С помощью этой проверки находится максимальная строка, ветвящаяся влево и вправо, за <tex>O(n)</tex>.
 
  
 
==См. также==
 
==См. также==

Версия 22:48, 26 мая 2015

Определение:
Cуффиксным массивом (англ. suffix array) строки [math]s[1 .. n][/math] называется массив [math]suf[/math] целых чисел от [math]1[/math] до [math]n[/math], такой, что суффикс [math]s[suf[i]..n][/math][math]i[/math]-й в лексикографическом порядке среди всех непустых суффиксов строки [math]s[/math].


Пример

[math]s = abacaba[/math]

SuffixArray.png

Значит, суффиксный массив для строки [math]s[/math] равен [math][7, 5, 1, 3, 6, 2, 4][/math].

Применения

  • Позволяет найти все вхождения образца [math]p[/math] в строку [math]s[/math] за время [math]O(|p| + \log(|s|))[/math].
  • Позволяет вычислить наибольший общий префикс (англ. longest common prefix, LCP) для всех соседних в лексикографическом порядке суффиксов строки [math]s[/math] за [math]O(|s|)[/math], то есть построить массив [math]LCP[1 .. |s| - 1][/math], где [math]LCP[i][/math] — длина наибольшего общего префикса суффиксов [math]s[suf[i] .. |s|][/math] и [math]s[suf[i + 1] .. |s|][/math].
  • Позволяет найти количество различных подстрок в строке за время [math]O(|s| \log(|s|))[/math] и [math]O(|s|)[/math] дополнительной памяти.
  • Позволяет найти наименьший циклический сдвиг строки за время [math]O(|s| \log(|s|))[/math].
  • Позволяет найти максимальную по длине строку, ветвящуюся влево и вправо за время [math]SA + O(n)[/math], где [math]SA[/math] — время построения суффиксного массива.

См. также

Источники