COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Ağaçlar ve indeksler · 21 / 53

Trie, radix tree ve autocomplete

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

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

Trie bir anahtarın karakterlerini/bitlerini adım adım dallara dönüştürür. Kelime sonu işareti önemlidir: “car” prefix'i bulunması onun kayıtlı tam kelime olduğunu göstermez. Autocomplete önce prefix düğümünü bulur, sonra alt ağacı gezer. Sonuç sayısı ve toplam çıktı uzunluğu maliyete dahildir.

Her düğümde bütün alfabe için dizi tutmak hızlı ama seyrek veride pahalıdır; dictionary çocukları daha esnek olabilir. Radix/Patricia tree tek çocuklu yolları kenar etiketlerinde sıkıştırır. Silme kelime sonunu kaldırır ve başka kelimeye ait olmayan düğümleri budar.

Unicode'da karakter, code point ve grapheme aynı değildir; case folding ve normalization sözleşmesi belirle. “İ” ve “i” dil farkıyla eşleşir. En popüler önerileri bulmak için sadece alfabetik DFS yetmez: frekans metadata, top-k cache veya priority structure gerekir. Trie ile hash map maliyetini anahtar uzunluğu L üzerinden karşılaştır.

Adım adım iz sürme

car,cart,cat: c→a ortaktır; r düğümü terminal ve t çocuğu da terminaldir. ca prefix'i üç sonuç verir.

Maliyet ve varsayımlar

Sabit çocuk erişimiyle insert/search O(L); autocomplete O(prefix uzunluğu + gezilen/çıktı boyutu).

Ç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
END = object()
root = {}
for word in ["car", "cart", "cat"]:
    node = root
    for c in word: node = node.setdefault(c, {})
    node[END] = True

def contains(word):
    node = root
    for c in word:
        if c not in node: return False
        node = node[c]
    return END in node
assert contains("car") and not contains("ca")

KAVRADIĞINI KONTROL ET

Sıra sende

Boş string desteklenecekse terminal nerede durur?

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

Root üzerinde. Boş anahtar da sözleşmenin parçasıdır; bazı implementasyonlar reddeder, bazıları root terminalini kullanır.

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 ↗Pat Morin · Open Data Structures ↗
İlerlemeden önce alıştırmayı çöz.