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.
Manaker-algoritmin avulla voit löytää lineaarisessa ajassa parillisten ja parittomien palindromien enimmäissäteet merkkijonon kussakin kohdassa .
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 #.
jouset | |
---|---|
Merkkijonojen samankaltaisuusmitat | |
Alimerkkijonohaku | |
palindromit | |
Jakson tasaus | |
Suffiksirakenteet | |
Muut |