COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Metin algoritmaları · 41 / 53

Suffix array, LCP, suffix tree ve FM-index

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

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

Suffix array bir metnin bütün suffix başlangıç indekslerini lexicographic sırada tutar. Suffix'leri tam string kopyasıyla üretmek quadratic bellek doğurabilir; indeks tabanlı construction gerekir. Doubling yaklaşımı 1,2,4… uzunluk rank çiftlerini sıralar; radix sıralamalı varyant O(n log n) olabilir, comparison sort'lu aşamalar farklı sınır verir.

LCP komşu suffix'lerin ortak prefix uzunluğudur. Kasai algoritması önceki eşleşmeden en fazla bir karakter azaltarak toplam doğrusal tarama sağlar. Repeated substring ve distinct substring sayısı LCP üzerinden çıkar. Suffix tree sıkıştırılmış trie yapısıdır; linear construction mümkündür ama uygulaması ve edge-label sözleşmesi zordur.

BWT ve FM-index backward search ile sıkıştırılmış metin indeksleme yapar; rank/select yapıları önemlidir. “DNA'da göz kırpma süresi” diye sabit süre iddiası doğru değildir: pattern uzunluğu, output sayısı, disk/cache ve index türü belirleyicidir. Suffix automaton da substring state'lerini end-position eşdeğerliğine göre temsil eden ayrı güçlü bir yapıdır.

Adım adım iz sürme

banana suffix sırası a,ana,anana,banana,na,nana → indeks[5,3,1,0,4,2]. ana iki suffix'in prefix'i olduğu için iki match verir.

Maliyet ve varsayımlar

Suffix array O(n) indeks alanı; basit binary pattern search O(m log n), LCP-aware varyantlar iyileştirir.

Ç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
# Small-input oracle, NOT an efficient construction algorithm.
def suffix_array_oracle(text):
    return sorted(range(len(text)),key=lambda i:text[i:])
assert suffix_array_oracle("banana") == [5,3,1,0,4,2]

KAVRADIĞINI KONTROL ET

Sıra sende

Bu oracle neden büyük metinde production çözümü değil?

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

Key fonksiyonu bütün suffix'leri kopyalar; toplam karakter sayısı Θ(n²). Eğitim referansını optimized construction ile karıştırma.

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.

MIT 6.046J · Design and Analysis ↗
İlerlemeden önce alıştırmayı çöz.