Funkce z řetězce je pole takové, že se rovná délce nejdelší společné předpony začínající na pozici přípony řetězce a samotného řetězce . Konstrukční algoritmus popsal Dan Gasfield ve své knize Strings, Trees and Sequences in Algorithms. Computer Science and Computational Biology“ v roce 1997 [1] na základě práce Mainea a Lorenze z roku 1984 [2] o nalezení všech tandemových opakování v řetězci.
Funkce Z se používá v různých algoritmech zpracování řetězců. Zejména jej lze použít k rychlému vyřešení problému s nalezením výskytu jednoho řetězce v jiném ( vyhledávání podle vzoru ).
Budeme ukládat indexy L a R , označující začátek a konec prefixu s největší dosud zjištěnou hodnotou R . Zpočátku .
Dejte nám vědět hodnoty Z -funkce pro pozice 1… i − 1. Zkusme vypočítat hodnotu Z -funkce pro pozici i . Pokud , zvažte hodnotu funkce Z pro pozici . If , then , protože jsme v podřetězci, který odpovídá prefixu celého řetězce. Jestliže , pak je nutné vypočítat hodnotu Z [ i ] jednoduchou smyčkou, která prochází znaky za R , dokud se neobjeví znak, který neodpovídá odpovídajícímu znaku z předpony. Poté změníme hodnotu L na i a hodnotu R na číslo posledního znaku, který odpovídá odpovídajícímu znaku z prefixu.
Jestliže , pak považujeme hodnotu Z [ i ] za jednoduchou smyčku, která porovnává znaky podřetězce začínající i -tým znakem a odpovídající znaky z prefixu. Když je nalezena neshoda nebo je dosaženo konce řádku, změňte hodnotu L na i a hodnotu R na číslo posledního znaku, který odpovídá odpovídajícímu znaku z předpony.
Doba běhu algoritmu, který vypočítává hodnotu Z -funkce řetězce S , se odhaduje na . Pojďme to dokázat.
Uvažujme i -tý znak řetězce. V algoritmu se bere v úvahu maximálně dvakrát: poprvé, když spadá do segmentu , a podruhé při výpočtu Z [ i ].
Smyčka tedy nezpracovává více než iterace.
1) Funkci Z lze použít k vyhledání vzoru T v řetězci S ,
2) Se znalostí Z - funkce řetězce lze jednoznačně obnovit prefixovou funkci tohoto řetězce a naopak.
Struny | |
---|---|
Míry podobnosti řetězců | |
Hledání podřetězců | |
palindromy | |
Sekvenční zarovnání | |
Struktury přípon | |
jiný |