CEN207 Veri Yapıları · Hafta 14

Dosya Organizasyonu II

CEN207 Veri Yapıları — Hafta 14

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

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

Bugünün planı (3 saat)

Saat Konu
1 Dizinler Anim 1–2 · ISAM Anim 3 · B-ağacı ekleme Anim 4
2 B-ağacı arama/silme Anim 5–6 · B+-ağacı Anim 7
3 Genişleyebilir/doğrusal hashleme Anim 8–9 · dış sıralama Anim 10–11

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

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

Bu haftanın kavramları — nerede

Kavram Nerede
Birincil/ikincil dizin, ISAM Bölüm 1–3
B-ağacı ekleme/arama/silme, B+-ağacı Bölüm 4–7
Genişleyebilir hashleme, doğrusal hashleme Bölüm 8–9
Dış birleştirmeli sıralama, yerine koyarak seçim Bölüm 10–11
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

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

  • Her fikrin tam 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-14/c/ ve code/week-14/java/
  • İki program GERÇEK dosyalar yaratır, yalnız kendi kurduğu bir lab klasöründe
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Özet — Hafta 13: sayfalar, sıralı dosyalar, kova hashleme

  • Bir sayfa, disk G/Ç'sinin birimidir — bu haftanın da para birimi
  • Sıralı bir dosya: sayfalar üzerinde ikili arama, O(log(n/B))
  • Kova-hashli bir dosya: ~O(1) arama, ama taşma zincirleri
  • Bugün: büyümeyi VE aramayı birlikte ucuzlatan yapılar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Özet — Hafta 4: ağaçlar ve yeniden dengeleme

  • Bir İAA düşmanca bir ekleme sırasında O(n)'e bozulabilir
  • Yeniden dengeleme: bir değişiklikten sonra yerel olarak yeniden yapılandır
  • Bir B-ağacı koca sayfaları dengeler, tek anahtarlı düğümleri değil
  • Sayfaları bölmek ve birleştirmek yüksekliği hep O(log n) tutar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Haftanın haritası — genel bakış

Dizinler Dengeli ağaçlar Dinamik hashleme Dış sıralama
Birincil, ikincil, ISAM B-ağacı, B+-ağacı Genişleyebilir, doğrusal Birleştirmeli sıralama, yerine koyarak seçim
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

1. Birincil (Seyrek) Dizinler

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

Başlangıç sorusu

Bir dosyanın sayfaları üzerinde ikili
arama zaten O(log(n/B)) okumaya mal
oluyor. RAM'e sığacak kadar küçük bir yapı
bunu daha da kısaltabilir mi?

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

Sezgi — bir kitabın bölüm sekmeleri

  • Bir kelimeyi bulmak için her sayfayı çevirmek: çok yavaş
  • Her bölümün ilk kelimesini tutan bir sekme
  • Sekmeleri kontrol et (bedava, elinizde), TEK bölümü aç
  • Bir seyrek dizinin her disk sayfası için yaptığı tam olarak bu
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Fikir: SAYFA başına tek girdi

  • Dizin: (ilk_anahtar, sayfa) çiftleri, veri sayfası başına bir
  • Dosyanın kendisiyle aynı şekilde sıralı
  • Küçük: verinin 1/B'i kadar — RAM'e sığar, ücretsiz taranır
  • find_page: first_key <= key olan son girdi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

search_key: dizin taraması, sonra TEK sayfa okuması

  • find_page, anahtar her first_key'den küçükse -1 döndürür
  • -1: hiç disk erişimi gerekmez
  • Aksi halde: o tek sayfayı oku, anahtarı içinde tara
  • Toplam gerçek disk maliyeti: en çok bir sayfa okuması
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Birincil dizin, adım adım

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

Uç durum — her sorgu aralığın altında

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

Kod — find_page

int find_page(IndexEntry index[], int idx_n, int key) {
    int page = -1;
    for (int i = 0; i < idx_n; i++) {
        if (index[i].first_key <= key)
            page = index[i].page;
        else
            break;
    }
    return page;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Kod — search_key

bool search_key(int data[][MAX_BLOCK], const int page_len[],
                 IndexEntry index[], int idx_n, int key, int *out_page) {
    int page = find_page(index, idx_n, key);
    if (page == -1) return false;
    for (int i = 0; i < page_len[page]; i++)
        if (data[page][i] == key) { *out_page = page; return true; }
    *out_page = page;
    return false;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Dizin taraması: en kötü durumda O(n/B) karşılaştırma, ama sıfır disk G/Ç'si
  • Garanti edilen tek disk okuması: tek veri sayfası
  • Arama başına gerçek toplam G/Ç: O(1) sayfa okuması
  • Dizin yeri: O(n/B) — kayıtla değil, sayfayla orantılı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Sıralı olmayan bir dosyada seyrek dizinin işe yarayacağını varsaymak
  • "-1: hiçbir sayfa uymuyor"u "sayfa tarandı, eşleşme yok" ile karıştırmak
  • Dizinin kendisinin RAM'e sığmayacak kadar büyümesine izin vermek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Bir seyrek dizin neden kayıt başına
değil, yalnız SAYFA başına TEK girdiye ihtiyaç duyar?

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

Cevap

Bir sayfa okuması + sayfa-içi tarama, o
sayfadaki her kaydı zaten bulur.
Sayfa
başına daha fazla girdi hiçbir ek okuma kazandırmazdı.

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

2. İkincil (Yoğun) Dizinler

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

Başlangıç sorusu

Birincil dizin dosyanın kendi sıralama
anahtarında çalışır. Bir dizin FARKLI,
tekrar eden bir öznitelikte de yardımcı olabilir mi?

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

Sezgi — bir kütüphanenin konu kataloğu

  • Kitaplar yer numarasına göre rafta durur (birincil sıra)
  • Konu göre sıralı bir katalog kartı kitap başına vardır
  • Aynı konudaki kartlar birbirinin yanına düşer
  • Her kart yine de kitabın gerçek raf konumuna işaret eder
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Fikir: anahtara göre sıralı, KAYIT başına bir girdi

  • (anahtar, konum) çiftleri, kayıt başına BİR — sayfa başına değil
  • İkincil anahtarın kendisine göre sıralı
  • Dizin sıralı olduğundan tekrarlar bitişik sona erer
  • Bir eşleşme kümesi: anahtar değişene kadar ileri tara
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

search_dense: tüm bir kümeyi topla

  • Bir eşleşme başlamadan önceki girdiler atlanır
  • Bir eşleşmenin içindeyken her ardışık girdi toplanır
  • Bir eşleşmeden sonra FARKLI bir anahtar: küme bitti
  • Dokunulan her farklı sayfa için en çok bir yeni okuma
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

İkincil dizin, adım adım

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

Uç durum — tüm kayıtlar bir anahtarı paylaşıyor

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

Kod — search_dense

int search_dense(const IndexEntry index[], int n, int key,
                  int matches[], int max_matches) {
    int count = 0;
    for (int i = 0; i < n; i++) {
        if (index[i].key == key) {
            if (count < max_matches) matches[count] = index[i].slot;
            count++;
        } else if (count > 0) {
            break;
        }
    }
    return count;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Yazıldığı gibi doğrusal tarama: en kötü durumda O(n)
  • Üretim sürümü: ilk eşleşmeye ikili arama, O(log n + m)
  • Disk maliyeti: eşleşen her farklı sayfa için en çok bir okuma
  • Yer: O(n) — sayfa başına değil, kayıt başına bir girdi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Yoğun dizinin VERİ dosyasının sırasına göre sıralı olduğunu varsaymak
  • Bir küme başlamadan önce ilk eşleşmeyende taramayı kırmak
  • Yoğun bir dizinin O(n/B) değil O(n) yer kapladığını unutmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Yoğun bir dizin neden seyrek dizinin
sayfa başına birine karşı, KAYIT başına bir girdiye ihtiyaç duyar?

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

Cevap

Veri dosyası ikincil anahtara göre
sıralı DEĞİLDİR.
Yalnızca kayıt başına
bir dizin girdisi doğru bir eşleşme listesi garanti edebilir.

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

3. ISAM: Çok Seviyeli Dizin + Taşma

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

Başlangıç sorusu

Bölüm 1–2, dosyanın hiç değişmeyeceğini
varsaydı. Gerçek dosyalar büyür. Sayfası
zaten dolu bir kayıt nereye gider?

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

Kısa bir tarihçe — IBM, 1960'lar

  • ISAM (Dizinli Sıralı Erişim Yöntemi)
  • IBM'in erken mainframe veritabanları için üretim cevabı
  • Onlarca yıl ticari veri işlemede kullanıldı
  • Seyrek bir dizini bir taşma alanıyla birleştirir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Fikir: dizinin dizinini tut, bir kaçış valfi ekle

  • Seviye-2 dizin: sayfa başına bir girdi (Bölüm 1 gibi)
  • Seviye-1 dizin: her GROUP seviye-2 girdisini gruplar
  • İki kısa tarama, tek uzun bir doğrusal taramanın yerini alır
  • Dolu bir sayfanın yeni anahtarı bağlı bir TAŞMA zincirine gider
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Taşma zincirleri: şimdi ucuz, sonra pahalı

  • Taşma zincirine ekleme: sona ekle, yerel olarak O(1) amortize
  • Arama, ev sayfasında değilse TÜM zinciri yürümeli
  • Uzun zincirler: arama başarımı zamanla bozulur
  • Çözüm: periyodik yeniden düzenleme dosyayı sıfırdan kurar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

ISAM, adım adım

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

Uç durum — zincirlenen taşma, aynı sayfa

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

Kod — isam_insert

void isam_insert(int key) {
    int g = find_group(l1_key, l1_n, key);
    int page = find_page(l2_key, g * GROUP, group_hi(g), key);
    read_page(page);
    if (page_len[page] < BLOCK) {
        insert_sorted(page, key);
        write_page(page);
    } else {
        int walked = walk_overflow_chain(page);
        append_overflow(page, key);
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Arama: O(L) bellek-içi karşılaştırma + 1 ev-sayfası okuması
  • Bulunamazsa, yürünen her taşma düğümü için bir okuma daha
  • Ekleme: aynı arama + 1 yazma (doğrudan) ya da 2 yazma (taşma)
  • Zincirler uzadıkça arama bozulur — yeniden düzenlemenin gerekçesi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Taşma zincirlerinin sınırsız büyümesine izin verip hiç yeniden düzenlememek
  • Yeni bir taşma düğümünü yanlış sayfanın zincirine eklemek
  • Doğru GRUBU bulup, sayfalarını taramadan durmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

ISAM neden ÇOK SEVİYELİ bir dizine
ihtiyaç duyar, Bölüm 1'in dizini yalnız birini kullanırken?

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

Cevap

"Küçük" tek seviyeli bir dizin bile koca
bir dosya için çok büyüyebilir.
Seviye-1
altında gruplamak en üst taramayı küçük tutar.

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

4. B-Ağaçları: Ekleme

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

Başlangıç sorusu

ISAM'ın dizin seviyeleri kurulum
zamanında sabittir. Ya dizinin kendisi hiç
yeniden düzenleme olmadan büyüyüp dengelenebilseydi?

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

Kısa bir tarihçe — Bayer ve McCreight, 1972

  • Rudolf Bayer, Edward McCreight, Boeing Araştırma Lab.
  • "Organization and Maintenance of Large Ordered Indexes"
  • "B" Bayer, Boeing, ya da "balanced" olarak okunur — hiç kesinleşmedi
  • ISAM'ın sabit yapısının çözemediğini çözdü: kanıtlanabilir denge
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sezgi — tepeden büyüyen bir dosya dolabı

  • Her çekmece (sayfa) sıralı birkaç dosya (anahtar) tutar
  • Dolu bir çekmece iki yarı dolu çekmeceye bölünür
  • Ortadaki dosya YUKARIDAKİ çekmeceye çıkar
  • Dolap yalnız zorunda kalınca YENİ BİR ÜST çekmece kazanır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Derece m: sayfa başına kaç anahtar

  • Derece m: en çok m-1 anahtar, m çocuk / düğüm
  • Kök daha az tutabilir; diğer her düğüm en az ceil(m/2)-1
  • Ekleme, tam bir aramanın yapacağı gibi bir yaprağa iner
  • Yaprak artık m anahtar tutuyorsa: böl
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

split: ortancayı yukarı it

  • mid = n/2; ortanca anahtar ebeveyne itilir
  • Sol yarı keys[0..mid-1]'i tutar, sağ yarı kalanı alır
  • EBEVEYN de taşıyorsa: onu da böl
  • KÖK bölünürse: yeni bir kök ağacı bir seviye büyütür
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

B-ağacı ekleme, adım adım

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

Uç durum — order=12, hiç bölünmüyor

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

Kod — insert_sorted ve split

void insert_sorted(Node *node, int key) {
    int i = node->n - 1;
    while (i >= 0 && node->keys[i] > key) {
        node->keys[i + 1] = node->keys[i]; i--;
    }
    node->keys[i + 1] = key;
    node->n++;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Kod — b_tree_insert

void b_tree_insert(BTree *t, int key) {
    Node *leaf = find_leaf(t->root, key);
    insert_sorted(leaf, key);
    Node *cur = leaf;
    while (cur->n == ORDER) {
        int median; Node *right = split(cur, &median);
        if (cur->parent == NULL) { t->root = new_root(median, cur, right); return; }
        insert_sorted(cur->parent, median);
        attach_child(cur->parent, right);
        cur = cur->parent;
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Yükseklik: O(log_m n) — derece 100, 1 milyar kayıt: yalnız 5 seviye
  • Ekleme: yaprağı bulmak için O(log_m n) okuma
  • Artı en çok O(log_m n) bölünme, her biri O(m) iş
  • En kötü durum (köke kaskad): O(m log_m n)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Yalnız yaprağı bölüp, ebeveynin de taşabileceğini unutmak
  • Ağacı yanlış uçtan büyütmek (tepe yerine alttan)
  • Sıradan verinin bile sürekli bölünmesine yol açacak kadar küçük bir derece seçmek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Bir B-ağacının yüksekliği neden düşmanca
bir ekleme sırasında bile O(log_m n) kalır?

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

Cevap

Her bölünme yereldir; ağaç yalnızca bir
bölünme KÖKE ulaştığında büyür.
Hiçbir
ekleme sırası uzun bir zincir yaratamaz.

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

5. B-Ağacı: Arama

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

Başlangıç sorusu

Ekleme dengeli bir ağaç kurar. Zaten var
olan birinde, bir anahtarı bulmak — ya da
yokluğunu kanıtlamak — kaç sayfaya mal olur?

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

Fikir: her sayfada karşılaştırarak in

  • Kökte başla; (küçük) sıralı anahtar listesini tara
  • Tam eşleşme: bitti
  • Eşleşme yok, ve bu bir YAPRAK: anahtar olamaz — yok
  • Eşleşme yok, yaprak değil: tam olarak bir çocuğa in
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

B-ağacı arama, adım adım

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

Uç durum — tek düğüm, her arama 1 okuma

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

Kod — b_tree_search

bool b_tree_search(Node *node, int key, Node **out_node) {
    if (node == NULL) return false;
    int i = 0;
    while (i < node->n && key > node->keys[i]) i++;
    if (i < node->n && key == node->keys[i]) {
        *out_node = node; return true;
    }
    if (node->leaf) return false;
    return b_tree_search(node->child[i], key, out_node);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • En kötü durumda O(log_m n) sayfa okuması — seviye başına bir
  • Bir sayfa içinde: ikili aranırsa O(log m), doğrusal O(m)
  • Anahtar bulunsun ya da yokluğu kanıtlansın, aynı maliyet
  • Bu, Bölüm 4'ün dengeli eklemesinin doğrudan getirisi
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Bir yaprağın (ilklendirilmemiş) çocuk dizisine inmek
  • İnilecek çocuk indeksini seçerken birer birlik hata
  • "Bulunamadı"nın "bulundu"dan daha az okumaya mal olduğunu varsaymak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

B-ağacı araması neden en çok
(yükseklik + 1) okumaya mal olur, hangi anahtar aransa da?

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

Cevap

Her yaprak tam olarak aynı derinliktedir.
Bir arama ya erken bulur, ya da bir yaprağa
kadar iner — asla daha derine değil.

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

6. B-Ağacında Silme: Ödünç Alma ve Birleştirme

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

Başlangıç sorusu

Ekleme dolu bir sayfayı böler. Silmenin
ayna görüntüsü — iki çok boş sayfayı
birleştirmek — bazen önlenebilir mi?

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

Fikir: sil, sonra eksikliği düzelt

  • Yaprak anahtarı: kaydır-sil, basit
  • İç anahtar: sıra-içi ÖNCÜL'üyle değiştir
  • Öncülün kendi yaprağı, gerçek silmenin olduğu yerdir
  • O yaprak eksilirse (çok az anahtar): yukarı doğru düzelt
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Eksikliği düzeltmek: önce ödünç al, yalnız gerekirse birleş

  • Sol kardeşin yedek anahtarı var mı? Ödünç al: ebeveynden döndür
  • Yoksa? SAĞ kardeşi aynı şekilde dene
  • Hiçbiri yedek vermiyorsa? Bir kardeşle Birleş
  • Bir birleşme EBEVEYNİ eksiltebilir: kontrol yukarı tekrarlanır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Bir birleşme köke ulaştığında

  • Tepedeki bir birleşme kökü tüm anahtarlarından boşaltabilir
  • Kökün kalan tek çocuğu yeni kök olur
  • Ağaç tam olarak bir seviye küçülür
  • Bölüm 4'ün kök-bölünme büyümesinin tam ayna görüntüsü
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

B-ağacı silme, adım adım

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

Uç durum — kök küçülene kadar sil

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

Kod — fix_underflow (ödünç al ya da birleş)

void fix_underflow(Node *node) {
    while (node->parent != NULL && node->n < MIN_KEYS) {
        Node *parent = node->parent;
        int idx = child_index(parent, node);
        Node *left = idx > 0 ? parent->child[idx - 1] : NULL;
        Node *right = idx < parent->n ? parent->child[idx + 1] : NULL;
        if (left && left->n > MIN_KEYS) { borrow_from_left(node, parent, left, idx); return; }
        if (right && right->n > MIN_KEYS) { borrow_from_right(node, parent, right, idx); return; }
        if (left) { merge(left, parent, node, idx - 1); node = parent; }
        else { merge(node, parent, right, idx); node = parent; }
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Anahtarı bulmak: O(log_m n), aramayla aynı
  • Düzeltme: en çok O(log_m n) birleştirme, seviye başına bir
  • Her birleştirme/ödünç: anahtar ve çocukları kaydırmak için O(m)
  • Ödünç: 3 sayfaya dokunur; birleştirme: bir sayfa + bir anahtar kaldırır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Tam MIN_KEYS tutan bir kardeşten ödünç almak (yine de eksik kalır)
  • Ödünç alınan bir anahtarla birlikte bir çocuk işaretçisini taşımayı unutmak
  • Bir iç-düğüm değiştirmesinden sonra yanlış kopyayı silmek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Bir B-ağacı neden ÖDÜNÇ ALMAYI
BİRLEŞTİRMEYE tercih eder, bir kardeşin yedeği olduğunda?

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

Cevap

Ödünç alma 3 sayfaya dokunur ve hemen
çözülür.
Birleştirme ebeveynden bir sayfa
kaldırır, ağaçta daha yukarı yayılabilir.

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

7. B+-Ağaçları: Yaprak Zincirleri ve Aralık Sorguları

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

Başlangıç sorusu

"Son 30 gündeki her sipariş" bir ARALIK
sorgusudur. Sıradan bir B-ağacı sürekli
köke geri tırmanır. Bu önlenebilir mi?

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

Fikir: anahtarlar yalnız yapraklarda, yapraklar zincir kurar

  • İç düğümler yalnız YÖNLENDİRME kopyaları tutar — asla gerçek veri
  • Her gerçek anahtar bir YAPRAKTA yaşar
  • Her yaprak sağındaki yaprağa bir next işaretçisi tutar
  • Bir aralık sorgusu: TEK bir kez in, sonra zinciri takip et
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Yaprak bölünmesi kopyalar; iç bölünme kaldırır

  • Yaprak bölünmesi: ortanca KOPYALANIR yukarı (sağ yaprakta da kalır)
  • İç bölünme: ortanca KALDIRILIR (saf yönlendirme, veri kaybı yok)
  • Bölüm 4'ten TEK bu fark, tüm B+-ağacı fikridir
  • nexti doğru eklemek tek yeni muhasebe adımıdır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

B+-ağacı, adım adım

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

Uç durum — tüm anahtarları kapsayan bir aralık

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

Kod — range_query

void range_query(Node *root, int lo, int hi, int out[], int *count) {
    Node *leaf = find_leaf(root, lo);
    *count = 0;
    while (leaf != NULL) {
        for (int i = 0; i < leaf->n; i++)
            if (leaf->keys[i] >= lo && leaf->keys[i] <= hi)
                out[(*count)++] = leaf->keys[i];
        if (leaf->n > 0 && leaf->keys[leaf->n - 1] > hi) break;
        leaf = leaf->next;
    }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Tek arama: O(log_m n), sıradan bir B-ağacıyla aynı
  • k eşleşmeli aralık: O(log_m n) + O(k/B) zincir okuması
  • Sıradan bir B-ağacı: O(k) ayrı kök inişine mal olabilirdi
  • Zincir, bu hız kazancının tüm kaynağıdır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Bir İÇ bölünmede ortancayı kopyalamak (yalnız yapraklar kopyalar)
  • leaf->nextin üzerine yazmadan önce nexti eklemeyi unutmak
  • Bir aralık sorgusunu tekrarlanan tek-anahtar aramaları olarak çalıştırmak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

B+-ağacının aralık sorgusu neden köke
tırmanmaktan kaçınabilir, sıradan bir B-ağacınınki kaçınamazken?

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

Cevap

Her yaprak kendi bir sonraki yaprağını
doğrudan, O(1) bilir.
Sıradan bir
B-ağacında komşu yapraklar arasında böyle bir kısayol yok.

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

8. Genişleyebilir Hashleme

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

Başlangıç sorusu

Hafta 13'ün kova-hashli dosyası kova
sayısını kurulurken dondurdu. Hashlenmiş
bir dosya talep üzerine tek seferde bir kova büyüyebilir mi?

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

Kısa bir tarihçe — Fagin vd., 1979

  • Ronald Fagin, Jürg Nievergelt, Nicholas Pippenger, H. R. Strong
  • "Extendible Hashing — A Fast Access Method for Dynamic Files"
  • Ana fikir: dizin (bellek) veri kovalarından (disk) ayrı
  • Büyüme, ucuz dizine, disk sayfalarından çok daha sık dokunur
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Fikir: yalnız gerektiğinde katlanan bir dizin

  • Dizin: 2^global_depth işaretçi, son bitlerle indekslenir
  • Birden fazla girdi AYNI kovaya işaret edebilir
  • Her kova kendi local_depth'ini takip eder
  • Taşma, local_depth == global_depth: dizin ÖNCE katlanır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Böl, sonra yeniden dene

  • Kova bölünür: local_depth++, yeni bir kova yaratılır
  • Anahtarlar, daha derin bölünmenin incelediği TEK yeni bitle yeniden dağıtılır
  • Eklemeyi yeniden dene: tek bir bölünme her zaman yetmez
  • Düşmanca veri ART ARDA BİRKAÇ bölünme gerektirebilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Genişleyebilir hashleme, adım adım

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

Uç durum — zincirleme bölünmeler

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

Kod — insert_key

void insert_key(Hash *h, int key) {
    int idx = last_bits(key, h->global_depth);
    Bucket *b = h->dir[idx];
    if (b->n < CAPACITY) { b->keys[b->n++] = key; return; }
    if (b->local_depth == h->global_depth) {
        h->global_depth++;
        double_directory(h);
    }
    split_bucket(h, b);
    insert_key(h, key);
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • O(1) dizin araması (bellekte, ücretsiz)
  • 1 sayfa okuması + 1 yazma, bölünme başına +2 daha
  • Bölünmeler O(1) amortize — dinamik dizi katlaması gibi
  • Dizin yeri: O(2^global_depth), çarpık değilse küçük
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Dizinin katlanması gerekip gerekmediğini kontrol etmeden kovayı bölmek
  • Yeniden denemeyi unutmak — tek bölünme anahtarları her zaman ayırmaz
  • Bir bölünmenin yarattığı her kovanın boş olmayacağını varsaymak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Dizin neden bir kova bölünmeden ÖNCE
katlanmalıdır, sonra değil?

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

Cevap

Bir bölünme, yönlendirmek için yedek,
daha özgül yuvalara ihtiyaç duyar.
Önce
katlamadan, şu anki derinlikte hiçbiri yok.

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

9. Doğrusal Hashleme

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

Başlangıç sorusu

Genişleyebilir hashleme koca bir ek
dizin yapısı ister. Bir dosya hiç dizin
olmadan tek seferde bir kova büyüyebilir mi?

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

Kısa bir tarihçe — Witold Litwin, 1980

  • "Linear Hashing: A New Tool for File and Table Addressing"
  • Kovalar SABİT, sıralı (round-robin) düzende bölünür: 0, 1, 2...
  • Gerçekte hangi kovanın taştığından tamamen bağımsız
  • Bu öngörülebilirlik dizin ihtiyacını tamamen ortadan kaldırır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Fikir: bir sayaç n, sıradaki bölünmeyi takip eder

  • level: kaç tam katlama turu tamamlandı
  • n: bu turda kaç kova bölündü
  • Adres: key mod (N0 * 2^level)
  • O adres n'den küçükse (zaten bölünmüş): bir seviye derin kullan
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

HERHANGİ bir taşma, taşan değil, kova n'i böler

  • Ekleme her zaman sığar: taşan bir kova basitçe büyür
  • Herhangi bir yerde herhangi bir taşma, kova n'in bölünmesini tetikler
  • n ilerler; tam bir tur n=0'a sıfırlar, level++ yapar
  • Bir kova geçici olarak CAPACITY'den fazla tutabilir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Doğrusal hashleme, adım adım

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

Uç durum — sık bölünme, tam tur

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

Kod — address ve split

int address(int key, int level, int n) {
    int a = key % (N0 << level);
    if (a < n) a = key % (N0 << (level + 1));
    return a;
}

void split(Hash *h) {
    int new_index = (N0 << h->level) + h->n;
    rehash_into(h, h->n, new_index);
    h->n++;
    if (h->n == (N0 << h->level)) { h->n = 0; h->level++; }
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • O(1) ortalama ekleme — genişleyebilir hashlemeyle aynı
  • SIFIR dizin belleği: yalnız iki tam sayı, level ve n
  • Takas: tekil bir kovanın boyutu daha gevşek sınırlı
  • Taşan ama sırası gelmemiş bir kova basitçe büyümeye devam eder
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Kova n yerine TAŞAN kovayı bölmek
  • Bir adres hesaplarken a < n düzeltmesini unutmak
  • n'i asla sıfıra sıfırlamamak ve level'i ilerletmemek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Doğrusal hashleme neden dizinden
tamamen kaçınabilir, genişleyebilir hashleme kaçınamazken?

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

Cevap

Bölünme hedefi yalnız level ve n'den
tamamen öngörülebilir.
Hangi girdinin
hangi kovaya işaret ettiğini kaydetmeye gerek yok.

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

10. Dış Birleştirmeli Sıralama

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

Başlangıç sorusu

Hafta 10 RAM'e sığan dizileri sıraladı.
Milyarlarca kayıtlık bir dosya sığmaz.
"Diğer yarı" diskte yaşadığında ne değişir?

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

Kısa bir tarihçe — bant çağı

  • 1950–60'ların mainframe'leri RAM'den çok daha büyük dosyaları sıraladı
  • Manyetik bant: yalnız sıralı erişim, rastgele atlama yok
  • "Birleştirme" genelde mevcut olan TEK verimli işlemdi
  • Knuth'un TAOCP Cilt 3'ü (1973): klasik, kapsamlı referans
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Fikir: küçük sıralı çalışmalar, sonra k-yollu birleştirme

  • Faz 1: RUN_SIZE parçaları, RAM'de sıralanır, ÇALIŞMA olarak yazılır
  • Faz 2: FAN_IN çalışmayı birleştir, çalışma başına TEK arabellek
  • Şu anki en küçük arabellek değerini seç, yaz, yeniden doldur
  • Tam olarak TEK çalışma kalana dek geçişleri tekrarla
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Yalnız kalan bir çalışma dokunulmadan taşınır

  • Bir grupta yalnız 1 çalışma kaldıysa, birleşecek bir şey yok
  • Bir sonraki geçişe dokunulmadan taşı — sıfır G/Ç
  • Tek bir çalışmaya okuma+yazma harcamak sık görülen bir hatadır
  • Bu iyileştirme tek sayıda çalışmada en çok önemlidir
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Dış birleştirmeli sıralama, adım adım

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

Uç durum — RUN_SIZE=1, çok geçiş

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

Kod — merge_group

Run merge_group(Run group[], int g) {
    int ptr[FAN_IN] = {0};
    Run out = new_run();
    while (1) {
        int best = -1, best_val = INT_MAX;
        for (int i = 0; i < g; i++)
            if (ptr[i] < group[i].n && group[i].keys[ptr[i]] < best_val)
                { best_val = group[i].keys[ptr[i]]; best = i; }
        if (best == -1) break;
        append(&out, best_val);
        ptr[best]++;
    }
    return out;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Bu program GERÇEK dosyalar yaratır — güvenli

  • Gerçek çalışma dosyaları, ama yalnız kendi kurduğu bir LAB KLASÖRÜNDE
  • lab_external_merge_sort/, programın kendisi tarafından yaratılır
  • Program çıkmadan önce her dosya, ve klasör, silinir
  • Diskte başka hiçbir yere hiçbir şey yazılmaz
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Faz 1: ceil(n/RUN_SIZE) çalışma, her biri 1 okuma + 1 yazma
  • Geçişler: O(log_FAN_IN(n/RUN_SIZE))
  • Her geçiş her kayda bir kez dokunur: geçiş başına O(n/B) G/Ç
  • Toplam: O((n/B) · log_FAN_IN(n/RUN_SIZE))
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Yalnız kalan bir çalışmayı yine de birleştirmek (israf edilen okuma+yazma)
  • Bir birleştirme sırasında tüm bir çalışmayı RAM'de tamponlamak
  • RAM'in gerçekten tutabileceğinden büyük bir FAN_IN seçmek
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Dış birleştirmeli sıralama neden dosya
ne kadar dev olursa olsun yalnız O(FAN_IN) RAM arabelleğine ihtiyaç duyar?

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

Cevap

k-yollu bir birleştirme yalnız her
çalışmanın ŞU ANKİ ön değerine ihtiyaç
duyar.
Çalışmalar zaten sıralıdır.

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

11. Yerine Koyarak Seçim: Daha Uzun Çalışmalar

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

Başlangıç sorusu

Bölüm 10'un Faz 1'i her zaman tam
RUN_SIZE uzunluğunda çalışmalar yapar.
Aynı RAM, RUN_SIZE'dan UZUN çalışmalar üretebilir mi?

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

Fikir: current ile next, son YAZMAYA göre kararlaştırılır

  • Küçük bir RAM penceresi tut (üretimde bir min-heap)
  • En küçük CURRENT-etiketli kaydı çıkar, yaz
  • Yeni kayıt >= son yazılan? CURRENT etiketle (çalışmayı uzatabilir)
  • Yeni kayıt < son yazılan? NEXT etiketle (bir sonraki çalışmayı bekler)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

En iyi durum, ortalama durum, en kötü durum

  • Tüm pencere NEXT-etiketli: şu anki çalışma biter, yeniden etiketle, yeni çalışma
  • Rastgele veri: çalışmalar ortalama pencere boyutu m'in yaklaşık 2 katı
  • Zaten sıralı girdi: dosya ne kadar büyük olursa olsun TEK çalışma
  • Kesin azalan girdi: en kötü durum, çalışma başına tam olarak m
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Yerine koyarak seçim, adım adım

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

Uç durum — en iyi durum, RAM >= n

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

Kod — extract_min_current

int extract_min_current(Item window[], int w) {
    int best = -1;
    for (int i = 0; i < w; i++)
        if (window[i].tag == CURRENT &&
            (best == -1 || window[i].val < window[best].val))
            best = i;
    return best;
}
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Bu program da GERÇEK dosyalar yaratır — güvenli

  • lab_replacement_selection/, programın kendisi tarafından yaratılır
  • Program çıkmadan önce her çalışma dosyası silinir
  • Çalışma sınırları bu haftanın animasyonuyla tam eşleşir
  • Üretim bir sürümü pencereyi gerçek bir min-heap olarak tutar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karmaşıklık

  • Çalışma yaratma için toplam O(n) G/Ç — Bölüm 10 Faz 1'iyle aynı
  • Rastgele veride E[çalışma uzunluğu] ≈ 2m — yarı kadar sonraki geçiş
  • extract_min_current: burada O(m), gerçek bir heap'le O(log m)
  • En kötü durum (azalan girdi): düz parçalamadan daha iyi değil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Sık yapılan hatalar

  • Pencerenin minimumuna karşı karşılaştırmak, son YAZMAYA karşı değil
  • Yeni bir çalışma başladığında last_written'ı sıfırlamayı unutmak
  • "2x" ortalamasının en kötü durumda da geçerli olduğunu varsaymak
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Mini soru

Yerine koyarak seçim neden ortalama
olarak pencere boyutu m'in yaklaşık İKİ KATI uzunlukta çalışmalar üretir?

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

Cevap

Herhangi bir anda pencerenin kabaca
yarısı CURRENT kalır, sürekli tazelenir.

Çalışma bitmeden önce ~2m'ye büyür.

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

12. Bir Dosya Organizasyonu Seçmek

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

Karşılaştırma tablosu (1/2)

Yapı Arama Ekleme
Sıralı dosya (H13) O(log(n/B)) O(n/B) kaydırma
Kova hash (H13) ~O(1) + taşma ~O(1) + taşma
Birincil/ikincil dizin O(1) sayfa + ücretsiz tarama Pahalı
ISAM O(L) + taşma zinciri O(L) + zincire ekleme
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Karşılaştırma tablosu (2/2)

Yapı Aralık sorgusu Yeniden düzenleme?
B-ağacı Tekrarlanan inişler Asla
B+-ağacı Mükemmel (zincir) Asla
Genişleyebilir hashleme Zayıf (sıra yok) Asla
Doğrusal hashleme Zayıf (sıra yok) Asla
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Büyük tek karar

  • SIRAYA mı ihtiyacınız var (aralık sorguları, sıralı gezinme)?
  • Yoksa yalnız TAM-EŞLEŞME aramaları mı?
  • Sıra önemliyse: bir B+-ağacının yaprak zincirini yenmek zor
  • Yalnız tam-eşleşme, sürekli büyüyen dosya: hashleme genelde kazanır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Özet (1/2)

  • Dizinler: birincil (seyrek), ikincil (yoğun), ISAM
  • ISAM, dizin SEVİYELERİ ve bir TAŞMA ALANI ekler
  • B-ağaçları (Bayer/McCreight 1972): bölme, arama, ödünç/birleştirme
  • B+-ağaçları: yaprak ZİNCİRİ aralık sorgularını hızlandırır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Özet (2/2)

  • Genişleyebilir hashleme (Fagin vd. 1979): katlanan bir dizin
  • Doğrusal hashleme (Litwin 1980): dizin yok, sıralı bölünmeler
  • Dış birleştirmeli sıralama: küçük çalışmalar, k-yollu birleştirme
  • Yerine koyarak seçim: aynı RAM'den ~2 kat daha uzun çalışmalar
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Kendini Sınama Özeti

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

1. Birincil bir dizin neden taranması SIFIR disk G/Ç'sine mal olur?

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

Bellekte kalacak kadar küçüktür — kayıt başına değil, SAYFA başına tek girdi.

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

2. Yoğun bir dizin neden İKİNCİL anahtara göre sıralı olmalıdır?

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

Veri dosyasının kendi sırası eşleşen kayıtların nerede olduğu hakkında hiçbir şey söylemez — yalnız dizinin kendi sırası söyler.

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

3. ISAM'ın taşma alanı, bir dosyanın hangi işlemi hemen yapmaktan kaçınmasına izin verir?

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

Her eklemede tüm dosyayı yeniden bölmek ya da yeniden düzenlemek — bedeli, zincirler uzadıkça bozulan arama.

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

4. Bir B-ağacı bölünmesi neden her zaman tam olarak TEK anahtarı yukarı iter?

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

Ortanca, bölünmeden sonra HİÇBİR yarıya tam sığmayan tek anahtardır — bu yüzden o yükseltilir.

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

5. B-ağacı araması neden en çok (yükseklik + 1) okumaya mal olur?

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

Her yaprak tam olarak aynı derinliktedir — ekleme ağacı yalnız kökten büyütür, hiç bir yapraktan değil.

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

6. Bir B-ağacı neden birleştirmeye karşı ödünç almayı tercih eder?

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

Ödünç alma yalnız 3 sayfaya dokunur ve hemen çözülür; birleştirme ağaçta daha yukarı yayılabilir.

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

7. Bir B+-ağacının aralık sorgularını hızlandıran TEK yapısal değişiklik nedir?

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

Her yaprak sağ komşusuna bir next işaretçisi tutar — köke tırmanmaya hiç gerek olmayan bir zincir.

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

8. Genişleyebilir hashlemenin dizini neden bazen katlanmak zorunda kalır?

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

Yalnız taşan kovanın local_depth'i global_depth'e yetiştiğinde — diğer kovalar etkilenmez.

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

9. Doğrusal hashleme neden taşan kovadan BAŞKA bir kovayı bölebilir?

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

Önceden, gerçekte hangi kovanın taştığından bağımsız, sabit, sıralı bir bölünme sırasına bağlanır.

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

10. Yerine koyarak seçim neden genelde pencere boyutu m'i ikiye katlar?

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

Pencere sürekli yeniden dolar: herhangi bir anda kabaca yarısı CURRENT kalır, çalışma ~2m'ye büyür.

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

Gelecek hafta

Hafta 15 — Final Proje Gösterimleri

Bu hafta yeni algoritma yok: takımlar
projelerinin dosya-organizasyonu ya da
depolama bileşenini sunuyor, Hafta 16'nın final sınav döneminden önce.

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

Kaynaklar (1/2)

  • Ders izlencesi, Hafta 14: CEN207-2026-2027-Guz-Izlence.tr.md
  • Bayer, McCreight (1972). "Organization and Maintenance
    of Large Ordered Indexes"
  • Fagin, Nievergelt, Pippenger, Strong (1979).
    "Extendible Hashing"
  • Litwin (1980). "Linear Hashing: A New Tool for
    File and Table Addressing"
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN207 Veri Yapıları · Hafta 14

Kaynaklar (2/2)

  • Knuth. TAOCP, Cilt 3: Sorting and Searching, 2. baskı
  • Cormen, Leiserson, Rivest, Stein. Introduction
    to Algorithms
    . MIT Press
  • Sedgewick, Wayne. Algorithms, 4. baskı. Addison-Wesley
  • williamfiset/Algorithms · Programiz DSA
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz

Konuşma notu: Hafta 13 bize sıralı bir dosya ve kova-hashli bir dosya verdi. Bu hafta soruyor: küçük bir dizin aramayı ucuzlatabilir mi, dizinin kendisi sonsuza dek dengeli kalabilir mi, ve hashlenmiş bir dosya hiç yeniden kurulmadan büyüyebilir mi?

Konuşma notu: On bir animasyon tüm dersi taşıyor; her çizim disk sayfalarını numarayla etiketler ve sağda okuma/yazma sayacı tutar.

Konuşma notu: Her terim ilk geçtiğinde tam olarak tanımlanır; bu tablo yalnızca onu tekrar bulacağınız yeri söyler.

Konuşma notu: external_merge_sort ve replacement_selection gerçek çalışma dosyaları yaratır, ama her zaman kendi yarattıkları ve sildikleri bir klasörün içinde.

Konuşma notu: Bu haftaki her şey ya sıralı dosyayı bir dizinle hızlandırır, ya da hashlenmiş dosyanın sabit kova sayısını çözer.

Konuşma notu: Bugünün B-ağacı ailesi, Hafta 4'ün ağaç fikrini, tek anahtar değil birçok anahtar tutan sayfalara genelliyor.

Konuşma notu: Bu haritadaki her kutu aşağıda kendi slaytlarını alır, her biri adım adım bir animasyon ve tam bir C/Java programıyla.

Konuşma notu: Bölüm 1 dizinleme ailesini açıyor: sayfa sayfa aramayı tek bir sayfa okumasına dönüştüren, belleğe sığan küçücük bir yapı.

Konuşma notu: Evet — yapı diske hiç dokunmayacak kadar küçükse, geriye yalnız TEK bir veri sayfası okuması kalır.

Konuşma notu: Sekmeler elinizden (bellekten) hiç çıkmaz; yalnızca doğru bölümü açmak gerçek bir "sayfa çevirme" (disk okuma) maliyetidir.

Konuşma notu: Sayfa başına tek girdi tuttuğundan (kayıt başına değil), devasa bir dosya için bile küçücük kalır.

Konuşma notu: "Aralığın altında" uç durumunda, dizinin kendisi bile bir anahtarın yokluğunu sıfır disk G/Ç'siyle kanıtlayabilir.

Konuşma notu: Normal örnek: 12 anahtar, block=4 — dizin taramasının (bedava) tek bir sayfa okumasına nasıl devrettiğini izleyin.

Konuşma notu: Her tek sorgu en küçük anahtardan küçük: tüm senaryo boyunca sıfır disk okuması.

Konuşma notu: Dizin sıralıdır, bu yüzden bir girdinin first_key'i hedefi aştığı an döngü durabilir.

Konuşma notu: page == -1, herhangi bir disk erişiminden önce kısa devre yapar; aksi halde tam olarak bir sayfa okunur ve taranır.

Konuşma notu: Daha büyük bir kurulum dizini de ikili ararardı, ama disk maliyeti her iki durumda da O(1) kalır.

Konuşma notu: Üçüncü hata, sırada gelen ISAM'ın çok seviyeli dizin için tam gerekçesidir.

Konuşma notu: Hangi sayfayı okuyacağınızı bildiğinizde, bir sayfa okumasının ve sayfa-içi taramanın ne verdiğini düşünün.

Konuşma notu: "Seyrek"in işe yaramasının tam nedeni bu: dizin yalnız "hangi sayfa"yı cevaplamalı, "hangi yuva"yı değil.

Konuşma notu: Bölüm 2, dizinlemeyi, birçok kayıtta tekrar eden biri dahil, herhangi bir özniteliğe genelliyor.

Konuşma notu: Evet — ikincil anahtarın kendisine göre sıralı, yoğun bir dizin, tekrarların yan yana kümelenmesini sağlar.

Konuşma notu: Katalog yoğundur (kitap başına bir kart) ve raflardan FARKLI bir anahtara göre sıralıdır.

Konuşma notu: Yoğun dizin, seyrek dizinin O(n/B)'sinden daha fazla yer (O(n)) kaplar, herhangi bir özniteliği desteklemenin doğrudan bedeli.

Konuşma notu: Aynı sayfayı paylaşan iki eşleşme toplamda yalnız bir okumaya mal olur — arama bu sorguda ziyaret edilen sayfaları izler.

Konuşma notu: Normal örnek: 12 kayıt, block=4 — veri dosyası bu anahtara göre sıralı olmasa bile eşleşmelerin nasıl kümelendiğini izleyin.

Konuşma notu: Dizinin tamamı tek bir dev küme — arama yine de tek geçişte her eşleşmeyi bulur.

Konuşma notu: "else if (count > 0) break" kilit satırdır: yalnızca bir küme gerçekten başlayıp bittiğinde durur.

Konuşma notu: Yoğun dizin, seyrek dizinin küçük ayak izini, tekrarlar dahil HERHANGİ bir özniteliği arayabilme yeteneğiyle takas eder.

Konuşma notu: Veri dosyasının fiziksel sırası ile yoğun dizinin sıralama sırası genelde tamamen ilgisizdir.

Konuşma notu: Seyrek dizinin "sayfa başına bir girdi" hilesinin neye dayandığını düşünün.

Konuşma notu: Seyrek dizinin hilesi yalnızca dosyanın kendisi tam olarak o anahtara göre sıralı olduğu için işe yarar.

Konuşma notu: Bölüm 3, çok seviyeli bir dizini bir büyüme mekanizmasıyla, taşma alanıyla, birleştiriyor.

Konuşma notu: ISAM iki fikirle cevap verir: dizini küçük tutmak için SEVİYELER, ve büyümeyi ucuz tutmak için bir TAŞMA ALANI.

Konuşma notu: ISAM, B-ağacından (1972) yaklaşık on yıl önce gelir — dosya organizasyonu sorununun ilk endüstriyel cevabıdır.

Konuşma notu: Ev sayfası ve dizin girdisi hiç yer değiştirmez; yalnızca onun taşma zinciri büyür.

Konuşma notu: Bu takas — ucuz büyüme, bozulan arama — gerçek ISAM dosyalarının neden zamanlanmış bakıma ihtiyaç duyduğudur.

Konuşma notu: Normal örnek: 12 anahtar, block=4, fill=3 — iki doğrudan eklemeyi, sonra taşan üçüncüyü izleyin.

Konuşma notu: Üç ekleme aynı, zaten dolu sayfayı hedefliyor; üçüncüsü eklenmeden önce iki taşma düğümünü geçmek zorunda.

Konuşma notu: İki seviyeli iniş (önce find_group, sonra find_page) tüm "dizinin dizini" fikridir, dört satırda.

Konuşma notu: L (dizin seviyeleri), koca bir dosya için bile küçük kalır, tam olarak seviye-2'yi seviye-1 altında gruplamanın amacı.

Konuşma notu: Yeni kayıt her zaman KENDİ ev sayfasının zincirine eklenir — en kısa zincire değil, komşuya değil.

Konuşma notu: Gerçekten koca bir dosya üzerinde tek seviyeli bir seyrek dizine ne olacağını düşünün.

Konuşma notu: Tıpkı bir telefon rehberinin sekmeli bölümlerinin, altındaki sıralı sayfadan önce yaptığı gibi.

Konuşma notu: Bölüm 4, B-ağacı ailesini açıyor: dizinin kendisi disk sayfalarından oluşan kendi kendini dengeleyen bir ağaç OLUYOR.

Konuşma notu: O yapı B-ağacıdır — her "düğüm" koca bir disk sayfası, dengeli kalmak için bölünüp birleşiyor.

Konuşma notu: Bir B-ağacının yüksekliği, dosya nasıl büyür ya da küçülürse küçülsün O(log n) kalır — hiç ayrı bir yeniden dengeleme adımı olmadan.

Konuşma notu: Büyüme her zaman tepede (kökte) olur, asla yeni bir alt raf ekleyerek değil.

Konuşma notu: Bu haftanın örneklerinde m=4 (karışık veri) ve m=3 (en kötü durum, bölünmeleri görünür kılmak için).

Konuşma notu: Bu kaskad bölünme, ağaç yüksekliğini O(log_m n) tutan tüm mekanizmadır.

Konuşma notu: Normal örnek: order=4, 12 karışık anahtar — ilk bölünmenin bir ortancayı yukarı ittiğini, sonra bir kök bölünmesini izleyin.

Konuşma notu: n'ye göre büyük bir order ile, tüm ağaç tek bir yaprak düğüm olarak kalır — bölünen durumlarla temiz bir zıtlık.

Konuşma notu: Sıralı bir diziye düz bir kaydır-ekle — zaten gördüğünüz her ekleme sıralamasıyla aynı fikir.

Konuşma notu: while döngüsü kaskaddır: bir düğüm taşmayana ya da kök bölünene kadar yukarı doğru kontrol etmeye devam eder.

Konuşma notu: Her seviyeye ulaşan kaskadlar pratikte nadirdir — çoğu ekleme yalnız bir yaprak yazmasına mal olur.

Konuşma notu: Gerçek B-ağaçları, bir düğümün tam olarak bir disk sayfasını doldurduğu, yüzlerce mertebesinde bir derece kullanır.

Konuşma notu: Büyümenin nerede ve ne sıklıkla olduğunu düşünün.

Konuşma notu: Dengesiz bir İAA'nın aksine, her yaprak her zaman diğer her yaprakla aynı derinliktedir.

Konuşma notu: Bölüm 5 daha basit soruyu soruyor: zaten var olan bir ağaçta, tek bir arama kaça mal olur?

Konuşma notu: Cevap, ağacın yüksekliğiyle, artı bir, sınırlı çıkacak, ne olursa olsun.

Konuşma notu: Bir B-ağacı her anahtarı doğru yönlendirilmiş bir inişin izleyeceği bir yerde tutar; bir yaprağa eşleşmeden düşmek yokluğu kanıtlar.

Konuşma notu: Normal örnek: order=4, 12 anahtar, 3 arama — kök seviyesinde bir isabeti daha derin, daha pahalı bir aramayla karşılaştırın.

Konuşma notu: order=12 ve yalnız 10 anahtarla, tüm dosya tek sayfaya sığar — bulunsun ya da bulunmasın, her arama tam bir okumaya mal olur.

Konuşma notu: Yaprak kontrolü eşleşme kontrolünden SONRA ama inmeden ÖNCE gelmeli — bir yaprakta inmek çöp okur.

Konuşma notu: "Bulunamadı" BEDAVA DEĞİLDİR — arama yine de emin olmak için bir yaprağa kadar iner.

Konuşma notu: Yanlış bir çocuk indeksi aramayı tamamen yanlış alt ağaca gönderir — çökmez, sessizce yanlıştır.

Konuşma notu: Bir B-ağacında her yaprağın derinliği hakkında ne doğru olduğunu düşünün.

Konuşma notu: Bu, Bölüm 4'ün kökten böl-ve-büyü mekanizmasının doğrudan sağladığı yapısal garanti.

Konuşma notu: Bölüm 6, eklemenin bölünmesini, silmenin iki onarım hamlesiyle yansıtıyor: ödünç al, ya da birleş.

Konuşma notu: Evet — minimumun az altına düşen bir sayfa, çoğu zaman bunun yerine bir komşusundan tek bir yedek anahtar ödünç alabilir.

Konuşma notu: Her silme, bir şekilde, bir yaprak silme artı üzerindeki olası bir düzeltme zincirine indirgenir.

Konuşma notu: Ödünç alma tek adımda çözülür, 3 sayfaya dokunur; birleştirme ebeveynden bir sayfa ve bir anahtar kaldırır.

Konuşma notu: Bir B-ağacının bir seviye kaybetmesinin tek yolu budur — her zaman tepede, asla bir yaprağı budayarak değil.

Konuşma notu: Normal örnek: order=4, 12 anahtar, 3 silme — hiç düzeltme gerektirmeyen bir yaprak silmesini izleyin.

Konuşma notu: order=3 bir ağaçta yedi silme, her biri bir birleşme, ta ki kök boşalıp ağaç bir seviye kaybedene dek.

Konuşma notu: Ödünç alma hemen döner (çözüldü); birleştirme node = parent yapıp döngüye devam eder (kaskad olabilir).

Konuşma notu: Bir ödünç alma kesinlikle daha ucuzdur — tek adımda çözülür, daha fazla yayılma riski olmadan.

Konuşma notu: Gerçek silme her zaman ÖNCÜLÜN orijinal yaprağında gerçekleşir, asla iç düğümde değil.

Konuşma notu: Her seçeneğin kaç sayfaya dokunduğunu ve kaskad olup olamayacağını düşünün.

Konuşma notu: Dinamik bir dizinin tam bir yeniden ayırmadan önce yerinde büyümeyi tercih etmesiyle aynı "önce daha ucuz yerel çözüm" ruhu.

Konuşma notu: Bölüm 7 aralık sorgularını soruyor — ve tek bir yapısal değişiklikle cevaplıyor: her yaprağı bağlayan bir zincir.

Konuşma notu: Evet — her yaprak zaten sırada hangi yaprağın geldiğini biliyorsa, bir daha hiç tırmanmaya gerek kalmaz.

Konuşma notu: Zincir, "her eşleşme için yeniden in"i "yana doğru yürü"ye dönüştürür, büyük sonuç kümeleri için devasa bir kazanç.

Konuşma notu: `next`i, üzerine yazmadan önce eklemeyi unutmak, bölünme noktasından sonraki her yaprağı sessizce kaybeder.

Konuşma notu: Normal örnek: order=4, 12 anahtar, 3 aralık sorgusu — turuncu zincir oklarının sorguyu yana taşıdığını izleyin.

Konuşma notu: Sorgu tüm zinciri sonuna kadar yürür — bir kez bile köke tırmanmadan.

Konuşma notu: TEK bir iniş (find_leaf), sonra saf bir yana yürüyüş — özyineleme yok, iç düğümleri yeniden ziyaret etmek yok.

Konuşma notu: Sonuç kümesi ne kadar büyürse, B+-ağacının sıradan bir B-ağacına üstünlüğü o kadar büyür.

Konuşma notu: Üçüncü hata doğru çalışır, ama yaprak zincirinin tüm kazancını çöpe atar.

Konuşma notu: Bir B+-ağacı yaprağının, sıradan bir B-ağacı yaprağının sahip olmadığı hangi bilgiye sahip olduğunu düşünün.

Konuşma notu: Yaprak başına bu tek işaretçi, B+-ağacının aralık-sorgusu hızının arkasındaki tüm yapısal fark.

Konuşma notu: Bölüm 8 hashlemeye dönüyor, artık kova sayısının kendisinin talep üzerine büyümesine izin vererek.

Konuşma notu: Genişleyebilir hashlemenin cevabı: küçük, bellekte duran bir dizini, diskteki veri kovalarından ayırmak.

Konuşma notu: Bu dizin/veri ayrımı, sonradan dinamik ve dağıtık hash tablolarının yeniden kullandığı tasarım kalıbıdır.

Konuşma notu: Katlama saf bellek işidir — sıfır disk maliyeti — yalnızca yönlendirecek daha fazla, daha ince taneli işaretçi yaratır.

Konuşma notu: Yeniden deneme şarttır — onsuz, yeni bitle her şeyi paylaşan bir anahtar kaybedilirdi.

Konuşma notu: Normal örnek: capacity=2, 10 anahtar — bir kovanın local_depth'i yetiştiğinde dizinin ilk kez katlanmasını izleyin.

Konuşma notu: Her anahtar 8 mod 16 — anahtarlar nihayet ayrılmadan önce dizin derinlik 7'ye kadar büyür.

Konuşma notu: Sondaki özyineli yeniden deneme, "tek bölünme yetmedi" kaskad durumunu ele alan şeydir.

Konuşma notu: Her katlama, bir sonrakine ihtiyaç duyulmadan önce iki kat daha fazla gelecekteki ekleme yapılmasına izin verir.

Konuşma notu: Şanssız bir bölünme, yepyeni bir kovayı sıfır anahtarla, gelecekteki bir eklemeyi bekler hâlde bırakabilir.

Konuşma notu: Bir bölünmeden hemen sonra kaç dizin yuvasının YENİ kovaya işaret edebileceğini düşünün.

Konuşma notu: Önce katlamak, bölünmenin sonra kullanacağı tam olarak o ek yuvaları yaratır.

Konuşma notu: Bölüm 9, Bölüm 8 ile aynı dinamik büyümeyi, ama hiç dizin olmadan başarıyor.

Konuşma notu: Doğrusal hashlemenin cevabı: önceden, sabit, öngörülebilir bir bölünme sırasına bağlanmak.

Konuşma notu: Litwin'in planı, genişleyebilir hashlemenin dizinini tek bir sayaçla, n, takas etti.

Konuşma notu: Adres kuralının tek "düzeltme" şartı, kovalar bölündükçe adreslemeyi doğru tutan tüm hiledir.

Konuşma notu: Bu, doğrusal hashlemenin en karakteristik — ve en sık yanlış gerçeklenen — kuralıdır.

Konuşma notu: Normal örnek: N0=4, capacity=2, 10 anahtar — bir taşmanın FARKLI bir kovanın bölünmesini tetiklemesini izleyin.

Konuşma notu: N0=2, capacity=1 — bölünmeler o kadar sık olur ki tam bir tur tamamlanır, n sıfırlanır, level artar.

Konuşma notu: split() her zaman h->n üzerinde çalışır — çağrıyı tetikleyen kova ne olursa olsun.

Konuşma notu: Sadelik (dizin yok), herhangi bir tekil kovanın en kötü durumu üzerinde daha gevşek bir sınırla ödenir.

Konuşma notu: Bölünme hedefi her zaman "sıralı düzende sırada gelen kova"dır — tamamen öngörülebilir.

Konuşma notu: Bir sonraki bölünme hedefinin ne kadar öngörülebilir olduğunu düşünün.

Konuşma notu: Bedel: bir kova, kendi bölünme sırası gelene kadar kapasitesinin ötesinde büyüyebilir.

Konuşma notu: Bölüm 10, RAM'e sığmayan bir dosyayı sıralamayı ele alıyor — Hafta 10'unkinden gerçekten farklı bir algoritma.

Konuşma notu: Böl adımı kolayca uyarlanır; birleştir adımı temelden farklı bir gerçekleme ister.

Konuşma notu: İki-fazlı çalışma-sonra-birleştir yapısı doğrudan bu bant çağına uzanır.

Konuşma notu: RAM her zaman yalnız FAN_IN arabellek artı bir çıktı arabelleği tutar, dosya ne kadar dev olursa olsun.

Konuşma notu: Bu, bu haftanın programlarının gerçeklediği küçük ama gerçek bir iyileştirmedir.

Konuşma notu: Normal örnek: 12 değer, RUN_SIZE=4, FAN_IN=2 — ilk birleştirmenin çalışma başına küçük arabelleklerinin tüketildikçe küçülmesini izleyin.

Konuşma notu: Her değer kendi çalışması olarak başlar — normal durumdan çok daha fazla birleştirme geçişi gerekir.

Konuşma notu: Yalnız her çalışmanın ŞU ANKİ ön değeri RAM'de olmalı — asla tüm bir çalışma birden değil.

Konuşma notu: Hem external_merge_sort hem replacement_selection aynı güvenli lab-klasörü örüntüsünü izler.

Konuşma notu: Tüm dosyayı tek seferde belleğe yüklemeye çalışan saf bir yaklaşımdan çarpıcı biçimde daha az.

Konuşma notu: FAN_IN arabellek, aynı anda birleştirilen çalışma başına bir — kolaylıkla değil, gerçek bellekle sınırlı.

Konuşma notu: k-yollu bir birleştirmenin bir seferde bir çalışmanın ne kadarını gerçekten görmesi gerektiğini düşünün.

Konuşma notu: Hafta 10'un iki-yollu birleştirmesinin genellenmiş hâli, o da her zaman yalnız iki "şu anki" elemana bakar.

Konuşma notu: Bölüm 11 soruyor: Faz 1'in çalışmaları AYNI RAM kullanarak RAM'den daha uzun yapılabilir mi?

Konuşma notu: Yerine koyarak seçimin cevabı: son YAZILAN'dan küçük bir kayıt, bunun yerine bir sonraki çalışmayı başlatır.

Konuşma notu: Karşılaştırma son YAZILAN değere karşıdır, asla pencerenin kendi şu anki minimumuna karşı değil.

Konuşma notu: En kötü durum, Bölüm 10'un düz sabit-boyutlu parçalamasından daha iyi değildir — kazanç ortalama-durum, garanti değil.

Konuşma notu: Normal örnek: RAM=4, 12 karışık değer — pencere kutularının "current" ile "next" arasında geçiş yapmasını izleyin.

Konuşma notu: Her şeyi tutacak kadar büyük RAM ile, sonuç girdi sırasına bakılmaksızın her zaman TEK, tam sıralı bir çalışmadır.

Konuşma notu: Hiçbir şey CURRENT etiketli değilse -1 döner — bu çalışmanın bittiğinin sinyalidir.

Konuşma notu: Buradaki kod, açıklık için pencereyi kayıt başına O(m) doğrusal tarar — bir heap O(log m) yapar.

Konuşma notu: Bu ortalama-durum kazancı, gerçek veritabanı ve işletim sistemi sıralama araçlarının yerine koyarak seçim kullanmasının tam nedenidir.

Konuşma notu: Önceki çalışmanın son değerini taşımak, yeni çalışmanın en erken kayıtlarından bazılarını yanlış etiketlerdi.

Konuşma notu: Herhangi bir anda pencerenin ne kadarının tipik olarak CURRENT etiketli olduğunu düşünün.

Konuşma notu: Knuth'un TAOCP, Cilt 3'ünde tam olarak incelenen klasik bir sonuç.

Konuşma notu: Kapanış bölümü, bu haftanın kapsadığı her şeyi tek bir karar tablosuna dönüştürüyor.

Konuşma notu: Dizin satırları çoğunlukla statik bir dosyayı varsayar; ISAM'ın taşma alanı eklemeleri katlanılabilir kılan şeydir.

Konuşma notu: "Asla yeniden düzenleme", B-ağacı ailesinin logaritmik aramanın yanındaki diğer büyük özelliğidir.

Konuşma notu: Bu, Hafta 13'ün ilk sorduğu, bu haftanın eklediği her şeyle keskinleşen aynı sorudur.

Konuşma notu: B-ağacı ailesindeki her işlem ağacı ilerledikçe dengeli tutar — hiçbir ayrı yeniden dengeleme geçişi olmadan.

Konuşma notu: Her iki hashleme planı da tek seferde bir kova, talep üzerine, hiç yeniden düzenleme geçişi olmadan büyür.

Konuşma notu: On soru, haftanın notlarından yeniden ifade edilmiş, her biri bir slayt çifti.

Konuşma notu: Bölüm 1'i hatırlayın.

Konuşma notu: Yalnızca işaret ettiği tek veri sayfası gerçek bir disk okumasıdır.

Konuşma notu: Bölüm 2'yi hatırlayın.

Konuşma notu: Yoğun bir dizinde tekrar eden değerlerin kümelenmesini sağlayan şey budur.

Konuşma notu: Bölüm 3'ü hatırlayın.

Konuşma notu: Bu takas, gerçek ISAM dosyalarının neden periyodik yeniden düzenlemeye ihtiyaç duyduğudur.

Konuşma notu: Bölüm 4'ü hatırlayın.

Konuşma notu: Anahtarların yarısı kalır, yarısı yeni bir kardeşe geçer, ve ortanca ikisini ebeveynde ayırır.

Konuşma notu: Bölüm 5'i hatırlayın.

Konuşma notu: Bir arama ya anahtarını erken bulur, ya da bir yaprağa iner — asla ötesine değil.

Konuşma notu: Bölüm 6'yı hatırlayın.

Konuşma notu: Bir B-ağacı yalnız hiçbir kardeşin yedek anahtarı olmadığında birleşir.

Konuşma notu: Bölüm 7'yi hatırlayın.

Konuşma notu: Sıradan bir B-ağacında komşu yapraklar arasında böyle bir kısayol yoktur.

Konuşma notu: Bölüm 8'i hatırlayın.

Konuşma notu: Katlama, bir bölünmenin sonra ihtiyaç duyduğu yedek, daha özgül yuvaları yaratır.

Konuşma notu: Bölüm 9'u hatırlayın.

Konuşma notu: Bu öngörülebilirlik, dizin ihtiyacını tamamen ortadan kaldıran şeydir.

Konuşma notu: Bölüm 11'i hatırlayın.

Konuşma notu: Knuth'un TAOCP, Cilt 3'ünde incelenen klasik bir sonuç.

Konuşma notu: Bu haftanın her yapısı günlük üretimde kullanılmaya devam ediyor — B+-ağaçları neredeyse her ilişkisel veritabanında, dış birleştirmeli sıralama her veritabanının sıralama/dizin-kurma aracında.

Konuşma notu: Bunlar, haftanın yazılı notlarının sonunda listelenen aynı kaynaklardır.

Konuşma notu: Tarihsel kaynaklar — Bayer/McCreight, Fagin vd., Litwin — bugünün "kısa tarihçe" slaytlarının dayandığı kaynaklardır.