Základy algoritmizace Pattern matching 1
Pattern matching Úloha nalézt v nějakém textu výskyty zadaných textových vzorků patří v počítačové praxi k nejfrekventovanějším. Algoritmy, které ji řeší se používají mimo jiné: V textových editorech V utilitách typu grep (OS Linux), které umožňují najít všechny výskyty zadaných vzorků v množině textových souborů V rešeršních systémech Při analýze obrazu, zvuku 2
Pattern matching Vyhledávání v textu je operace, při které se zjišťuje, zda-li daný text (řetězec) obsahuje zadané části textu vzorky (vzory). Pokud ano, zajímá nás kde se v zadaném textu vzorky vyskytují. Byla navržena celá řada algoritmů, jak tento problém řešit. Tyto vyhledávací algoritmy se někdy nazývají vyhledávací stroje. 3
Rozdělení algoritmů 4
Rozdělení algoritmů I. Elementární algoritmus II. Vyhledávací stroje III. Indexové metody IV. Signaturové metody 5
Další kritéria Počet hledaných vzorků Počet výskytů (jeden, všechny) Způsob porovnávání Důležitost znaků (zástupné znaky) Směr vyhledávání 6
Definice 7
Označení 8
Elementární algoritmus 9
Implementace 10
Příklad 11
12
Morris-Prattův algoritmus 13
MP algoritmus (pokračování) Předpona v vzorku x bude odpovídat příponě textu y. Nejdelší taková předpona se nazývá hranicí oba konce u. Tabulka Next udává největší možný posun. 14
Implementace 15
Implementace 16
Příklad 17
18
Knuth-Morris-Prattův algoritmus 19
KMP-algoritmus Vylepšená verze MP-algoritmu Zabráníme okamžité neshodě po předponě v 20
Implementace 21
22
Příklad MP-algoritmus 23
24
Shift-Or algoritmus 25
Shift-Or algoritmus Rychlý a snadno hardwarově implementovatelný. Nechť vzor V=v 1...v M je definován nad abecedou A=a 1,.,a C. Definujme incidenční matici X o rozměrech M*C, kde x ij =0 pokud v i =a j a x ij =1 jindy. Každý sloupec matice X je tvořen M- bitovým binárním řetězcem (ozn. A j ). Algoritmus pracuje s M-bitovými binárním řetězci R. Na začátku je R= 1 1.. 1 Základy algoritmizace, letní semestr 2001/2002 26
Shift-Or algoritmus V každém kroku se řetězec R posune o jednu pozici dolů (horní pozice se naplní nulou) a přečte ze vstupu jeden znak textu. Pokud byl přečtený znak textu roven a j, Výsledek posunu se zkombinuje s řetězcem A j pomocí binární disjunkce. Přechodová funkce je def: (R, a j )=SHIFT(R) or A j Vyhledávání končí úspěšně, pokud se na dolní pozici řetězce R dostane nula. Základy algoritmizace, letní semestr 2001/2002 27
Shift-Or algoritmus - příklad Nechť vzor V= vzorek je definován nad abecedou A={e,k,o,r,v,z,*}, kde znak * zastupuje libovolný znak nevyskytující se ve vzorku. e k o r v z * v 1 1 1 1 0 1 1 z 1 1 1 1 1 0 1 = o 1 1 0 1 1 1 1 r 1 1 1 0 1 1 1 e 0 1 1 1 1 1 1 k 1 0 1 1 1 1 1 Základy algoritmizace, letní semestr 2001/2002 28
Shift-Or algoritmus - příklad sart v y h l e d a t v z o r e k v 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 z 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 R= o 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 r 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 e 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 k 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Více informací např.: http://www-igm.univ-mlv.fr/~lecroq/string/node6.html Základy algoritmizace, letní semestr 2001/2002 29
Implementace 30
31
Příklad 2 32
Rabin-Karp Nejprve pomocí hashování zjistí úsek zadaného textu (řetězce), který může být stejný jako hledaný vzor - hash hodnoty vzoru a určitého úseku v řetězci se shodují. Teprve v tomto případě dojde k porovnávání jednotlivých znaků vzoru a podřetězce. Na první pohled se algoritmus nemusí jevit efektivnější. Vhodně zvolenou hash funkcí lze však dosáhnout toho, že výpočet hash funkce podřetězce zadaného řetězce se nemusí provádět v každém kroku znovu. Dojde jen k odstranění vlivu prvního znaku a zahrnutí vlivu dalšího znaku z řetězce na výslednou hodnotu této funkce. Základy algoritmizace, letní semestr 2001/2002 33
Rabin-Karp Pro jednoduchost budeme hashovací funkci předpokládat ve tvaru součtu ordinálních čísel jednotlivých znaků. Přepočítání hash hodnoty porovnávaného podřetězce zadaného textu, pak provádíme odečtením ordinální hodnoty prvního znaku a přičtením ordinální hodnoty znaku, který v prohledávaném textu (řetězci) následuje za posledním znakem podřetězce. Základy algoritmizace, letní semestr 2001/2002 34
Rabin-Karp V nejhorším případě dosahuje složitost hodnoty O(M*N). V průměrném případě je složitost menší než složitost metody bruteforce. Složitost je značně ovlivněna volbou hashovací funkce, protože její hodnota rozhoduje o počtu porovnávání. Základy algoritmizace, letní semestr 2001/2002 35
Rabin-Karp - Algoritmus 1. Vypočítá se hash hodnota vzoru. 2. Za podřetězec se zvolí prvních M znaků řetězce, kde M je počet znaků vzoru. 3. Vypočítá se hash hodnota podřetězce. 4. Porovnají se výsledky obou hash hodnot. 5. Jsou-li hash hodnoty stejné, porovnávají se jednotlivé znaky vzoru se znaky podřetězce. V případě rovnosti všech znaků je hledaný vzor nalezen a algoritmus končí. Jinak se vypočítá hash hodnota nového podřetězce. Ten začíná druhým znakem aktuálního podřetězce a musí pochopitelně obsahovat M znaků. Algoritmus pokračuje bodem 3. Není-li potřebný počet znaků k dispozici, algoritmus končí, hledaný vzor není součástí řetězce. Základy algoritmizace, letní semestr 2001/2002 36
Rabin-Karp - příklad Vyhledejte vzor DAB v řetězci ABRAKADABRA. Pro znaky jsou dány následující ordinální hodnoty: ord(a) = 1, ord(b) = 2, ord(r) = 3, ord(k) = 4, ord(d) = 5. hash(d A B) = 8 A B R A K A D A B R A hash A B R 6 B R A 6 R A K 8 nastává porovnání znaků A K A 6 K A D 10 A D A 7 D A B 8 Základy algoritmizace, letní semestr 2001/2002 37
Boyer-Moore Základní myšlenka je založena na vyhledávání stejných znaků ve vzoru i podřetězci tak, aby se poslední znak podřetězce kryl se stejným znakem ve vzoru. Posunutí tedy nemusí probíhat, jako v předchozích metodách, o jeden znak, ale velikost posunutí je dána předem určenou hodnotou. Nejprve se pro všechny znaky vytvoří tabulka hodnot posunutí. Každá hodnota v tabulce udává pro daný znak jeho minimální vzdálenost od konce vzoru. Základy algoritmizace, letní semestr 2001/2002 38
Boyer-Moore Není-li znak ve vzoru obsažen, je mu přiřazena hodnota rovnající se délce vzoru. Porovnávání se pak děje na základě srovnávání jednotlivých znaků vzoru a podřetězce od M-té pozice, kde M je délka vzoru. Dojde-li během porovnávání k neshodě znaků, porovnávání se zastaví. Velikost posunutí je dána hodnotou z tabulky, odpovídající poslednímu znaku v podřetězci. V nejhorším případě je složitost O(NM). Hledání a n b v textu a m b Základy algoritmizace, letní semestr 2001/2002 39
Boyer-Moore - Algoritmus 1. Vypočítá se tabulka indexů pro jednotlivé znaky řetězce. 2. Za podřetězec zvolíme prvních M znaků řetězce. 3. Začneme porovnávat jednotlivé znaky vzoru a podřetězce od konce. 4. Jsou-li všechny znaky vzoru a podřetězce stejné, vzor je nalezen a algoritmus končí. 5. Jinak se z tabulky vybere hodnota posunutí pro poslední znak podřetězce. Tato hodnota udává velikost posunutí pozice prvního znaku nového podřetězce vůči aktuálnímu podřetězci. 6. Pokračujeme bodem 3 jen v případě, že délka nového podřetězce je stejná jako délka vzoru. Jinak vzor není nalezen a algoritmus končí. Základy algoritmizace, letní semestr 2001/2002 40
Boyer-Moore - Algoritmus Vyhledejte vzor DAB v řetězci ABRAKADABRA. Tabulka indexů posunutí bude mít pro jednotlivé znaky tyto hodnoty: A B R K D 1 3 3 3 2 A B R A K A D A B R A D A B D A B D A B D A B Základy algoritmizace, letní semestr 2001/2002 41