Bölüm 5: Trie Veri Yapısı
Çoktan Seçmeli · Trie Kavramı
Soru 1: Düğüm Sayısı
to, tea, ted, ten, i, in, inn kelimeleri boş bir trie'ye ekleniyor. Kök dahil trie'de kaç düğüm vardır?
B: Her farklı önek bir düğümdür: t, to, te, tea, ted, ten, i, in, inn (9) + kök = 10. 17 toplam karakter sayısıdır; ortak önekler (t, te, i, in) tek kez saklandığı için düğüm sayısı daha azdır.
Çoktan Seçmeli · Trie Kavramı
Soru 2: Karakterden İndise
ekle("kod") sırasında kökten itibaren sırasıyla hangi cocuk indisleri kullanılır?
C: i = ch − 'a': 'k' (107) − 97 = 10, 'o' (111) − 97 = 14, 'd' (100) − 97 = 3. A indisleri 1'den sayar; B Unicode değerlerinin kendisidir ve 26 öğeli dizinin dışına çıkar.
Çıktı Sorusu · Trie Kavramı
Soru 3: Düğüm ve null Sayısı
ev, evli, eski, es, ekmek kelimeleri 26 öğeli dizi kullanan trie'ye ekleniyor. Trie'yi çizin. Kök dahil kaç düğüm vardır, toplam kaç çocuk referansı null'dır?
Cevabı göster
- Düğümler: e · ev, evl, evli · es, esk, eski · ek, ekm, ekme, ekmek → 11 + kök = 12 (17 karakter).
- Referans: 12 × 26 = 312; dolu olanlar kenar sayısı kadar (11) → 301 null (≈ %96).
- "ev" ve "es" hem kelime hem başka kelimelerin önekidir; bunu yalnızca kelimeSonu işareti gösterir (çift çember).
Adım Adım Çalıştırma · Ekleme
Soru 4: ekle("kara") İzleme
Trie'de "kar" ve "kale" varken ekle("kara") kaç yeni düğüm oluşturur?
Trie'de "kar" ve "kale" var. dugum kökten başlar.
'k' → i = 10; cocuk[10] dolu → yeni düğüm gerekmez, "k" düğümüne ilerlenir (ortak önek).
'a' → i = 0; cocuk[0] dolu → yeni düğüm gerekmez, "ka" düğümüne ilerlenir (ortak önek).
'r' → i = 17; cocuk[17] dolu → yeni düğüm gerekmez, "kar" düğümüne ilerlenir (ortak önek).
'a' → i = 0; cocuk[0] == null → yeni TrieDugumu oluşturulup bağlanır (mavi).
dugum artık "kara" düğümü.
Döngü bitti: kelimeSonu = true (çift çember). Yalnızca 1 yeni düğüm oluşturuldu; "kar" öneki paylaşıldı. O(L).
public void ekle(String kelime) { TrieDugumu dugum = kok; for (char ch : kelime.toCharArray()) { int i = ch - 'a'; if (dugum.cocuk[i] == null) dugum.cocuk[i] = new TrieDugumu(); dugum = dugum.cocuk[i]; } dugum.kelimeSonu = true; }
Çoktan Seçmeli · Ekleme
Soru 5: Yeni Düğüm Sayısı
Trie'de kale ve kar varken sırasıyla ekle("kalem") ve ekle("kalemlik") çağrılıyor. Toplam kaç yeni düğüm oluşur?
A: "kalem" için yalnızca m (1 düğüm); "kalemlik" için l, i, k (3 düğüm) → 4. Var olan önek düğümleri yeniden kullanılır; 13 iki kelimenin toplam karakter sayısıdır.
Çoktan Seçmeli · Ekleme
Soru 6: Önek Olan Kelimeyi Eklemek
Trie'de yalnızca kalem varken ekle("ka") çağrılırsa ne olur?
B: k ve a dalları zaten vardır; döngü yalnızca ilerler ve sonda o düğüm işaretlenir. C yanlıştır: yol vardı ama "ka" kelime değildi; ekledikten sonra ara("ka") true döner. "kalem" etkilenmez.
Çıktı Sorusu · Arama
Soru 7: ara ve onekVarMi
kale, kalem, kar, kara eklenmiş trie'de aşağıdaki kod ne yazdırır?
// trie: kale, kalem, kar, kara
System.out.println(ara("kal"));
System.out.println(onekVarMi("kal"));
System.out.println(ara("kara"));
System.out.println(ara("karar"));
System.out.println(onekVarMi("kx"));Cevabı göster
false true true false false
- "kal": yol var, ama kelimeSonu false → ara false, onekVarMi true.
- "kara": işaretli düğüm → true. "karar": "kara"dan sonra r dalı yok → erken false.
- "kx": k'dan sonra x dalı yok → false.
Adım Adım Çalıştırma · Arama
Soru 8: ara("der") İzleme
Trie'de ders, dere, dev varken ara("der") ne döndürür?
Trie: ders, dere, dev. dugum kökten başlar.
'd' → i = 3; cocuk[3] null değil → dal var.
dugum = "d".
'e' → i = 4; cocuk[4] null değil → dal var.
dugum = "de".
'r' → i = 17; cocuk[17] null değil → dal var.
dugum = "der".
Kelime bitti; "der" düğümünde kelimeSonu = false → false. "der" yalnızca ders ve dere'nin önekidir; onekVarMi("der") true dönerdi.
public boolean ara(String kelime) { TrieDugumu dugum = kok; for (char ch : kelime.toCharArray()) { int i = ch - 'a'; if (dugum.cocuk[i] == null) return false; dugum = dugum.cocuk[i]; } return dugum.kelimeSonu; }
Çoktan Seçmeli · Arama
Soru 9: Yol Var Ama Kelime Yok
Trie'de and, ant, dad, do var. Aşağıdaki çağrılardan hangisi, aranan yolun tamamı trie'de bulunduğu hâlde false döner?
D: a → n yolu vardır, ama "an" düğümünde kelimeSonu = false; "an" yalnızca and ve ant'ın önekidir. dog ve ab'de dal bulunamaz (do'dan sonra g, a'dan sonra b yok) ve döngü erken false döndürür; dad true döner.
Çoktan Seçmeli · Arama
Soru 10: kelimeSonu Unutulursa
ara metodunun son satırı return dugum.kelimeSonu; yerine return true; yazılırsa metot neye dönüşür?
A: Döngü dal bulamayınca yine false döner, ama yol varsa işarete bakılmadan true döner: bu tam olarak onekVarMi'dir. Trie "da" düğümünü içeriyorsa ara("da") artık yanlışlıkla true verir. C yanlıştır: return false satırı hâlâ çalışır.
Adım Adım Çalıştırma · Otomatik Tamamlama
Soru 11: tamamla("ka") İzleme
Trie'de kar, kale, kalem, kas, at varken tamamla("ka") hangi listeyi döndürür?
Trie: kar, kale, kalem, kas, at. dugumBul("ka") kökten k → a inerek önek düğümünü bulur.
topla("ka"): "ka" kelime değil (kelimeSonu = false); çocuklar indis sırasıyla gezilecek: 'l', 'r', 's'.
topla("kal"): "kal" kelime değil (kelimeSonu = false); çocuklar indis sırasıyla gezilecek: 'e'.
"kale" işaretli → sonuc'a eklenir: sonuc = [kale].
"kalem" işaretli → sonuc'a eklenir: sonuc = [kale, kalem].
"kar" işaretli → sonuc'a eklenir: sonuc = [kale, kalem, kar].
"kas" işaretli → sonuc'a eklenir: sonuc = [kale, kalem, kar, kas].
Tüm çağrılar döndü: tamamla("ka") → [kale, kalem, kar, kas]. "at" hiç ziyaret edilmez; yalnızca önek düğümünün alt ağacı gezilir.
List<String> tamamla(String onek) {
List<String> sonuc = new ArrayList<>();
TrieDugumu d = dugumBul(onek);
if (d != null)
topla(d, new StringBuilder(onek), sonuc);
return sonuc;
}
void topla(TrieDugumu d, StringBuilder yol,
List<String> sonuc) {
if (d.kelimeSonu) sonuc.add(yol.toString());
for (int i = 0; i < 26; i++)
if (d.cocuk[i] != null) {
yol.append((char) ('a' + i));
topla(d.cocuk[i], yol, sonuc);
yol.setLength(yol.length() - 1);
}
}Çıktı Sorusu · Otomatik Tamamlama
Soru 12: tamamla Çıktısı
Kelimeler sırasıyla bal, ba, bas, bat, baba eklenmiş trie'de kod ne yazdırır?
// trie: bal, ba, bas, bat, baba
System.out.println(tamamla("ba"));
System.out.println(tamamla("bx"));
System.out.println(tamamla("bas"));Cevabı göster
[ba, baba, bal, bas, bat] [] [bas]
- topla önce düğümün kendisini ekler ("ba" işaretli), sonra çocukları indis sırasıyla gezer: b (1) < l (11) < s (18) < t (19).
- Ekleme sırası sonucu etkilemez; çıktı her zaman alfabetiktir.
- "bx" düğümü yok → dugumBul null → boş liste.
Çoktan Seçmeli · Otomatik Tamamlama
Soru 13: Neden Alfabetik?
tamamla sonuçları ekleme sırasından bağımsız olarak neden alfabetik sırada çıkar?
B: Önce-kök (preorder) derinlik öncelikli gezinme yapılır: bir önek, onunla başlayan uzun kelimelerden önce gelir ("ba" < "baba"); kardeşler a<b<…<z sırasıyla ziyaret edilir. Sıralama adımı yoktur; sıra yapının kendisinden gelir.
Adım Adım Çalıştırma · Silme
Soru 14: sil("kalem") İzleme
Trie'de ka, kalem, kas varken sil(kok, "kalem", 0) kaç düğüm siler?
Trie: ka, kalem, kas. sil(kok, "kalem", 0) önce kelimenin sonuna iner; silme kararları dönüşte verilir.
k → a → l → e → m dalları bulunur; her düzeyde sil(c, k, j + 1) çağrılır. Yığında 6 çerçeve var.
j == 5: "kalem" işaretli → kelimeSonu = false; bosMu → çocuğu yok → true (beni silebilirsin).
"kale" çocuğunu siler (cocuk[12] = null). "kale" işaretsiz ve artık çocuksuz → true.
"kal" çocuğunu siler (cocuk[4] = null). "kal" işaretsiz ve artık çocuksuz → true.
"ka" düğümü l çocuğunu siler. Ama "ka" bir kelimedir (işaretli) ve s çocuğu var → false: silme burada durur.
Kök false alır, başka değişiklik olmaz. 3 düğüm (m, e, l) silindi; ka ve kas korunur. Kalan: kök + 3 düğüm.
// true: ebeveyn d'yi silebilir boolean sil(TrieDugumu d, String k, int j) { if (j == k.length()) { // kelime bitti if (!d.kelimeSonu) return false; d.kelimeSonu = false; return bosMu(d); // çocuksuz mu? } int i = k.charAt(j) - 'a'; TrieDugumu c = d.cocuk[i]; if (c == null) return false; // kelime yok if (sil(c, k, j + 1)) { d.cocuk[i] = null; // çocuğu sil return !d.kelimeSonu && bosMu(d); } return false; }
Çıktı Sorusu · Silme
Soru 15: Silinen Düğüm Sayıları
Her soruda trie car, card, care, cat kelimeleriyle yeniden kuruluyor. sil("card"), sil("cat") ve sil("ca") kaçar düğüm siler? Trie kol, kola, kolay iken sil("kola") kaç düğüm siler?
Cevabı göster
- sil("card"): d düğümü çocuksuz ve işaretsiz kalır → silinir; "car" işaretli olduğu için durur → 1.
- sil("cat"): t silinir; "ca" işaretsiz ama r çocuğu var → 1.
- sil("ca"): "ca" kelime değil (kelimeSonu false) → hiçbir şey değişmez → 0 (durum 3).
- sil("kola"): yalnızca işaret kalkar; "kola" düğümünün y çocuğu ("kolay") var → 0 (durum 1).
Çoktan Seçmeli · Silme
Soru 16: Hatalı Silme
Bir öğrenci silmeyi "kelimenin yolundaki tüm düğümleri kökten itibaren null yap" diye yazıyor. Trie'de app, apple, apt varken sil("app") çağrılırsa ne olur?
C: Kökten a dalı null yapılınca a ile başlayan her şey (app, apple, apt) kaybolur. Doğru silme yalnızca kelimeSonu'nu kaldırır ve aşağıdan yukarı, çocuksuz ve işaretsiz düğümleri siler; "app"in l çocuğu olduğu için hiçbir düğüm silinmez.
Çoktan Seçmeli · Analiz
Soru 17: Arama Süresi
Bir trie'de n = 1 000 000 kelime var; aranan kelimenin uzunluğu L = 8. ara en kötü durumda kaç düğüm adımı atar?
B: Her karakter için bir çocuğa inilir; kelime sayısı süreyi etkilemez → O(L). D dengeli BST'nin maliyetidir (log n karşılaştırma, her biri O(L)); C düz listede kelime kelime karşılaştırmadır.
Çoktan Seçmeli · Analiz
Soru 18: null Referanslar
26 öğeli dizi kullanan trie'ye at, ate, an ekleniyor. Toplam kaç çocuk referansı null'dır?
D: Düğümler: kök, a, at, ate, an → 5 düğüm × 26 = 130 referans. Dolu referans sayısı kenar sayısıdır (düğüm − 1 = 4) → 130 − 4 = 126. Seyrek düğümlerde belleğin çoğu null'a gider; HashMap ya da sıkıştırılmış trie bunu azaltır.
Çoktan Seçmeli · Analiz
Soru 19: Trie mi, Hash Tablosu mu?
Bir sözlük uygulamasında aşağıdaki işlemlerden hangisi hash tablosunda verimli yapılamaz, trie'de ise O(P)'de yapılır?
B: "ki" ile "kitap"ın hash değerleri ilişkisizdir; hash tablosu önek sorgusu için tüm tabloyu taramak zorundadır. Trie'de k → i yoluna inmek yeter. Tam kelime ekleme, arama ve silme iki yapıda da O(L) mertebesindedir (hash de L karakteri okur).
Çıktı Sorusu · Analiz
Soru 20: Alfabe Dışı Karakter
26 öğeli diziyle yazılmış dersteki ekle ve ara metotlarıyla bu kod ne yazdırır? Hata oluşursa nedenini açıklayın.
TrieDugumu kok = new TrieDugumu();
ekle("kale");
System.out.println(ara("kale"));
ekle("çay");
System.out.println("bitti");Cevabı göster
true
Ardından program ArrayIndexOutOfBoundsException (indis 134) ile sonlanır.
'ç' Unicode 231'dir: 231 − 97 = 134 ≥ 26 → dugum.cocuk[134] dizi sınırını aşar; "bitti" yazılmaz. Büyük harf de sorundur: 'A' − 'a' = −32.
Çözüm: girdiyi küçük harfe ve a–z alfabesine dönüştürmek ya da çocukları HashMap<Character, TrieDugumu> ile saklamak (her alfabe çalışır).
Çoktan Seçmeli · Analiz
Soru 21: Çocuk Gösterimi Seçimi
Türkçe karakterler (ç, ğ, ı, ö, ş, ü) dahil büyük bir sözlük için düğüm başına belleği küçük tutan ve her alfabeyle çalışan çocuk gösterimi hangisidir?
C: HashMap yalnızca var olan çocuklar kadar yer tutar ve her karakter anahtar olabilir; erişim ortalama O(1). A Türkçe harflerde indis taşmasına yol açar; B her düğüme 65 536 referans ayırır; D ağaç yapısını kurmaya yetmez.
Çıktı Sorusu · Türevler
Soru 22: En Uzun Önek Eşleşmesi
Bir yönlendiricinin ikili trie'sinde rotalar: 1* → A, 10* → B, 101* → C, 0* → D. Adresleri 1001…, 1011…, 0110… ve 1100… ile başlayan paketler hangi rotaya gider?
Cevabı göster
- 1001…: 1 (A) → 10 (B) → 100 düğümü yok → yolda görülen son rota B.
- 1011…: 1 → 10 → 101 (C) → C.
- 0110…: 0 (D) → 01 yok → D.
- 1100…: 1 (A) → 11 yok → A.
Kökten inilirken işaretli (rota) düğümlerin sonuncusu hatırlanır: en uzun önek eşleşmesi O(adres uzunluğu).
Çoktan Seçmeli · Türevler
Soru 23: Sıkıştırılmış Trie
test, toaster, toasting, slow, slowly kelimeleri için standart trie'de kök hariç 19 düğüm vardır. Tek çocuklu ve işaretsiz düğüm zincirleri birleştirilince (sıkıştırılmış trie) kök hariç kaç düğüm kalır?
B: Kalan düğümler: t (iki dal: e, o), test, toast (dal: e, i), toaster, toasting, slow (kelime ve devamı var), slowly → 7. Kenarlar artık alt dizgi taşır ("oast", "ly"). 5 yalnızca kelime sayısıdır; dallanma düğümleri de gerekir.
Çıktı Sorusu · Türevler
Soru 24: Sonek Trie'si
"banana" metninin tüm sonekleri bir trie'ye ekleniyor. Kök hariç kaç düğüm oluşur? "nan" ve "nab" alt dizgi mi?
Cevabı göster
Her düğüm kökten bir yoldur, yani metnin farklı bir alt dizgisidir. "banana"nın farklı alt dizgileri: b, ba, ban, bana, banan, banana (6) · a, an, ana, anan, anana (5) · n, na, nan, nana (4) → 15 düğüm.
- "nan": n → a → n yolu var → evet (onekVarMi, O(m)).
- "nab": "na"dan sonra b dalı yok → hayır.
n uzunluklu metinde düğüm sayısı O(n²) olabilir; sıkıştırılmış hâli (sonek ağacı) O(n) düğümle kurulur.
Çıktı Sorusu · Türevler
Soru 25: Sonek Dizisi
"tomato" metninin sonek dizisini (SA) bulun. "to" ile başlayan sonekler SA'da hangi aralıktadır?
Cevabı göster
| sıra | SA | sonek |
|---|---|---|
| 0 | 3 | ato |
| 1 | 2 | mato |
| 2 | 5 | o |
| 3 | 1 | omato |
| 4 | 4 | to |
| 5 | 0 | tomato |
SA = [3, 2, 5, 1, 4, 0]. "to" ile başlayanlar sıra 4–5 (konum 4 ve 0) bitişik bir aralıktadır; uçlar ikili aramayla O(m log n)'de bulunur. Sonek trie'sinin O(n²) düğümü yerine yalnızca n tam sayı saklanır.
Adım Adım Çalıştırma · Türevler
Soru 26: Sayaçlı Ekleme
Her düğümde gecis sayacı tutan trie'ye "kar" ve "kal"dan sonra "kale" ekleniyor. onekSayisi("ka") ve onekSayisi("kal") ne döndürür?
"kar" ve "kal" eklenmiş; düğümdeki sayı gecis: o düğümden geçen kelime sayısı (k: 2, ka: 2, kar: 1, kal: 1).
'k': "k" düğümüne ilerlenir, gecis 2 → 3.
'a': "ka" düğümüne ilerlenir, gecis 2 → 3.
'l': "kal" düğümüne ilerlenir, gecis 1 → 2.
'e': yeni düğüm oluşturulur, gecis = 1.
kelimeSonu = true. Ekleme yine O(L); her düğüme yalnızca bir sayaç eklendi.
onekSayisi("ka"): k → a inilir, d.gecis = 3 (kar, kal, kale). Alt ağaç gezilmez → O(P).
onekSayisi("kal") = 2 (kal, kale). Aynı kelime iki kez eklenirse sayaç iki kez artar; bu sürümde ekleme öncesi ara ile kontrol gerekir.
public void ekle(String kelime) { TrieDugumu dugum = kok; for (char ch : kelime.toCharArray()) { int i = ch - 'a'; if (dugum.cocuk[i] == null) dugum.cocuk[i] = new TrieDugumu(); dugum = dugum.cocuk[i]; dugum.gecis++; // geçen kelime } dugum.kelimeSonu = true; } int onekSayisi(String onek) { TrieDugumu d = dugumBul(onek); return d == null ? 0 : d.gecis; }
Klasik Soru · Türevler
Soru 27: En Uzun Ortak Önek
Trie'deki tüm kelimelerin en uzun ortak önekini bulan String enUzunOrtakOnek() metodunu tasarlayın. kalem, kale, kalemlik için sonuç nedir? Karmaşıklık nedir?
Cevabı göster
Kökten inilir; düğümün tek çocuğu varsa ve düğüm bir kelimenin sonu değilse ilerlenir, geçilen karakterler biriktirilir.
String enUzunOrtakOnek() {
StringBuilder s = new StringBuilder();
TrieDugumu d = kok;
while (!d.kelimeSonu && tekCocuk(d) >= 0) {
int i = tekCocuk(d); // yoksa -1
s.append((char) ('a' + i));
d = d.cocuk[i];
}
return s.toString();
}kalem, kale, kalemlik → k-a-l-e tek zincir; "kale" düğümü işaretli → durulur: "kale". İşaret kontrolü olmasaydı "kalem"e kadar inilirdi, oysa "kale" daha uzun bir ortak önek taşıyamaz. Zaman O(P · M) (P: önek uzunluğu, tekCocuk 26 hücreyi tarar).