Префикс-функция — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
Строка 25: Строка 25:
 
==Псевдокод==
 
==Псевдокод==
 
   '''Prefix_function''' (<tex>s</tex>)
 
   '''Prefix_function''' (<tex>s</tex>)
       <tex> pi \leftarrow 0</tex>
+
       pi = 0
       '''for''' <tex>i \leftarrow 1</tex> '''to''' <tex>n</tex>
+
       '''for''' i = 1 '''to''' n
           '''for''' <tex>j \leftarrow 1</tex> '''to''' <tex>i - 1</tex>
+
           '''for''' j = 1 '''to''' i - 1
                 '''if''' <tex>s[1..j] = s[i - j + 1..i]</tex>
+
                 '''if''' s[1..j] == s[i - j + 1..i]
                     <tex> pi[i] \leftarrow j</tex>
+
                     pi[i] = j
       '''return''' <tex>pi</tex>
+
       '''return''' pi
  
 
==Время работы==
 
==Время работы==

Версия 13:41, 4 апреля 2012

Префикс-функция строки [math]s[/math] — функция [math]\pi(i) = max \{ j | j \lt i,[/math] [math]s[1..j] = s[i - j + 1..i] \}[/math].

Алгоритм

Наивный алгоритм вычисляет префикс функцию непосредственно по определению, сравнивая префиксы и суффиксы строк.

Пример

Рассмотрим строку abcabcd, для которой значение префикс-функции равно [math][0,0,0,1,2,3,0][/math].

Шаг Строка Значение функции
[math]1[/math] a 0
[math]2[/math] ab 0
[math]3[/math] abc 0
[math]4[/math] abca 1
[math]5[/math] abcab 2
[math]6[/math] abcabc 3
[math]7[/math] abcabcd 0

Псевдокод

 Prefix_function ([math]s[/math])
      pi = 0
      for i = 1 to n
          for j = 1 to i - 1
               if s[1..j] == s[i - j + 1..i]
                    pi[i] = j
      return pi

Время работы

Всего [math]O(n^2)[/math] итераций цикла, на каждой из который происходит сравнение строк за [math]O(n)[/math], что дает в итоге [math]O(n^3)[/math].

Литература

Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.