COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Metin algoritmaları · 40 / 53

Rabin–Karp ve Aho–Corasick

Anla → iz sür → uygula → gerekçelendir

2 dk okuma · uygulama için ayrıca zaman ayır

Rabin–Karp rolling hash ile sabit uzunluktaki pencereleri karşılaştırır. Eski karakterin katkısını çıkar, tabanla kaydır, yeni karakteri ekle ve modulo uygula. Hash eşitliği gerçek eşleşme kanıtı değildir. Doğrudan substring kontrolü deterministic doğruluğu sağlar fakat kötü collision durumunda maliyet artar; double hashing olasılığı düşürür, sıfırlamaz.

Aho–Corasick birçok pattern'ı trie'a koyar, failure links ile bir mismatch sonrası en uzun uygun suffix durumuna geçer. Output links terminal pattern'ları raporlar; sadece mevcut düğümün terminalini kontrol etmek suffix pattern'ları kaçırır. BFS, failure links'i önce daha kısa durumlar hazır olacak sırada kurar.

Rabin–Karp aynı uzunluktaki birçok pattern için hash bucket'larıyla kullanılabilir; değişken uzunluk başka maliyetler yaratır. Aho–Corasick toplam pattern uzunluğu ve gerçek çıktı sayısıyla analiz edilir. Bir küfür filtresinde normalization ve boundary politikası false positive'ları belirler; algoritma etik/dilsel kararları kendiliğinden çözmez.

Adım adım iz sürme

Patterns he,she,hers: she okununca hem she hem suffix he raporlanır. Failure/output ilişkisi bu ikinci match'i taşır.

Maliyet ve varsayımlar

Verified Rabin–Karp worst O(nm); Aho uygun transition temsiliyle O(toplam pattern uzunluğu+n+çıktı).

Çalıştırılabilir örnek

Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.

Python 3
def rolling_hashes(text, width, base=257, mod=1000000007):
    if not 1 <= width <= len(text): return []
    high=pow(base,width-1,mod); h=0
    for c in text[:width]: h=(h*base+ord(c))%mod
    result=[h]
    for i in range(width,len(text)):
        h=((h-ord(text[i-width])*high)*base+ord(text[i]))%mod
        result.append(h)
    return result
assert len(rolling_hashes("ababa",3)) == 3

KAVRADIĞINI KONTROL ET

Sıra sende

Hash eşitliğinde gerçek karakter kontrolü yapılmazsa ne tür algoritma?

Çözümün mantığını göster

Collision yüzünden yanlış eşleşme ihtimali olan Monte Carlo yaklaşım. Doğruluk garantisini probabilistic olarak belirtmek gerekir.

Bir adım ileri

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.

Temel kaynaklar ve ders notları

Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.

Princeton · Algorithms, Sedgewick & Wayne ↗
İlerlemeden önce alıştırmayı çöz.