Z-toiminto

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 4. elokuuta 2021 tarkistetusta versiosta . vahvistus vaatii 1 muokkauksen .

Merkkijonon z-funktio on  matriisi , joka on yhtä suuri kuin pisimmän yhteisen etuliitteen pituus, joka alkaa merkkijonon päätepaikasta , ja itse merkkijono . Rakennusalgoritmin kuvaili Dan Gasfield kirjassaan Strings, Trees and Sequences in Algorithms. Computer Science and Computational Biology” vuonna 1997 [1] perustui Mainen ja Lorenzin vuoden 1984 artikkeliin [2] kaikkien tandemtoistojen löytämisestä merkkijonosta.

Z -funktiota käytetään useissa merkkijonojen käsittelyalgoritmeissa. Erityisesti sitä voidaan käyttää ratkaisemaan nopeasti ongelma, joka liittyy merkkijonon esiintymisen löytämiseen toisessa ( haku kuvion mukaan ).

Laskenta-algoritmi

Rivimerkit numeroidaan 0:sta alkaen.

Tallennamme indeksit L ja R , jotka osoittavat suurimman tähän mennessä löydetyn R -arvon etuliitteen alkua ja loppua . Aluksi .

Selvitetään Z -funktion arvot paikoille 1… i  − 1. Yritetään laskea Z -funktion arvo paikalle i . Jos , harkitse paikan Z - funktion arvoa . Jos , niin , koska olemme osamerkkijonossa, joka vastaa koko merkkijonon etuliitettä. Jos , niin Z [ i ]: n arvo on laskettava yksinkertaisella silmukalla, joka kulkee R :n jälkeisten merkkien läpi, kunnes löytyy merkki, joka ei vastaa vastaavaa etuliitteen merkkiä. Tämän jälkeen muutamme L :n arvon i :ksi ja R :n arvon viimeisen merkin numeroon, joka vastaa etuliitteen vastaavaa merkkiä.

Jos , niin katsomme Z :n [ i ] arvoa yksinkertaisena silmukana, joka vertaa i :nnellä merkillä alkavan osamerkkijonon merkkejä ja vastaavia etuliitteen merkkejä. Kun ristiriita löytyy tai rivin loppu on saavutettu, muuta L : n arvo i :ksi ja R :n arvoksi sen viimeisen merkin numero, joka vastaa etuliitteen vastaavaa merkkiä.

Työn nopeus

Merkkijonon S Z -funktion arvon laskevan algoritmin ajoaika on estimoitu . Todistetaan se.

Harkitse merkkijonon i -merkkiä. Algoritmissa sitä tarkastellaan enintään kahdesti: ensimmäisen kerran, kun se osuu segmenttiin ja toisen kerran laskettaessa Z [ i ].

Siten silmukka käsittelee vain iteraatioita.

Käyttöesimerkkejä

1) Z -funktiolla voidaan etsiä kuviota T merkkijonosta S ,

2) Tietäen merkkijonon Z -funktion, voidaan yksilöllisesti palauttaa tämän merkkijonon etuliitefunktio ja päinvastoin.

Toteutusesimerkki Pythonissa

def z_func ( s ): z = [ 0 ] * len ( t ) vasen , oikea = 0 , 0 i :lle alueella ( 1 , len ( t ) ): z [ i ] = max ( 0 , min ( z [ i - vasen ], oikea - i )) kun taas i + z [ i ] < len ( t ) ja s [ z [ i ]] == s [ i + z [ i ]]: z [ i ] += 1 jos i + z [ i ] > oikea : vasen , oikea = i , i + z [ i ] palauta z

Katso myös

Muistiinpanot

  1. Gusfield D. Algorithms on Strings, Trees ja Sequences  (eng.) : Computer Science and Computational Biology - Cambridge University Press , 1997. - 556 s. - ISBN 978-0-511-57493-1 - doi:10.1017/CBO9780511574931
  2. Main M. G., Lorentz R. J. O(n log n) -algoritmi merkkijonon kaikkien toistojen löytämiseksi  // Journal of Algorithms - Academic Press , 1984. - Voi. 5, Iss. 3. - s. 422-432. — ISSN 0196-6774 ; 1090-2678 - doi:10.1016/0196-6774(84)90021-X

Linkit