CEN207 Veri Yapıları · Hafta 12

Dizgiler: Yapılar ve Algoritmalar

CEN207 Veri Yapıları — Hafta 12

Dr. Öğr. Üyesi Uğur CORUH · 2026-2027 Güz

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Bugünün planı (3 saat)

Saat Konu
1 C dizgileri, arabellekler, trie'ler, sıkıştırılmış trie'ler, sonek dizileri
2 Saf arama, KMP (başarısızlık işlevi + arama), Rabin-Karp
3 Boyer-Moore, Z algoritması, dinamik programlama: düzenleme uzaklığı, LCS

Öğrenme çıktıları: ÖÇ.1 (veri yapılarını açıklama) · ÖÇ.2 (karmaşıklık analizi) · ÖÇ.6 (dinamik programlama) · ÖÇ.7 (doğru yapıyı seçme)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Bu haftanın kavramları — nerede

Kavram Nerede
C dizgileri, arabellekler, trie'ler, radix ağaçları, sonek dizileri Bölüm 1–5
Saf, KMP, Rabin-Karp, Boyer-Moore, Z algoritması Bölüm 6–11
Dinamik programlama: düzenleme uzaklığı, LCS Bölüm 13–14
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod örnekleri nasıl çalışır

  • Her fikrin eksiksiz bir C ve Java programı var
  • C: gcc -std=c11 -Wall -Wextra -o /tmp/x file.c && /tmp/x
  • Java: javac -d /tmp/j File.java && java -cp /tmp/j File
  • Kaynaklar: code/week-12/c/ ve code/week-12/java/
  • Her programın beklenen çıktısı hafta notlarında
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Tekrar — diziler ve char dizisi (Hafta 1)

  • Dizi: bitişik bellek, indeksle O(1) erişim
  • Bir C dizgisi yalnız bir char dizisidir
  • Hafta 1'in indeks aritmetiği (base + i) hâlâ geçerli
  • Bugün üstüne bir kural ekliyor: '\0' sonu işaretler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Tekrar — ağaçlar ve hash'leme (Hafta 4 ve 6)

  • Ağaçlar: çocukları olan özyinelemeli düğümler (Hafta 4)
  • Bir trie düğümü, harf başına bir çocuğu olan bir ağaç düğümüdür
  • Hash'leme: bir işlev bir konumu O(1)'de hesaplar (Hafta 6)
  • Rabin-Karp hash'lemeyi yeniden kullanır — ama onu kaydırır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Yepyeni bir fikir: dinamik programlama

  • Hiçbir önceki hafta bir problemi çakışan alt problemlere bölmedi
  • Her alt problemi yalnız bir kez çözün, bir tabloda saklayın
  • Bölüm 13–14 bunu temel ilkelerden tanıtıyor
  • İki klasik örnek: düzenleme uzaklığı ve LCS
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Bu haftanın haritası — bir bakışta

Yapılar Arama Dinamik programlama
C dizgileri, arabellekler Saf, KMP, Rabin-Karp Düzenleme uzaklığı
Trie'ler, radix ağaçları Boyer-Moore, Z algoritması LCS
Sonek dizileri
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

1. C Dizgileri: Bellek, '\0', ve strlen

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Şimdiye kadarki her yapı boyutunu bir
yerde sakladı. Bir C dizgisi saklamaz.
Öyleyse bir işlev nerede bittiğini nasıl bilir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kısa bir tarihçe

  • C, Bell Labs'ta, 1970'lerin başında tasarlandı (Dennis Ritchie)
  • Uzunluk alanı yok: yalnız bir char dizisi + bir kural
  • '\0' (NUL, değer 0) "dizgi burada bitiyor" der
  • Bu tek seçim arabellek taşmasını olanaklı kılar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sezgi — bir posta kutuları sırası

  • Her posta kutusu (bayt) bir harf tutar
  • Hiçbir işaret "bu son dolu kutu" demez
  • Bunun yerine: ilk boş kutu sonu işaretler
  • Onun ötesine yürümek, başkasının postasına girmektir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: dizi + kural

  • Bir C dizgisi = bir char dizisi, başka hiçbir şey değil
  • '\0' (NUL) dizgi-sonu işaretidir
  • Her işlem onu bulmak için bayt bayt yürür
  • Hiçbir kestirme yol yoktur — uzunluk asla önbelleğe alınmaz
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Arabellek taşması hatası

  • strcpy tarzı kopyalama, '\0''ı da kopyalayana kadar yazar
  • Hedef kaynaktan küçükse: sorun
  • Son geçerli indisin ötesine yazmak tanımsız davranıştır
  • Bugün: her yazmayı her zaman bir sınır kontrolüyle koruruz
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

C dizgisi belleği, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — taşma, bayraklanır, hiç çalıştırılmaz

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — korumalı kopyalama döngüsü

int i = 0;
while (src[i] != '\0') {
    if (i == cap) break;
    buf[i] = src[i];
    i++;
}
int overflow = (src[i] != '\0');
if (!overflow) buf[i] = '\0';
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — strlen onu ikinci kez yürür

size_t len = 0;
if (!overflow)
    while (buf[len] != '\0') len++;
  • Hiçbir uzunluk hiçbir yerde önbelleğe alınmaz
  • strlen'i bir döngü koşulunda çağırmak: O(n), O(n^2) olur
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • L uzunluğunda bir dizgi kopyalamak: O(L)
  • strlen: O(L) — her tek çağrıda, sıfırdan yeniden hesaplanır
  • Hiçbir önbellekleme, hiçbir kestirme, asla
  • Önbelleğe alınmış bir uzunluk, dizgi değiştiği an bozulurdu
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Bir arabelleği boyutlandırırken sonlandırıcı için +1'i unutmak
  • strlen'i bir döngünün koşulunun içinde çağırmak
  • Dizgileri strcmp yerine == ile karşılaştırmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

10 karakterlik bir sözcük hangi boyutta
bir arabellek gerektirir? char buf[10]
neden bir bayt küçük?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

11 bayt. On karakter artı '\0'
için bir bayt — sonlandırıcıyı unutmak
bu bölümün klasik hatasıdır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

2. Büyüyen Bir Dizgi Arabelleği

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Bölüm 1'in arabelleği, bir karakter bile
yazılmadan önce seçilen sabit bir kapasiteye
sahipti. Ya kendini büyütebilseydi?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sezgi — bir çekmeceyi aşmak

  • Bir çekmece sabit sayıda dosya tutar
  • Dolu çekmece: daha büyük bir tane al, her dosyayı taşı
  • Her seferinde "bir boy daha büyük" almak: sürekli taşıma
  • İki katı boyut almak: taşıma seyrekleşir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: dolduğunda ikiye katla

  • len (kullanılan), cap (ayrılan), ve depolamayı izleyin
  • len == cap: iki katı boyutta bir blok ayırın
  • Var olan her karakteri kopyalayın, sonra yeniyi yazın
  • Katlama, n büyüdükçe büyümeyi üstel olarak seyrekleştirir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Büyüyen arabellek, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — en küçük olası başlangıç

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — büyüt, sonra yaz

void append(char c) {
    if (len == cap) {
        cap = cap * 2;
        buf = realloc(buf, cap);
    }
    buf[len] = c;
    len++;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • Bir ekleme: genelde O(1), bir büyümede O(len)
  • n ekleme toplam: O(n) — ekleme başına amorti edilmiş O(1)
  • Büyüme kopyalaması geometrik bir seri oluşturur, n ile sınırlı
  • Hafta 1'in dinamik dizisiyle aynı garanti
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Katlama yerine sabit bir miktarla büyütmek: toplam O(n^2)
  • realloc'tan sonra işaretçiyi güncellemeyi unutmak (C)
  • Bir C dizgisi de +1 gerektirdiğinde len bayt ayırmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Katlama neden amorti edilmiş O(1)
verir, ama sabit 10'luk bir büyüme
ortalama ekleme başına O(n) verir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Katlama: n/k, log n büyümeye
küçülür.
Sabit +10: n/10 büyüme,
her biri n'e kadar kopyalar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

3. Trie'ler: Her Karakter İçin Bir Kenar

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Bir hash tablosu "X bir sözcük mü?"yü
O(1)'de yanıtlar. "X ile hangi sözcükler
başlıyor?"u hiç yanıtlayamaz. Peki ne yanıtlar?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kısa bir tarihçe

  • Edward Fredkin, "Trie Memory," 1960
  • Ad "retrieval"'dan gelir
  • "Tree" ile karışmaması için genellikle "try" diye okunur
  • Bugün hâlâ otomatik tamamlamanın arkasındaki standart yapı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sezgi — bir yol tabelası ağacı

  • Yoldaki her çatal tek bir harfle etiketlenmiş
  • Bir sözcüğün harflerini, bir çatal bir çatal izleyin
  • Paylaşılan önekler aynı erken çatalları paylaşır
  • Küçük bir bayrak "tam bir sözcük burada bitiyor"u işaretler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: paylaşılan önekler düğümleri paylaşır

  • insert("CAT"), sonra insert("CAR"): C→A'yı paylaşır
  • insert("CARD"): C→A→R'ı "CAR"ile paylaşır
  • insert("DOG"): hiçbir şey paylaşmaz, kökten yeni dal
  • Bir düğüm hem "CAR'ın sonu" hem de "CARD'a giden yol" olabilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Trie işlemleri

İşlem Maliyet
insert(word) O(L), L = sözcük uzunluğu
search(word) O(L)
önek kontrolü O(L)

Başka kaç sözcük saklandığından bağımsız!

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Trie ekleme ve arama, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — dallanmasız bir zincir

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — ekleme

void insert(TrieNode *root, const char *word) {
    TrieNode *cur = root;
    for (int i = 0; word[i]; i++) {
        int c = word[i] - 'A';
        if (cur->child[c] == NULL)
            cur->child[c] = new_node();
        cur = cur->child[c];
    }
    cur->isEnd = true;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — arama

bool search(TrieNode *root, const char *word) {
    TrieNode *cur = root;
    for (int i = 0; word[i]; i++) {
        int c = word[i] - 'A';
        if (cur->child[c] == NULL) return false;
        cur = cur->child[c];
    }
    return cur->isEnd;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • Her işlem: O(L), L = sözcüğün uzunluğu
  • Trie'nin toplam sözcük sayısı n'den bağımsız
  • Sıralı bir diziyi ya da dengeli bir ağacı geçer: O(L log n)
  • Bedel: bellek — çoğu boş çocuk dizisi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • "Bulundu"yu "bir önektir" ile karıştırmak
  • Bir düğümün hem isEnd HEM de çocuklu olabileceğini unutmak
  • Trie'yi C'de hiç serbest bırakmamak (bir düğüm bir düğüm sızıntı)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Bir trie "DOG" tutuyor. search("DO")
çağırıyorsunuz. True mü false mü
döndürür — ve neden?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

False. D→O yolu var, böylece
"DO" geçerli bir önektir — ama
O düğümü isEnd olarak işaretli değil.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

4. Sıkıştırılmış Trie'ler (Radix Ağaçları)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

"INTERNATIONAL"i (13 harf) düz bir
trie'ye eklemek, her biri tek çocuklu
13 yeni düğüm yapar. Daha iyisi olur mu?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kısa bir tarihçe

  • Donald R. Morrison, "PATRICIA," 1968
  • Ad: pratik bir erişim algoritması için bir kısaltma
  • Genel kullanımda radix ağacı da denir
  • Aynı fikir gerçek dünya IP yönlendirme tablolarının altında yatar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: uzat, oluştur, ya da böl

  • Sözcük bir kenar etiketiyle tam eşleşir: in
  • Sıradaki harfle başlayan hiçbir kenar yok: yeni yaprak kenar
  • Sözcük bir kenar etiketinin yalnız bir kısmını paylaşır: böl
  • Bir bölme, uyuşmazlıkta yeni bir dallanma düğümü oluşturur
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Bir kenarı bölmek

  • Yalnız "TEST": "TEST" etiketli tek bir yaprak kenar
  • "TEA"yı ekleyin: ayrılmadan önce yalnız "TE"yi paylaşır
  • "TEST" kenarı "TE"de bölünür
  • Şimdi iki çocuk: "ST" (eski) ve "A" (yeni)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Bağlantı — Hafta 4'ün Huffman kodlaması

  • Huffman: çarpık sıklıkları sömürerek sıkıştırır
  • Sıkıştırılmış trie: yapısal israfı kaldırarak sıkıştırır
  • Huffman şekli simgelerin NE SIKLIKLA geçtiğine bağlıdır
  • Trie şekli yalnız saklanan gerçek karakterlere bağlıdır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sıkıştırılmış trie, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — iç içe bölünmeler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — ekleme (uzat, oluştur, ya da böl)

int j = common_prefix_len(word + i, child->label);
if (j == strlen(child->label)) {
    node = child; i += j;   /* in */
} else {
    RNode *mid = split_edge(node, child, j);
    /* kalan sonek için yeni yaprak */
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • insert, search: hâlâ O(L), tam olarak düz bir trie gibi
  • Tasarruflar sürede değil alanda
  • Düğüm sayısı dallanma noktaları + sözcük sonlarıyla sınırlı
  • Toplam karakter sayısıyla değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Yanlış uzunlukta bölmek (ortak önek uzunluğu olmalı)
  • Bölünen çocuğu yeni ilk harfi altında yeniden anahtarlamayı unutmak
  • "Yol var"ı "sözcük bulundu" saymak (bölüm 3'teki aynı tuzak)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Sıkıştırılmış bir trie yalnız "APPLE"
ve "BANANA" tutuyor. Kaç kök-olmayan
düğümü var, ve neden bu kadar az?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

İki. Hiç paylaşılan önek yok,
böylece her sözcük kökten doğrudan
tek bir yaprak kenar olur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

5. Sonek Dizileri

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Bir trie "X saklı bir sözcük mü?"yü
yanıtlar. Peki ya "P, uzun bir T
metninin herhangi bir yerinde geçiyor mu?"

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: her sonek, sıralı

  • T'nin her soneğini, konum konum listeleyin
  • O n soneği sözlük sırasına göre sıralayın
  • Bir örüntü araması bir ikili aramaya döner: O(m log n)
  • Hiç bitiş işareti gerekmez — iki sonek her zaman uzunlukta farklı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sonek dizisi, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — her karakter aynı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — sonekler üzerinde ekleme sıralaması

int compare_suffix(const char *text, int a, int b) {
    return strcmp(text + a, text + b);
}
  • Her sonek aynı arabelleğe bir işaretçidir
  • Sıralama sırasında hiçbir karakter kopyalanmaz
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • Buradaki ekleme sıralaması: en kötü durumda O(n^2) karşılaştırma
  • Her karşılaştırma: O(n) karaktere kadar
  • Gerçek kütüphaneler O(n log n) ya da O(n)'de kurar
  • Bir kez kurulduktan sonra: örüntü araması O(m log n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • "Ne olur ne olmaz" diye gereksiz bir bitiş işareti eklemek
  • Alt-dizgileri kopyalayarak sonekleri karşılaştırmak (belleği israf eder)
  • Dizinin indislerini soneklerin karakterleriyle karıştırmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Aynı metnin iki soneği neden asla
bayt bayt özdeş olamaz?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Her zaman farklı uzunluklara
sahiptirler.
Sonlu bir dizgide farklı
konumlardan başlarlar, böylece uzunluklar farklıdır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

6. Dizgi Eşleştirme Problemi, ve Saf Arama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Bir metin ve bir örüntü verildiğinde,
örüntü nerede geçer? Bunu yanıtlamanın
en basit olası yolu nedir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: her kaydırmayı dene

  • Örüntüyü metin üzerinde bir seferde bir konum kaydırın
  • Her kaydırmada: soldan sağa karşılaştırın
  • İlk uyuşmazlıkta durun, ya da tam bir eşleşme kaydedin
  • Bir eşleşmeden sonra devam edin — oluşumlar çakışabilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Saf arama, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — en kötü durum

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — çift döngü

for (int s = 0; s <= n - m; s++) {
    int j = 0;
    while (j < m && text[s+j] == pattern[j])
        j++;
    if (j == m) occ[c++] = s;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • En iyi durum: O(n) — uyuşmazlıklar hemen olur
  • En kötü durum: O(n*m)
  • "AAAA...AB" vs "AAAB": neredeyse her kaydırma, neredeyse tam karşılaştırma
  • Bu en kötü durum tam olarak Bölüm 7–11'in düzelttiği şey
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Eşleşmelerin çakışabileceğini unutmak (bir isabetten sonra m atlamak)
  • s'yi n - m yerine n'e kadar döndürmek
  • Saf aramanın her zaman "kötü" olduğunu varsaymak — sık kısa girdi için kazanır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Her karşılaştırmayı örüntünün SON
karakterine ulaşmaya zorlayan, 2
harflik bir metin ve örüntü oluşturun.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

text="AAAAAAAAAA", pattern="AAAB".
İlk 3 harf her zaman eşleşir; yalnız
son, 'B', hiç başarısız olur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

7. Knuth-Morris-Pratt: Başarısızlık İşlevi

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Saf arama, bir uyuşmazlıktan sonra
öğrendiği her şeyi atar. Ya örüntünün
kendi yapısı bize daha fazlasını söyleseydi?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kısa bir tarihçe

  • Knuth, Morris, ve Pratt, 1977 (SIAM J. Computing)
  • Morris & Pratt tarafından, ~1970, bağımsız olarak geliştirildi
  • Tablo: lps[] — "en uzun uygun önek, aynı zamanda sonek de olan"
  • Örüntünün kendisiyle karşılaştırılarak kurulur
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: lps[i]

  • Her pattern[0..i] öneki için...
  • ...aynı zamanda sonek de olan en uzun uygun önek
  • "ABAB": en uzun böyle eşleşme "AB" — lps[3] = 2
  • Gelecekteki bir aramaya söyler: "bu kadarı yeniden kullanılabilir"
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

KMP başarısızlık işlevi, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — geri düşüş bir zinciri izler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — lps[]'i kurmak

int len = 0, i = 1;
while (i < m) {
    if (pattern[i] == pattern[len]) {
        lps[i++] = ++len;
    } else if (len != 0) {
        len = lps[len - 1];
    } else {
        lps[i++] = 0;
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • Tüm tabloyu kurmak için O(m)
  • len, arttığı kadar en fazla azalabilir
  • Toplam iş O(m) ile sınırlı, asla O(m^2) değil
  • Aynı amorti edilmiş argüman Bölüm 8 ve 11'de yeniden kullanılıyor
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Her uyuşmazlıkta len'i 0'a sıfırlamak (#1 KMP hatası)
  • Birer kayma: pattern[len+1] değil pattern[len]'i karşılaştırmak
  • lps[0] = 0'ın hesaplanmayan sabit bir taban durumu olduğunu unutmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

lps[m-1] — en son girdi — tüm
örüntü hakkında size ne söyler?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Örüntünün en uzun "sınırı" — uygun
öneki ki aynı zamanda bütün olarak
kendi soneği de olsun.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

8. Knuth-Morris-Pratt: Arama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

lps[] elimizdeyken, metni asla geri
gitmeyen
bir işaretçiyle
arayabilir miyiz?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: i asla geri sarmaz

  • İki işaretçi: i (metin), j (örüntü)
  • Eşleşme: ikisi de ilerler
  • Uyuşmazlık, j > 0: j, lps[j-1]'e geri düşer — i yerinde kalır
  • Uyuşmazlık, j == 0: yalnız i ilerler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

KMP araması, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — çok sayıda lps geri düşüşü

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — ana döngü

while (i < n) {
    if (text[i] == pattern[j]) {
        i++; j++;
        if (j == m) { occ[c++] = i-m; j = lps[j-1]; }
    } else if (j > 0) {
        j = lps[j - 1];
    } else { i++; }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • O(n + m): lps'i kurmak için O(m), arama için O(n)
  • i, toplamda, hiçbir zaman n'den fazla ilerlemez
  • Herhangi bir metin ya da örüntü için geçerli — kötü girdi yok
  • Saf aramanın O(n*m) en kötü durumuyla karşılaştırın
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Bir geri düşüşte i'yi ilerletmek (tüm garantiyi bozar)
  • Bir eşleşmeyi kaydettikten sonra tekrar geri düşmeyi unutmak
  • Farklı bir örüntü için kurulmuş bayat bir lps[] tablosunu yeniden kullanmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

O(n+m), KMP için neden mümkün ama
saf arama için değil, tek bir cümlede?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Hiçbir metin karakteri asla yeniden
incelenmez
— saf aramanın O(n*m)'si
tam olarak onları yeniden incelemekten gelir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

9. Rabin-Karp: Kayan Özet ve Sahte İsabetler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Ya karakterleri hiç karşılaştırmak
yerine, her pencerenin ucuz bir
ÖZETİNİ karşılaştırsaydık?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kısa bir tarihçe

  • Rabin ve Karp, 1987 (IBM J. Research & Development)
  • Hafta 6'nın hash'lemesini yeniden kullanır — ama kaydırır
  • Bir özet eşleşmesi yalnız bir adaydır, asla bir kesinlik değil
  • Bir eşleşme bildirmeden önce her zaman doğrulanmalı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: yeniden hesaplama, kaydır

  • Her karakteri sabit bir tabanda bir basamak sayın
  • Pencereyi kaydırmak: çıkanı çıkar, gireni ekle
  • Bir O(1) güncelleme — ortadaki karakterler asla yeniden okunmaz
  • Bir özet eşleşmesi hâlâ karakter karakter doğrulanmalıdır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Rabin-Karp, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — sahte isabetler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Bu notu hazırlarken yakalanan gerçek bir hata

  • İlk C taslağı hash için long kullandı, long long değil
  • Bu dersin araç zincirinde, long yalnız 32 bit
  • mod = 1e9+7 onu taşırdı — sessiz yanlış cevap
  • C ve Java çıktısını karşılaştırmak bunu hemen yakaladı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — kaydıran güncelleme

if (s > 0)
    tHash = ((tHash - text[s-1]*hPow % mod + mod)
              * base + text[s+m-1]) % mod;
if (tHash == pHash && strncmp(...) == 0)
    occ[c++] = s;   /* HER ZAMAN DOĞRULA */
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • Ortalama durum: O(n + m) — pencere başına O(1)
  • Yalnız özeti gerçekten eşleşen pencereler için ekstra O(m)
  • En kötü durum: modül küçük/kötü seçilmişse O(n*m)
  • Büyük bir asal modül bu en kötü durumu yok denecek kadar azaltır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Doğrulamayı atlamak (yalnız hız değil, bir doğruluk hatası)
  • "Basitlik için" çok küçük bir modül kullanmak
  • Aritmetik için çok dar bir tür kullanmak (yukarıdaki long hatası)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Her Rabin-Karp özet eşleşmesi neden
hâlâ karakter karakter doğrulanmalıdır?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Güvercin yuvası ilkesi — olası
alt-dizgi hash değerinden daha çoksa,
bazıları çakışmak ZORUNDA. Hata değil; matematik.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

10. Boyer-Moore: Kötü Karakter Kuralı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Şimdiye kadarki her algoritma soldan
sağa karşılaştırır. Ya SAĞDAN SOLA
karşılaştırmak daha fazla atlamamızı sağlasaydı?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kısa bir tarihçe

  • Boyer ve Moore, 1977 (Communications of the ACM)
  • Bu ders yalnız kötü karakter kuralını kapsar
  • Tam algoritma ikinci bir "iyi sonek" kuralı ekler
  • Bugün pratikte sıkça en hızlı dizgi araması
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: geriye tara, gördüğünü kullanarak atla

  • pattern[m-1]'i önce, sonra m-2, ... sağdan sola karşılaştırın
  • Uyuşmazlık: o karakterin örüntüdeki SON oluşumuna bakın
  • Karakter örüntüde yoksa: TÜM örüntü uzunluğunca atlayın
  • Atlama asla 1'den az değil (asla geri, asla yerinde)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Boyer-Moore, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — olası en büyük atlama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — kötü karakter tablosu ve atlama

for (int c = 0; c < 256; c++) last[c] = -1;
for (int j = 0; j < m; j++) last[pattern[j]] = j;
/* ... */
int shift = j - last[text[s + j]];
s += shift > 1 ? shift : 1;
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • En iyi durum: O(n/m) — büyük atlamalar, zengin alfabe
  • En kötü durum: O(n*m) — düşük çeşitlilikli metin (yalnız kötü karakter kuralı)
  • Pratikte doğal dil metninde sıkça en hızlısı
  • İyi sonek kuralı (kapsanmadı) en kötü durumu düzeltir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • shift >= 1 korumasını unutmak (onsuz sonsuza dek döngüye girebilir)
  • Kötü karakter tablosunu METİNDEN kurmak, örüntüden değil
  • Alışkanlıkla soldan sağa karşılaştırmak — tüm avantajı kaybeder
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Boyer-Moore, saf aramanın incelemek
zorunda olduğu metin karakterlerini
neden atlayabilir?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Tek bir karşılaştırma birkaç
kaydırmanın imkansız olduğunu kanıtlar

— orada eşleşme olamaz, hiç kontrol edilmez.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

11. Z Algoritması

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

Şimdiye kadarki her algoritma kendi
özel tablosunu kurdu. TEK bir
kendisiyle-karşılaştırma tüm aramayı yanıtlayabilir mi?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: Z[i] ve birleşik bir dizgi

  • Z[i]: S[i..], S'nin kendi başlangıcıyla ne kadar eşleşir?
  • S = pattern + '#' + text olsun (başka yerde kullanılmayan bir ayraç)
  • Metin kısmında Z[i] >= |pattern|: bir oluşum
  • Bir [l, r) penceresi bilinen değerleri yeniden kullanır — toplam O(n + m)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Z algoritması, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — pencere sürekli yeniden kullanılır

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — Z dizisi kurma

if (i < r)
    z[i] = min(r - i, z[i - l]);
while (i + z[i] < n && s[z[i]] == s[i + z[i]])
    z[i]++;
if (i + z[i] > r) { l = i; r = i + z[i]; }
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • Tüm birleşik-dizgi Z dizisi için O(n + m)
  • KMP'nin lps'siyle aynı amorti edilmiş argüman: pencere yalnız büyür
  • Bir konumun bir oluşum işaretleyip işaretlemediğini kontrol etmek için O(1)
  • Beş arama algoritmasının en basit olanı, kavramsal olarak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Ayracı unutmak, ya da metinde geçen bir ayraç seçmek
  • Z[i] == m yerine Z[i] >= m kullanmak
  • Z[0]'ı anlamlı saymak (geleneksel olarak kullanılmaz)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Z algoritması, KMP'nin lps'si gibi
AYRI bir tablo kurmaktan nasıl
kaçınır, tek bir cümlede?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Kaçınmaz — Z[] TABLONUN
KENDİSİDİR, yalnız TÜM birleşik
dizgiyle örtüşmeyi tanımlar.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

12. Beş Arama Algoritmasını Karşılaştırmak

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karşılaştırma tablosu

Algoritma En kötü durum Tipik durum Ekstra fikir
Saf O(n·m) O(n) Taban çizgisi
KMP O(n+m) O(n+m) lps[], i geri sarmaz
Rabin-Karp O(n·m) O(n+m) ort. Kayan özet, doğrula
Boyer-Moore O(n·m) O(n/m) Sağdan sola, büyük atlama
Z algoritması O(n+m) O(n+m) Tek kendisiyle-karşılaştırma dizisi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

13. Yeni Bir Strateji: Dinamik Programlama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

İki dizgi ne kadar "farklı"? Yazım
denetleyicileri, git diff, ve DNA
araçları hepsi bu sorunun bir versiyonunu soruyor.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Saf kuvvet neden çok yavaş

  • Özyinelemeli tanım: eşleştir, değiştir, sil, ya da ekle
  • Doğru — ama neredeyse her adımda 3 çağrıya dallanır
  • AYNI alt problem üstel olarak sık yeniden hesaplanır
  • Çakışan alt problemler: israf edilen iş düzeltilebilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Fikir: her alt problemi bir kez çözün

  • Optimal alt yapı: en iyi cevap, en iyi alt cevaplardan kurulur
  • Çakışan alt problemler: aynısı birçok kez tekrar eder
  • Her alt problemi TAM OLARAK BİR KEZ çözün, bir tabloda saklayın
  • Bu dinamik programlamadır — bu hafta gerçekten yeni
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Düzenleme uzaklığı: soru

  • a'yı b'ye dönüştürmenin en az tek-karakterlik düzenlemesi
  • Ekleme, silme, ya da değiştirme — her biri 1'e mal olur
  • Ayrıca Levenshtein uzaklığı da denir (1965)
  • dp[i][j] = a'nın ilk i'si ile b'nin ilk j'si arasındaki uzaklık
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Yineleme

  • Taban durumu: dp[i][0] = i, dp[0][j] = j
  • Karakterler eşleşir: dp[i][j] = dp[i-1][j-1] (ücretsiz)
  • Aksi halde: 1 + min(köşegen, üst, sol)
  • Satır satır doldurun — her bağımlılık zaten hesaplanmış
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Düzenleme uzaklığı, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — saf ekleme

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — tabloyu doldurmak

if (a[i-1] == b[j-1])
    dp[i][j] = dp[i-1][j-1];
else {
    int best = min(dp[i-1][j-1],
                    min(dp[i-1][j], dp[i][j-1]));
    dp[i][j] = 1 + best;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • O(n*m) süre — her hücre bir kez, O(1)'de hesaplanır
  • Tam tablo için O(n*m) alan (geriye yürüme için gerekli)
  • Saf özyinelemenin üstel süresine göre çarpıcı gelişme
  • Yalnız-satır eniyilemesi alanı O(m)'ye indirir (yalnız uzunluk)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Birer kayma: dp[i][j], a[i]'yı değil a[i-1]'i karşılaştırır
  • Taban durumlarının i ve j olduğunu, sıfır olmadığını unutmak
  • Tabloyu tutarsız ya da yanlış bir sırada doldurmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

Dinamik programlama neden HEM optimal
alt yapıya HEM çakışan alt problemlere
ihtiyaç duyar?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Alt yapı DOĞRU yapar. Çakışma
ezberlemeyi DEĞERLİ yapar
— çakışma
olmadan, hiçbir şey yeniden hesaplanmaz.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

14. En Uzun Ortak Alt Dizi

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Başlangıç sorusu

"Ne kadar farklı" değil — "sırayla,
bitişik olmasa bile, NE AYNI kaldı"?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Alt dizi ile alt dizgi

  • Alt dizgi: bitişik — "ACE", "ABCDE"'nin bir alt dizgisi DEĞİL
  • Alt dizi: sıra korunur, boşluklara izin verilir
  • "ACE", "ABCDE"'nin bir alt dizisiDİR
  • LCS: HER İKİ dizgide de ortak en uzun dizi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Yineleme — neredeyse aynı tablo

  • Taban durumu: dp[i][0] = dp[0][j] = 0
  • Karakterler eşleşir: dp[i][j] = dp[i-1][j-1] + 1 (uzat)
  • Aksi halde: dp[i][j] = max(dp[i-1][j], dp[i][j-1])
  • Uyuşmazlık için ceza yok — yalnız eşleşmeler bir şey ekler
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

LCS, adım adım

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Uç durum — hiç paylaşılan harf yok

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kod — yineleme

if (a[i-1] == b[j-1])
    dp[i][j] = dp[i-1][j-1] + 1;
else
    dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Karmaşıklık

  • O(n*m) süre ve alan — düzenleme uzaklığıyla özdeş
  • Aynı tablo şekli, aynı şekilde doldurulmuş
  • Yalnız her hücredeki yineleme farklı
  • Daha sonraki algoritma tasarımında yeniden tanıyacağınız bir şablon
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sık yapılan hatalar

  • Alt diziyi alt dizgiyle karıştırmak (iki slayt önceye bakın)
  • Yanlışlıkla düzenleme uzaklığının min+1 yinelemesini yeniden kullanmak
  • Yalnız gerçek alt dizi isteniyorken uzunluğu bildirmek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Mini soru

LCS neden max kullanır, düzenleme
uzaklığı min+1 kullanırken, ikisi de
aynı tablo şeklini doldursa bile?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Cevap

Düzenleme uzaklığı bir MALİYET
sayar
(en ucuzu al). LCS bir
UZUNLUK sayar
(zaten en iyisini al).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Özet

  • Yapılar: char dizisi + '\0', büyüyen arabellekler, trie'ler,
    sıkıştırılmış trie'ler, sonek dizileri
  • Arama: saf, KMP, Rabin-Karp, Boyer-Moore, Z algoritması
  • Bu hafta yeni: dinamik programlama — düzenleme uzaklığı, LCS
  • Aynı DP tablo şekli, iki farklı yineleme
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Alıştırmalar ve kendini sınama

  • Hafta notlarında 10 alıştırma — tabloları ve kodu elle izleyin
  • Tam çözümlü 10 kendini sınama sorusu
  • Seçicideki her "uç" örneği deneyin, yalnız "normal"i değil
  • Her programı kendiniz çalıştırın — çıktıların hepsi gerçek, yakalanmış çıktı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

İleriye bakış

  • Hafta 13–14: proje haftaları 15–16'dan önce daha yeni malzeme
  • DP tablo şekli (dp[i][j], bir kez doldurulur, geriye yürümeyle okunur)
  • ...yalnız dizgiler için değil, algoritma tasarımı boyunca tekrar tekrar karşınıza çıkar
  • Bu haftanın tablo şeklini bir şablon olarak aklınızda tutun
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Kaynaklar

  • Cormen, Leiserson, Rivest, Stein — Introduction to Algorithms
  • Knuth, Morris, Pratt (1977) · Boyer, Moore (1977) · Karp, Rabin (1987)
  • Fredkin (1960) · Morrison (1968) · Levenshtein (1965)
  • Sedgewick & Wayne — Algorithms, 4. baskı (Dizgiler bölümü)
  • Tam liste ayrıntılarıyla hafta notlarında
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 12

Sorular?

CEN207 Veri Yapıları — Hafta 12

Gelecek hafta: Hafta 15–16'nın proje gösterimlerinden önce yeni malzemeyle devam

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz

Konuşma notu: Kullandığınız her düzenleyici, derleyici ve arama motoru bugünkü derste anlatılan fikirlere yaslanır — bir dizginin bellekte nasıl durduğu, ve bir dizgiyi başka bir dizginin içinde hızlıca bulmak.

Konuşma notu: On üç kısa animasyon tüm dersi taşıyor; her fikir tanıtıldığı yerde bir normal, bir uç/zor çalıştırma alıyor.

Konuşma notu: Her terim ilk geçtiği yerde tam tanımını alır; bu tablo yalnız nerede yeniden bulunacağını söylüyor.

Konuşma notu: Canlı çalıştırmak isterseniz şimdi bir terminal açın; bugünkü her slayttaki parça gösterildiği gibi derlenir ve çalışır.

Konuşma notu: Bir C dizgisinin bellek düzeni hakkında yeni bir şey yok — yalnız "nerede bitiyor" kuralı yeni.

Konuşma notu: Bir trie "Hafta 4'ün ağacı, ama dallanma çarpanı alfabe boyutu"dur. Rabin-Karp "Hafta 6'nın hash'i, artımlı hale getirilmiş"tir.

Konuşma notu: Bu gerçekten yeni bir mekanizma — bugünün "yalnız daha fazla arama algoritması" gibi hissettirmemesi için baştan işaretlemeye değer.

Konuşma notu: Bu haritadaki her kutu aşağıda kendi slaytlarını alıyor, çoğu kısa bir animasyon ve eksiksiz bir C/Java programıyla.

Konuşma notu: Bölüm 1, sonraki her bölümün varsaydığı tek kuralı kurar: bir C dizgisi bir char dizisi artı bir NUL sonlandırıcıdır, başka hiçbir şey değil.

Konuşma notu: Cevap — tek bir ayrılmış bayt — elli yılı aşkın süredir C programlamayı (ve C hatalarını) şekillendirdi.

Konuşma notu: Pascal tarzı dizgilerle karşılaştırın, onlar gerçekten bir uzunluk baytı saklar — gerçek sonuçları olan bir tasarım kararı.

Konuşma notu: "Başkasının postası", tanımsız davranışı — sahip olmadığınız belleği bozmayı — anlatmanın dostane bir yolu.

Konuşma notu: "Hiçbir kestirme yol yoktur", bu bölümdeki her karmaşıklık sonucunu açıklayan tek gerçektir.

Konuşma notu: Tehlikeyi BAYRAKLAYARAK ve durdurarak gösteriyoruz — asla gerçekten bir sınır dışı yazma çalıştırarak değil.

Konuşma notu: Normal örnek: cap=16, "HELLOWORLD" rahat sığar — kopyalama döngüsünü, sonlandırıcıyı, sonra strlen'in ikinci yürüyüşünü izleyin.

Konuşma notu: cap=8, 10 harflik bir kaynak — `if (i == cap) break;` korumasının kopyalamayı sınır dışına çıkmadan bir yazma önce durdurduğunu izleyin.

Konuşma notu: Koruma satırı, tehlikeli bir saf strcpy döngüsünü güvenli, öğretilebilir bir döngüye çeviren TEK ekleme.

Konuşma notu: Bu tek satırlık tuzak (döngü koşulunda strlen), C'deki en yaygın kazara-karesel hatalardan biridir.

Konuşma notu: "Her tek çağrıda"yı vurgulayın — bu, öğrencilerin sonraki derslerde en sık unuttuğu gerçektir.

Konuşma notu: `==`, C'de karakterleri değil işaretçileri karşılaştırır — farklı adreslerdeki aynı görünen iki dizgi eşit çıkmaz.

Konuşma notu: Cevabı açıklamadan önce birkaç el kalksın — gerçek kodda çok yaygın bir birer-eksik hatasıdır.

Konuşma notu: Bunu taşma animasyonuyla ilişkilendirin: tam olarak "cap=8, 10 harf"in gösterdiği eksiklik budur.

Konuşma notu: Bölüm 2, "son uzunluğu önceden bilmiyorsak ne olur?" sorusunu yanıtlıyor — Hafta 1'in dinamik dizisinin sayılar için yanıtladığı aynı soru.

Konuşma notu: Bu tam olarak java.lang.StringBuilder'ın, C++'ın std::string'inin, ve Hafta 1'in dinamik dizisinin içeride yaptığı şeydir.

Konuşma notu: "+1 değil, katlama" seçimi, bu bölümün karmaşıklık argümanının tüm içeriğidir.

Konuşma notu: "Üstel olarak seyrekleşir", karmaşıklık slaytındaki amorti edilmiş analiz argümanının sezgisel versiyonu.

Konuşma notu: Normal örnek: initCap=4, "HELLOWORLD" — arabelleğin dolduğunu, kapasiteye ulaştığını, ve eski karakterler görünür şekilde kopyalanarak büyüdüğünü izleyin.

Konuşma notu: initCap=1, 10 harf için en çok büyümeyi zorlar — katlama kuralının iyi bir stres testi.

Konuşma notu: C'de, realloc bloğu TAŞIYABİLİR — buf'a eski her işaretçi, bu satır çalıştığı an geçersiz olur.

Konuşma notu: "Amorti edilmiş" demek: her tek işlem ucuz değil, ama uzun bir dizi üzerinde ORTALAMA ucuz demektir.

Konuşma notu: Sabit bir büyüme miktarı, "küçük girdilerde iyi görünür, ölçekte çöker" türünde klasik bir hatadır.

Konuşma notu: Öğrencilerden "kaç büyüme olur, ve her biri ne kadara mal olur" açısından düşünmelerini isteyin.

Konuşma notu: Azalarak her biri n'e kadar mal olan log(n) büyüme O(n)'e toplanır; her biri n'e kadar mal olan n/10 büyüme O(n^2)'ye toplanır.

Konuşma notu: Bölüm 3, hiç kullandığınız her otomatik tamamlama kutusunun ve yazım denetleyicisinin arkasındaki yapıyı, trie'yi tanıtıyor.

Konuşma notu: Hash'leme, benzer anahtarları bilerek dağıtır — bu yüzden bir "ile başlıyor" sorusunu hiç yanıtlayamaz.

Konuşma notu: Altmış beş yaşında ve hâlâ herhangi bir mülakatçının "otomatik tamamlama tasarla" için beklediği ilk fikir.

Konuşma notu: Bayrak önemli — bir çatal, aynı anda hem bir sözcüğün yolunda hem de daha kısa bir sözcüğün sonu olabilir.

Konuşma notu: Bu ikili rol — sözcük-sonu VE çocuklu-olma — trie hatalarının en yaygın tek kaynağıdır.

Konuşma notu: 10 sözcüklü bir trie ile 10 milyon sözcüklü bir trie, search("CAT")'i tam olarak aynı sayıda adımda yanıtlar.

Konuşma notu: Normal örnek: CAT, CAR, CARD, DOG — paylaşılan kenarların yeniden kullanıldığını, "son" bayrağının sözcük sınırlarında belirdiğini izleyin.

Konuşma notu: A, AB, ABC, ABCD — hiç dallanma yok, düz bir bağlı-liste-benzeri zincir. Bölüm 4'ün tam olarak sıkıştırdığı şey bu.

Konuşma notu: C düğüm başına sabit 26-hücreli bir dizi kullanır; Java sürümü (notlarda) bunun yerine bir HashMap kullanır — gerçek bir ödünleşim.

Konuşma notu: Döngünün sonuna ulaşmak yalnız "bu bir önek" olduğunu kanıtlar — dönüş değeri isEnd'i de kontrol eder.

Konuşma notu: O bellek bedeli, tam olarak bölüm 4'ün sıkıştırılmış trie'sinin düzelttiği şeydir.

Konuşma notu: search("CAR") ve search("CARP"), "CARPET" tutan bir trie'de aynı üç kenarı izler — yalnız biri saklı bir sözcüktür.

Konuşma notu: Öğrencilere 30 saniye verin; birçoğu başta yol var olduğu için true diyecektir.

Konuşma notu: Bu, "sık yapılan hatalar" slaytının az önce uyardığı bulundu-önek ayrımının tam olarak kendisi.

Konuşma notu: Bölüm 4, düz bir trie'nin uzun, dallanmayan sözcüklerdeki bellek israfını düzeltiyor.

Konuşma notu: Prensipte hiç dallanması olmayan tek bir dizgi olabilecek bir şey için on üç düğüm.

Konuşma notu: PATRICIA trie'ler bugün ağ ağlarında hâlâ kullanılıyor — en-uzun-önek-eşleşmesi IP yönlendirmesi doğrudan bir uygulama.

Konuşma notu: Durum 3 — bölme — gerçekten yeni olan tek fikir; diğer iki durum tam olarak düz bir trie'nin mantığı.

Konuşma notu: Animasyonu oynatmadan önce tahtada çalışın — öğrencilerin önce elle görmesi gereken tek adım bu.

Konuşma notu: Bu dersten iki tamamen farklı sıkıştırma fikri — farkı açıkça adlandırmaya değer.

Konuşma notu: Normal örnek: TEST, TEA, TEAM — TEST kenarının TE + ST'ye bölündüğünü, sonra TEAM'in A düğümünün ötesine uzandığını izleyin.

Konuşma notu: ANT, ARM, ART, AXE — bir bölmenin içinde bir bölme, bu yapının doğru işlemesi gereken en zor durum.

Konuşma notu: Tam split_edge mantığı (eski etiketi kısaltmak, çocuğu yeniden anahtarlamak) notlarda — bu karar noktası.

Konuşma notu: Süre karmaşıklığı değişmez; yalnız bellekteki sabit çarpan iyileşir, bazen çarpıcı biçimde.

Konuşma notu: Yeniden anahtarlama hatası inceliklidir — çocuğun harita/dizi anahtarı, kısaltılmış etiketinin yeni ilk harfiyle eşleşmelidir.

Konuşma notu: Açıklamadan önce öğrencilerin akıl yürütmesine izin verin — "hiç paylaşılan önek yok" olası en basit durumdur.

Konuşma notu: Aynı iki sözcük için 5 + 6 = 11 düğüme ihtiyaç duyacak düz bir trie'yle karşılaştırın.

Konuşma notu: Bölüm 5 farklı bir soru yanıtlıyor: "X saklı bir sözcük mü?" değil, "P örüntüsü uzun bir T metninin herhangi bir yerinde geçiyor mu?"

Konuşma notu: Bu, bir metin düzenleyicinin "bul" özelliğinin, ya da bir genom tarayıcısının sürekli sorduğu bir sorudur.

Konuşma notu: "Her zaman uzunlukta farklı", daha uzun bir soneğin öneki olan daha kısa bir soneğin otomatik olarak önce sıralanmasının nedeni.

Konuşma notu: Normal örnek: MISSISSIPPI — her soneğin, kendi satırı olarak, ekleme sıralamasıyla sıralı konumuna kaydığını izleyin.

Konuşma notu: AAAAAAAAAA — her karşılaştırma daha kısa soneğin sonuna kadar çalışır; yalnız uzunluk kuralı her bağı çözer.

Konuşma notu: "Akıllı işaretçi kullanımı, O(n) ekstra bellek ve kopyalamadan kaçınır"ın güzel, somut bir örneği.

Konuşma notu: Kurma maliyeti BİR KEZ ödenir; aynı metne karşı sonraki her arama hızlıdır.

Konuşma notu: `sa[i]` bir başlangıç KONUMUDUR, soneğin bir kopyası değil — soneği yazdırmak `text + sa[i]`'ye ihtiyaç duyar.

Konuşma notu: Bu, bir bitiş işaretini karşılaştırma kuralı için gereksiz kılan kilit gerçektir.

Konuşma notu: Farklı uzunluklar, düz sözlük karşılaştırmasının zaten her olası bağı doğru çözdüğü anlamına gelir.

Konuşma notu: Bölüm 6, arama ailesini açıyor — aynı soruyu yanıtlayan beş farklı hileli algoritma.

Konuşma notu: "En basit olası" saf aramadır — henüz daha akıllı bir fikir öğretilmemiş olsaydı tam olarak başlayacağınız yer.

Konuşma notu: "Bir eşleşmeden sonra devam edin", en çok unutulan kural — yaygın bir hata bir isabetten sonra m konum atlar.

Konuşma notu: Normal örnek: text="ABABAABABC", pattern="ABABC" — 5. kaydırmadaki gerçek eşleşmeden önce birkaç yanlış başlangıcı izleyin.

Konuşma notu: text="AAAAAAAAAA", pattern="AAAB" — SON karakterde başarısız olmadan önce her kaydırma örüntünün neredeyse tamamını karşılaştırır.

Konuşma notu: Buradan Bölüm 11'e kadarki her algoritma, bir anlamda, bu çift döngünün en kötü durumundan kaçınmanın daha akıllı bir yoludur.

Konuşma notu: Saf aramanın en kötü durumunu dersin geri kalanının kötü adamı olarak çerçeveleyin — her sonraki algoritma "düzeltme"dir.

Konuşma notu: En kötü durum karmaşıklığı tek dikkat edilecek şey değildir — küçük girdiler saf aramanın küçük sabit çarpanını tercih eder.

Konuşma notu: 60 saniye verin — birçoğu bağımsız olarak zor örnekte gösterilen "AAAA...B" örüntüsünü yeniden keşfedecek.

Konuşma notu: Bu tam olarak iki slayt önce gösterilen zor senaryo animasyonu.

Konuşma notu: Bölüm 7, Bölüm 8'in kullandığı tabloyu kuruyor — bir KMP dersinin anlamlı olması için iki yarısına da ihtiyaç var.

Konuşma notu: Kilit içgörü: örüntü, arayacağı metinden bağımsız olarak, önceden BİR KEZ incelenebilir.

Konuşma notu: Dizgi algoritmalarında en çok alıntılanan makalelerden biri — çoğu derste saf aramadan sonra öğretilen ilk şey.

Konuşma notu: Tahtada "ABAB" -> lps=2'yi çalışın; bir dakikadan az sürede elle yapılacak kadar kısa.

Konuşma notu: Normal örnek: ABABCABABA — len'in bir eşleşmede büyüdüğünü, bir uyuşmazlıkta lps[len-1] üzerinden (asla doğrudan 0'a değil) geri düştüğünü izleyin.

Konuşma notu: AABAACAABAA — bir uyuşmazlık birden fazla lps düzeyi üzerinden geri düşer, doğrudan 0'a değil.

Konuşma notu: "else if (len != 0)" dalı — sıfırlamak yerine geri düşmek — öğrencilerin ilk yanlış yaptığı SATIR.

Konuşma notu: Bu amorti edilmiş argüman (yalnız arttığı kadar azalan bir değer), dizgi algoritmalarında sürekli tekrar eder.

Konuşma notu: 0'a sıfırlamak yine de BİR tablo üretir — yalnız YANLIŞ olanı, güvenli atlama mesafesini eksik bildiren bir tablo.

Konuşma notu: Bu, tablonun son girdisini örüntünün bütün olarak kendi örtüşmesine bağlar.

Konuşma notu: "AAAAAAAAAA"'nın lps[m-1] = m-1'i vardır, olası maksimum kendisiyle örtüşme.

Konuşma notu: Bölüm 8, lps tablosunun karşılığını verdiği yer — bölüm 7'nin kurulumunun ödül dizisi.

Konuşma notu: "Asla geri gitmez", KMP'ye O(n+m) sınırını veren tek garanti — birden fazla söyleyin.

Konuşma notu: Bir geri düşüşte "i yerinde kalır" kilit satır — metin karakteri asla yeniden incelenmez.

Konuşma notu: Normal örnek: klasik CLRS tarzı metin/örüntü çifti — i'nin ileri yürürken j'nin lps kullanarak atladığını izleyin.

Konuşma notu: text="AAAAAAAAAAAAAAAB", pattern="AAAAB" — yoğun bir geri düşüş dizisi, ama i hâlâ yalnız ileri gider.

Konuşma notu: Üç dal, "fikir" slaytındaki her durum için bir tane — öğrencilerle 1:1 eşleştirin, sonra devam edin.

Konuşma notu: "Kötü girdi yok"u yinelemeye değer — KMP'yi kötüleştiren hiçbir yapılandırma ya da girdi yoktur.

Konuşma notu: Eşleşme sonrası geri düşüşü unutmak, çakışan oluşumları sessizce kaçırır — sessiz, fark edilmesi zor bir hata.

Konuşma notu: Cevap, doğrudan saf aramanın "metin karakterlerini yeniden inceliyor" kök nedenine bağlanmalı.

Konuşma notu: Bu slayt tüm KMP yayının ödülü — yavaşça söyleyin, hatırlanmaya değer tek cümle bu.

Konuşma notu: Bölüm 9, hash'lemeyi (Hafta 6) gerçekten yeni, artımlı bir biçimde geri getiriyor.

Konuşma notu: Bu KMP'ninkinden tamamen farklı bir strateji — karşılaştırmayı eniyilemek yerine karşılaştırmadan kaçınmak.

Konuşma notu: "Aday, asla bir kesinlik değil" bu bölümdeki en önemli tek cümle.

Konuşma notu: "Doğrulanmalı"yı tekrar söyleyin. İki farklı alt-dizgi aynı değere hash'lenebilir; bu bir hata değil, matematik.

Konuşma notu: Normal örnek: mod=101, hiç sahte isabet yok — kayan özet güncellemesinin, O(1), çoğu pencereyi tamamen atladığını izleyin.

Konuşma notu: mod=7 (bilerek küçük) — doğrulamada BAŞARISIZ olan bir özet eşleşmesi: doğru şekilde reddedilen bir sahte isabet.

Konuşma notu: Gerçek bir öğretim anı — C'de `long`'un 64 bit anlamına geldiğini asla varsaymayın; genişliği platforma bağlıdır.

Konuşma notu: `strncmp`'i işaret edin — o çağrı isteğe bağlı değil; atlamak sessizce sahte isabetleri gerçek eşleşme olarak bildirir.

Konuşma notu: "Zor" örneği, bu en kötü durum davranışını bilerek görünür kılmak için mod=7 kullandı.

Konuşma notu: Bu üçü tam olarak bu bölümün animasyonunun ve programının bilerek gösterdiği üç şeyle eşleşir.

Konuşma notu: Güvercin yuvası ilkesi tam matematiksel cevaptır, açıkça adlandırmaya değer.

Konuşma notu: Öğrencilerin de almış olabileceği bir ayrık matematik dersine güzel bir geri gönderim.

Konuşma notu: Bölüm 10, pratikte sıkça doğal dil metni için en hızlısı olan algoritmayı tanıtıyor.

Konuşma notu: Bu ilk bakışta tersmiş gibi görünüyor — bu yüzden fikri açıklamadan önce durmaya değer.

Konuşma notu: İyi sonek kuralının var olduğunu ama kapsam dışı olduğunu belirtin — öğrenciler daha sonraki okuma için adını bilmeli.

Konuşma notu: "Asla 1'den az" gerçek bir uygulama tuzağı — tekrarlı karakterler saf atlama formülünü 0'a götürebilir.

Konuşma notu: Normal örnek: text="ABAAABCDAB", pattern="ABC" — sağdan sola taramayı ve ortaya çıkan atlama boyutunu izleyin.

Konuşma notu: text="ZZZZZZZZZZ", pattern="ABC" — Z örüntüde hiç geçmez, böylece her pencere tam örüntü uzunluğunca atlar.

Konuşma notu: Tablo yalnız örüntüden BİR KEZ kurulur — tam olarak KMP'nin lps tablosu gibi, her pencerede değişmeden yeniden kullanılır.

Konuşma notu: "Pratikte"yi vurgulayın — gerçek metinde ortalama durum, bu algoritmanın ününü yapan şeydir.

Konuşma notu: Yanlışlıkla soldan sağa karşılaştırmak yine de doğru eşleşmeler bulur — yalnız Boyer-Moore'un tüm amacını atar.

Konuşma notu: Cevap, oradaki karakterlere hiç bakmadan bir konum aralığının eşleşemeyeceğini KANITLAMAKla ilgili.

Konuşma notu: Bu "kanıtla, kontrol etme" fikri, bu hafta saf aramadan daha hızlı her algoritmanın kavramsal kalbidir.

Konuşma notu: Bölüm 11, arama ailesini beşin en kavramsal olarak zarif olanıyla kapatıyor.

Konuşma notu: Bunu "zarif olan" diye çerçeveleyin — öğrenciler sıkça Z algoritmasını beşinin en tatmin edicisi buluyor.

Konuşma notu: [l, r) penceresi, KMP'nin lps tablosuyla tam olarak aynı rolü oynar — "zaten bildiğini hatırla".

Konuşma notu: Normal örnek: pattern="AB", text="ABABABABAB" — [l,r) penceresinin büyüdüğünü ve sonraki konumlar için yeniden kullanıldığını izleyin.

Konuşma notu: pattern="AAA", "AAAAAAAAAA"'ya karşı — pencere dizginin tam sonuna kadar büyümeye devam eder, neredeyse her adımda yeniden kullanım.

Konuşma notu: Üç satır, her fikir için bir tane: pencereyi yeniden kullan, mümkünse uzat, büyüdüyse yeni pencereyi hatırla.

Konuşma notu: Öğrencilere bunun dersin aynı "yalnız büyür" amorti edilmiş argümanını üçüncü kez kullanışı olduğunu hatırlatmaya değer.

Konuşma notu: Bir Z değeri, metin kendisi tekrarlıysa meşru olarak m'yi aşabilir — doğru eşleşme testi ==, değil >='dir.

Konuşma notu: Dürüst cevap "kaçınmaz" — Z[], benzer bir rol oynayan TABLONUN KENDİSİDİR.

Konuşma notu: lps[i] yalnız örüntü içindeki örtüşmeyi tanımlar; Z[i] tüm yapıştırılmış dizgiyle örtüşmeyi tanımlar.

Konuşma notu: Ders dinamik programlamaya geçmeden önce kısa bir dur-ve-karşılaştır bölümü.

Konuşma notu: KMP, GARANTİLİ bir en kötü duruma sahip tek algoritmadır — düşmanca girdi bir endişeyse güvenli varsayılan.

Konuşma notu: Bölüm 13, dinamik programlamayı sıfırdan tanıtıyor — bu dersteki hiçbir önceki hafta bunu kapsamadı.

Konuşma notu: Bu üç gerçek dünya örneği, aksi takdirde soyut olan bir soruyu öğrencilerin zaten bildiği şeylere bağlıyor.

Konuşma notu: Saf özyinelemeli çağrı ağacını tahtaya çizin — tekrarlanan alt ağaçlar küçük girdilerde bile görsel olarak açıktır.

Konuşma notu: Her iki özellik de gereklidir — optimal alt yapı özyinelemeyi doğru yapar; çakışma ezberlemeyi değerli kılar.

Konuşma notu: Levenshtein'ın özgün makalesi, "dinamik programlama" adının tam bu bağlamda standart hale gelmesinden öncedir.

Konuşma notu: "Her bağımlılık zaten hesaplanmış", hiç özyinelemeye gerek olmamasının nedeni — tek bir geçiş yeterli.

Konuşma notu: Normal örnek: KITTEN -> SITTING, uzaklık 3 — tablonun dolduğunu, sonra geriye yürümenin bir düzenleme dizisi yeniden kurduğunu izleyin.

Konuşma notu: CAT -> CATERPILLAR — a, b'nin bir öneki, böylece her eşleşmeyen adım saf bir ekleme, asla değiştirme ya da silme değil.

Konuşma notu: Bu tüm algoritmanın çekirdeği — geri kalan her şey (taban durumları, geriye yürüme) bu yineleme etrafında defter tutma.

Konuşma notu: Alan eniyilemesinin var olduğunu belirtin ama sonradan geriye yürümeyi çalıştırma yeteneğinden fedakarlık ettiğini not edin.

Konuşma notu: Taban-durumu hatası sinsidir — "boş bir önekle karşılaştırma"yı, maliyeti olması gerekirken sessizce ücretsiz gösterir.

Konuşma notu: Bu, birkaç slayt önceki "fikir" slaytına doğrudan bağlanır — iyi bir anlama kontrolü.

Konuşma notu: Cevabın her iki yarısı da önemli — birçok öğrenci yalnız iki özellikten birini hatırlıyor.

Konuşma notu: Bölüm 14, bölüm 13'ün tam tablo şeklini tek bir değişmiş yinelemeyle yeniden kullanıyor — güzel bir "aynı şekil, farklı anlam" kapanışı.

Konuşma notu: Bu tam olarak bir fark aracının değişmemiş olarak vurguladığı şey — git diff'e bağlantı burada karşılığını veriyor.

Konuşma notu: Bu ayrım, LCS'yle ilgili en yaygın tek kavramsal hatadır — bu slayta gerçekten zaman ayırın.

Konuşma notu: Açıkça düzenleme uzaklığının min+1'iyle karşılaştırın — bu karşıtlık bu bölümün temel öğretim noktasıdır.

Konuşma notu: Normal örnek: ABCBDAB / BDCABA, uzunluk 4 — köşegenin eşleşmelerde büyüdüğünü, aksi halde max'ın ileriye taşındığını izleyin.

Konuşma notu: ABCDE'ye karşı FGHIJ — her hücre 0 kalır, tüm tablo yalnız "eşleşme yok, max taşı" dalıyla dolar.

Konuşma notu: Bunu düzenleme uzaklığının kod slaydıyla yan yana karşılaştırın — görsel benzerlik bilerek yapıldı ve öğreticidir.

Konuşma notu: Bu, açıkça şunu söyleme anı: "artık DP tablo şeklini biliyorsunuz, yalnız iki ayrık algoritmayı değil."

Konuşma notu: Gerçek karakterleri geri kazanmak için geriye yürüme gerekir — yalnız dp[n][m] yalnız "ne kadar uzun?"u yanıtlar.

Konuşma notu: Dersin kapanış kavramsal sorusu — bölüm 13 ve 14'ü açıkça birbirine bağlıyor.

Konuşma notu: Bu, bugünkü dersin tüm DP yarısının en temiz tek cümlelik özeti.

Konuşma notu: Beş yapı, beş arama algoritması, iki DP algoritması — on üç animasyon, bir ders.

Konuşma notu: Öğrencileri programları gerçekten çalıştırmaya teşvik edin — tüm ders boyunca gösterilen her çıktı gerçekti, uydurulmadı.

Konuşma notu: Dinamik programlama, bu haftanın çalışmalarınızın geri kalanında sürekli yeniden ortaya çıkacak tek fikridir.

Konuşma notu: Dergi adları, ciltler, ve yıllarla tam alıntılar basılı notların Kaynaklar bölümünde.

Konuşma notu: Sınıfa teşekkür edin, kodun ve notların nerede olduğunu hatırlatın, ve söz hakkını açın.