Algoritmul lui Manaker

Algoritmul lui Manaker
scop Căutați subpalindromuri
Structură de date Linia
cel mai rău moment
Costul memoriei

Algoritmul lui Manacher este un  algoritm cu timp de rulare liniar care vă permite să obțineți informații despre toate subșirurile palindromice ale unui șir dat într-o formă comprimată . Introdus de Glenn Manaker în 1975. Sarcina inițială rezolvată de algoritm a fost găsirea celui mai mic prefix-palindrom al unui șir dat, dar structura obținută ca urmare a funcționării algoritmului permite rezolvarea unor probleme mai generale. Deci, Manaker a demonstrat că algoritmul vă permite să verificați dacă un șir poate fi reprezentat sub forma , unde  — un șir  — este inversarea acestuia. În 1995, Apostolico, Breslauer și Galil au subliniat că, prin proiectare, algoritmul lui Manaker nu numai că găsește cel mai scurt prefix palindromic, dar găsește și raza maximă a palindromului pentru fiecare centru posibil al unui subșir palindromic.

Enunțul problemei

Algoritmul lui Manaker vă permite să găsiți în timp liniar razele maxime ale palindromurilor pare și impare la fiecare poziție a șirului .

Implementare

Mai jos este implementarea algoritmului în Python .

def manager_odd ( s ): s = '$' + s + '^' n = len ( s ) res = [ 0 ] * n l = 0 r = 0 pentru i în interval ( 1 , n - 1 ): res [ i ] = max ( 0 , min ( r - i , res [ l + ( r - i )])) în timp ce s [ i - res [ i ]] == s [ i + res [ i ]]: res [ i ] += 1 dacă i + res [ i ] > r : l = i - res [ i ] r = i + res [ i ] return res [ 1 : - 1 ] def manacher ( s ): res = manacher_odd ( '#' + '#' . join ( s ) + '#' )[ 1 : - 1 ] return ([ x // 2 pentru x în res [:: 2 ]] , [ x // 2 pentru x în res [ 1 :: 2 ]])

Funcția manacher_oddreturnează un tablou Manaker pentru palindromurile de lungime impară, funcția manacherreturnează o pereche de tablouri Manaker pentru palindromurile de lungimi impare și, respectiv, reducând calculul unui tablou pentru lungimi pare la un caz impar prin adăugarea unui caracter de serviciu #.

Literatură