Manakerin algoritmi

Manakerin algoritmi
tarkoitus Etsi subpalindromeja
Tietorakenne Linja
pahin aika
Muistin hinta

Manacherin algoritmi on  algoritmi , jonka ajoaika on lineaarinen ja jonka avulla voit saada tietoa tietyn merkkijonon kaikista palindromisista osamerkkijonoista pakatussa muodossa . Esitteli Glenn Manaker vuonna 1975. Algoritmin ratkaisemana lähtötehtävänä oli löytää tietyn merkkijonon pienin etuliite-palindromi, mutta algoritmin toiminnan tuloksena saatu rakenne mahdollistaa yleisempien ongelmien ratkaisemisen. Joten Manaker osoitti, että algoritmin avulla voit tarkistaa, voidaanko merkkijono esittää muodossa , jossa  - jokin merkkijono  - on sen käänteinen. Vuonna 1995 Apostolico, Breslauer ja Galil huomauttivat, että Manakerin algoritmi ei vain löydä lyhimmän palindromisen etuliitettä, vaan myös löytää palindromin suurimman säteen kullekin mahdolliselle palindromisen osajonon keskipisteelle.

Ongelman selvitys

Manaker-algoritmin avulla voit löytää lineaarisessa ajassa parillisten ja parittomien palindromien enimmäissäteet merkkijonon kussakin kohdassa .

Toteutus

Alla on algoritmin toteutus Pythonissa .

def manager_odd ( s ): s = '$' + s + '^' n = len ( s ) res = [ 0 ] * n l = 0 r = 0 i :lle alueella ( 1 , n - 1 ) : res [ i ] = max ( 0 , min ( r - i , res [ l + ( r - i )])) kun taas s [ i - res [ i ]] == s [ i + res [ i ]]: res [ i ] ] += 1 jos i + res [ i ] > r : l = i - res [ i ] r = i + res [ i ] palauttaa res [ 1 : - 1 ] def manacher ( s ): res = manacher_odd ( '#' + '#' . join ( s ) + '#' )[ 1 : - 1 ] return ([ x // 2 for x in res [:: 2 ]] , [ x // 2 for x in res [ 1 :: 2 ]])

Funktio manacher_oddpalauttaa Manaker-taulukon parittoman pituisille palindromeille, funktio manacherpalauttaa parittoman ja parillisen pituisille palindromeille Manaker-taulukon, mikä vähentää parillisten pituuksien taulukon laskennan parittomaan tapaukseen lisäämällä palvelumerkin #.

Kirjallisuus