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ırTrie 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.
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
- Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
- Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
- 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 ↗