Bölüm 5: Trie Veri Yapısı

Bölüm 5: Trie Veri Yapısı · Çalışma Soruları
Trie kavramıEklemeArama ve önek sorgusuOtomatik tamamlamaSilmeKarmaşıklık ve bellekSıkıştırılmış ve sonek trie'leri
Sercan KÜLCÜ

Ç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 evliskikmek
  • 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?

karle

Trie'de "kar" ve "kale" var. dugum kökten başlar.

karle

'k' → i = 10; cocuk[10] dolu → yeni düğüm gerekmez, "k" düğümüne ilerlenir (ortak önek).

karle

'a' → i = 0; cocuk[0] dolu → yeni düğüm gerekmez, "ka" düğümüne ilerlenir (ortak önek).

karle

'r' → i = 17; cocuk[17] dolu → yeni düğüm gerekmez, "kar" düğümüne ilerlenir (ortak önek).

karlea

'a' → i = 0; cocuk[0] == null → yeni TrieDugumu oluşturulup bağlanır (mavi).

karlea

dugum artık "kara" düğümü.

karlea

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.
kalemra

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?

dersev

Trie: ders, dere, dev. dugum kökten başlar.

dersev

'd' → i = 3; cocuk[3] null değil → dal var.

dersev

dugum = "d".

dersev

'e' → i = 4; cocuk[4] null değil → dal var.

dersev

dugum = "de".

dersev

'r' → i = 17; cocuk[17] null değil → dal var.

dersev

dugum = "der".

dersev

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?

andtdado

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?

karlemsat

Trie: kar, kale, kalem, kas, at. dugumBul("ka") kökten k → a inerek önek düğümünü bulur.

karlemsat

topla("ka"): "ka" kelime değil (kelimeSonu = false); çocuklar indis sırasıyla gezilecek: 'l', 'r', 's'.

karlemsat

topla("kal"): "kal" kelime değil (kelimeSonu = false); çocuklar indis sırasıyla gezilecek: 'e'.

karlemsat

"kale" işaretli → sonuc'a eklenir: sonuc = [kale].

karlemsat

"kalem" işaretli → sonuc'a eklenir: sonuc = [kale, kalem].

karlemsat

"kar" işaretli → sonuc'a eklenir: sonuc = [kale, kalem, kar].

karlemsat

"kas" işaretli → sonuc'a eklenir: sonuc = [kale, kalem, kar, kas].

karlemsat

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?

kalems

Trie: ka, kalem, kas. sil(kok, "kalem", 0) önce kelimenin sonuna iner; silme kararları dönüşte verilir.

kalems

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.

kalems

j == 5: "kalem" işaretli → kelimeSonu = false; bosMu → çocuğu yok → true (beni silebilirsin).

kales

"kale" çocuğunu siler (cocuk[12] = null). "kale" işaretsiz ve artık çocuksuz → true.

kals

"kal" çocuğunu siler (cocuk[4] = null). "kal" işaretsiz ve artık çocuksuz → true.

kas

"ka" düğümü l çocuğunu siler. Ama "ka" bir kelimedir (işaretli) ve s çocuğu var → false: silme burada durur.

kas

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).
cardet

Ç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 1010
  • 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ıraSAsonek
03ato
12mato
25o
31omato
44to
50tomato

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?

karl2211

"kar" ve "kal" eklenmiş; düğümdeki sayı gecis: o düğümden geçen kelime sayısı (k: 2, ka: 2, kar: 1, kal: 1).

karl3211

'k': "k" düğümüne ilerlenir, gecis 2 → 3.

karl3311

'a': "ka" düğümüne ilerlenir, gecis 2 → 3.

karl3312

'l': "kal" düğümüne ilerlenir, gecis 1 → 2.

karle33121

'e': yeni düğüm oluşturulur, gecis = 1.

karle33121

kelimeSonu = true. Ekleme yine O(L); her düğüme yalnızca bir sayaç eklendi.

karle33121

onekSayisi("ka"): k → a inilir, d.gecis = 3 (kar, kal, kale). Alt ağaç gezilmez → O(P).

karle33121

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).

Son

Bölüm 5: Trie Veri Yapısı: Çalışma Soruları
Konu anlatımı: Trie Veri Yapısı sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.