Funcția z a unui șir este o matrice astfel încât este egală cu lungimea celui mai lung prefix comun, începând de la poziția sufixului șirului și a șirului în sine . Algoritmul de construcție a fost descris de Dan Gasfield în cartea sa Strings, Trees and Sequences in Algorithms. Computer Science and Computational Biology” în 1997 [1] pe baza lucrării lui Maine și Lorenz din 1984 [2] privind găsirea tuturor repetăților în tandem într-un șir.
Funcția Z este utilizată în diverși algoritmi de procesare a șirurilor. În special, poate fi folosit pentru a rezolva rapid problema găsirii unei apariții a unui șir în altul ( căutare după model ).
Vom stoca indicii L și R , notând începutul și sfârșitul prefixului cu cea mai mare valoare R găsită până acum . Initial .
Aflați-ne valorile funcției Z pentru pozițiile 1… i − 1. Să încercăm să calculăm valoarea funcției Z pentru poziția i . Dacă , luați în considerare valoarea funcției Z pentru poziția . Dacă , atunci , deoarece ne aflăm într-un subșir care se potrivește cu prefixul întregului șir. Dacă , atunci este necesar să se calculeze valoarea lui Z [ i ] printr-o buclă simplă care trece prin caracterele după R până când apare un caracter care nu se potrivește cu caracterul corespunzător din prefix. După aceea, schimbăm valoarea lui L în i și valoarea lui R cu numărul ultimului caracter care se potrivește cu caracterul corespunzător din prefix.
Dacă , atunci considerăm valoarea lui Z [ i ] ca o simplă buclă care compară caracterele subșirului începând cu caracterul i -lea și caracterele corespunzătoare din prefix. Când se găsește o nepotrivire sau se ajunge la sfârșitul liniei, schimbați valoarea lui L la i și valoarea lui R la numărul ultimului caracter care se potrivește cu caracterul corespunzător din prefix.
Timpul de rulare al algoritmului care calculează valoarea funcției Z a șirului S este estimat la . Să demonstrăm.
Luați în considerare caracterul i --lea al șirului. În algoritm, este considerat nu mai mult de două ori: prima dată când cade în segment și a doua oară când se calculează Z [ i ].
Astfel, bucla nu procesează mai mult decât iterații.
1) Funcția Z poate fi folosită pentru a căuta un model T într-un șir S ,
2) Cunoscând funcția Z a unui șir, se poate restabili în mod unic funcția-prefix a acestui șir și invers.
Siruri de caractere | |
---|---|
Măsuri de similitudine a șirurilor | |
Căutare subșir | |
palindromuri | |
Alinierea secvenței | |
Structuri de sufix | |
Alte |