Manakers algoritm

Manakers algoritm
ändamål Sök efter subpalindromer
Datastruktur Linje
värsta tiden
Minneskostnad

Manachers algoritm är en algoritm med linjär körtid som  låter dig få information om alla palindromiska delsträngar av en given sträng i komprimerad form . Introducerad av Glenn Manaker 1975. Den initiala uppgiften som löstes av algoritmen var att hitta den minsta prefix-palindromen i en given sträng, men strukturen som erhålls som ett resultat av algoritmens funktion tillåter att lösa mer allmänna problem. Så, Manaker visade att algoritmen låter dig kontrollera om en sträng kan representeras i formen , där  - någon sträng  - är dess omkastning. 1995 påpekade Apostolico, Breslauer och Galil att Manakers algoritm inte bara hittar det kortaste palindromiska prefixet, utan också den maximala palindromradien för varje möjlig mittpunkt av en palindromisk delsträng.

Förklaring av problemet

Manakers algoritm låter dig hitta i linjär tid de maximala radierna för jämna och udda palindromer vid varje position av strängen .

Implementering

Nedan är implementeringen av algoritmen i Python .

def manager_odd ( s ): s = '$' + s + '^' n = len ( s ) res = [ 0 ] * n l = 0 r = 0 för i inom intervallet ( 1 , n - 1 ): res [ i ] = max ( 0 , min ( r - i , res [ l + ( r - i )])) medan s [ i - res [ i ]] == s [ i + res [ i ]]: res [ i ] += 1 om i + res [ i ] > r : l = i - res [ i ] r = i + res [ i ] returnera res [ 1 : - 1 ] def manacher ( s ): res = manacher_odd ( '#' + '#' . join ( s ) + '#' )[ 1 : -1 ] return ( [ x // 2 för x i res [:: 2 ]] , [ x // 2 för x i res [ 1 :: 2 ]])

Funktionen manacher_oddreturnerar en Manaker-matris för palindromer med udda längd, funktionen manacherreturnerar ett par Manaker-matriser för palindromer med udda respektive jämna längder, vilket reducerar beräkningen av en matris för jämna längder till ett udda fall genom att lägga till ett servicetecken #.

Litteratur