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.
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 .
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 #.
Siruri de caractere | |
---|---|
Măsuri de similitudine a șirurilor | |
Căutare subșir | |
palindromuri | |
Alinierea secvenței | |
Structuri de sufix | |
Alte |