Zadanie 4: Algorytm Aho-Corasick - aho_corasick_algorithm
(3 pkt)
Zaimplementuj algorytm Aho-Corasick do jednoczesnego wyszukiwania wielu wzorców:
from collections import deque
from typing import List, Tuple, Optional
class AhoCorasickNode:
"""Klasa reprezentująca węzeł w drzewie Aho-Corasick."""
def __init__(self):
"""Inicjalizuje węzeł drzewa."""
self.goto = {} # Przejścia do innych węzłów
self.fail: Optional[AhoCorasickNode] = None # Wskaźnik fail
self.output: List[str] = [] # Lista wzorców kończących się w tym węźle
class AhoCorasick:
"""Klasa implementująca algorytm Aho-Corasick."""
def __init__(self, patterns: List[str]):
"""
Inicjalizuje automat Aho-Corasick dla podanych wzorców.
Args:
patterns: Lista wzorców do wyszukiwania
"""
pass
def _build_trie(self):
"""
Buduje drzewo trie dla podanych wzorców.
"""
pass
def _build_failure_links(self):
"""Buduje wskaźniki fail dla automatu."""
pass
def search(self, text: str) -> List[Tuple[int, str]]:
"""
Wyszukuje wszystkie wzorce w tekście.
Args:
text: Tekst do przeszukania
Returns:
Lista krotek (pozycja, wzorzec), gdzie pozycja to indeks początku wzorca w tekście
"""
pass
Twoje zadanie:
- Zaimplementuj klasę AhoCorasickNode reprezentującą węzeł w drzewie Aho-Corasick
- Zaimplementuj klasę AhoCorasick z metodami do budowy automatu i wyszukiwania wzorców
- Metoda build_trie powinna tworzyć drzewo trie dla podanych wzorców
- Metoda build_failure_links powinna tworzyć wskaźniki fail dla automatu
- Metoda search powinna wyszukiwać wszystkie wzorce w tekście
- Obsłuż przypadki brzegowe (puste wzorce, pusty tekst)
Przykład:
patterns = ["he", "she", "his", "hers"]
text = "ushers"
Wynik: [(1, "she"), (2, "he"), (3, "hers")]
Last updated on