Bölüm 13: Çevrimiçi Algoritmalar

Algoritmalar
Çevrimiçi ve çevrimdışıRekabetçi analizKayak kiralamaSayfalama: FIFO, LRU, OPT Liste güncellemeVeri akışı algoritmalarıRezervuar örneklemeArtımlı öğrenme
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Giriş

Öğrenme Çıktıları

Model

Çevrimiçi (online) ve çevrimdışı (offline) problem modelini ayırt etmek; geri alınamaz karar kavramını açıklamak.

Rekabetçi analiz

Rekabet oranını (competitive ratio) tanımlamak; kayak kiralama problemi için 2 − 1/B oranını kanıtlamak.

Sayfalama ve listeler

FIFO, LRU ve OPT ile sayfa hatalarını adım adım hesaplamak; LRU'nun k-rekabetçi, MTF'nin 2-rekabetçi olduğunu yorumlamak.

Veri akışları

Hareketli ortalama, çevrimiçi ortanca ve rezervuar örneklemeyi Java ile yazmak; öğe başına zaman ve belleği analiz etmek.

Giriş

Bilgi Olsun Yeter

  • Bazen kararlar tüm bilgiye sahip olunmadan alınır.
  • Çevrimiçi algoritmalar (online algorithms):
    • bilginin adım adım geldiği durumlarda
    • o ana kadarki bilgiyle en iyi kararı vermeye çalışır.
  • Verilen karar geri alınamaz: sonradan gelen bilgi geçmiş kararı değiştirmez.
Satranç oyuncusu rakibin sonraki hamlesini bilmeden hamle yapar; hamle bir kez yapıldıktan sonra geri alınamaz.
Satranç tahtasında bir oyuncu taşını sürüyor; diğer taşlar tahtada bekliyor.

Giriş

Çevrimiçi Algoritmalar

  • Bir labirentte yolculuk yapmaya benzer.
    • Labirentin tamamı görünmez; yalnızca önünüzdeki yolu görürsünüz.
  • Her adımda sınırlı bilgi ile en iyi yol seçilmeye çalışılır.
  • Bilgi akışının sürekli olmadığı durumlarda hızlı karar vermeyi sağlar.
  • Örnekler:
    • Trafik sıkışıklığında hangi yol kullanılacak?
    • Satranç oynarken bir sonraki hamle ne olacak?
    • Anlık trafik yoğunluğuna göre ışıkların ayarlanması.
Bir direk üzerinde kırmızı, sarı ve yeşil lambaları yanan iki trafik ışığı.

Giriş

Çevrimiçi ve Çevrimdışı Problem Modeli

Girdi bir istek dizisidir: σ = σ1, σ2, …, σn. Fark, algoritmanın bu diziyi ne zaman gördüğündedir.

Çevrimdışı (offline)Çevrimiçi (online)
GirdiTamamı baştan bilinirParça parça gelir; σt gelince σt+1 bilinmez
KararTüm girdiye bakılarak verilirσt geldiği anda verilmeli, geri alınamaz
ÖrnekSıralama, Dijkstra, sırt çantası (DP)Önbellek yönetimi, kayak kiralama, borsa
En iyi çözümOPT hesaplanabilirOPT ancak geriye dönüp bakınca bilinir
ÖlçütZaman / alan karmaşıklığıRekabet oranı: ALG / OPT
"Çevrimiçi" burada internet anlamına gelmez; girdinin zaman içinde açığa çıkması demektir. Eklemeli sıralama (insertion sort) çevrimiçi çalışabilir, seçimli sıralama (selection sort) çalışamaz.

Giriş

Çevrimiçi Algoritma Modeli (Online Algorithms)

AlgoritmatamponVeri sürekligelirÇıktıTampon tüm girdiyitutamaz (sınırlı bellek)
  • Veri sürekli gelir; algoritma her parçayı geldiğinde işler ve hemen çıktı üretir.
  • Bellek (tampon, buffer) tüm girdiyi tutamaz: geçmiş ancak özet olarak saklanabilir (toplam, heap, örnek…).
  • Bu yüzden her öğe için az iş (çoğunlukla O(1) ya da O(log n)) ve az bellek hedeflenir.

Giriş

Uygulama Alanları

BorsaAnlık fiyata göre al-sat kararı; gelecek fiyat bilinmez.
Önbellekİşlemci, işletim sistemi, web: hangi sayfa bellekte kalsın?
YönlendirmeBağlantıları sürekli değişen ağda en kısa yol.
Kaynak tahsisiBant genişliği ve CPU zamanının dinamik paylaşımı.
Zamanlamaİşler geldikçe makinelere atanır (iş çizelgeleme).
Reklam ve öneriKullanıcı geldiğinde hangi reklam / ürün gösterilsin?
Makine öğrenmesiModel her yeni örnekle güncellenir (artımlı öğrenme).
GüvenlikDolandırıcılık ve DDoS saldırılarını akış üzerinde yakalama.
Otonom araçlarAlgılayıcı verisi geldikçe gerçek zamanlı karar.

Ortak nokta: ortam dinamik, karar gerçek zamanlı, geleceğe dair bilgi eksik.

Giriş

Avantajlar ve Dezavantajlar

Avantajlar

  • Dinamik ortamlarda çalışır; girdinin bitmesini beklemez.
  • Gerçek zamanlı karar verir; gecikme düşüktür.
  • Az bellekle çok büyük, hatta sonsuz akışları işleyebilir.
  • Rekabet oranı ile en kötü durum garantisi verilebilir.

Dezavantajlar

  • İlk adımlarda yanlış kararlar alınabilir ve sonraki adımları etkiler.
  • Satrançta yanlış bir hamle oyunu kaybettirebilir.
  • Her zaman en iyi global çözümü bulmayı garanti etmez.
  • Başlangıçtaki girdiye duyarlıdır; tasarımı ve analizi daha karmaşıktır.

Giriş

Çevrimiçi Algoritma Tasarım Yaklaşımları

Açgözlü (greedy)Geleni o an en iyi görünen biçimde karşılar; küresel etkiyi düşünmez. Örnek: istek geldiğinde en yakın boş sunucuya atama.
ÖzetlemeGeçmişi tümüyle saklamak yerine küçük bir özet tutar: toplam, iki heap, örneklem. Örnek: hareketli ortalama, çevrimiçi ortanca.
Uyarlanır (adaptive)Hatalarından öğrenir, davranışını zamanla değiştirir. Örnek: LRU, öne taşı (MTF), artımlı öğrenme.
DeterministikAynı girdiye hep aynı kararı verir; kötü niyetli bir girdi dizisi (düşman) onu kolayca tuzağa düşürebilir.
Rastgele (randomized)Kararlarına rastlantı katar; düşman ne yapacağını önceden bilemez. Örnek: rezervuar örnekleme, rastgele işaretleme.

Rekabetçi Analiz

Rekabetçi Analiz (Competitive Analysis)

  • Çevrimiçi algoritma ALG, her girdide her şeyi önceden bilen en iyi çevrimdışı algoritma OPT ile karşılaştırılır.
  • ALG, c-rekabetçidir (c-competitive), eğer her istek dizisi σ için
    ALG(σ) ≤ c · OPT(σ) + α
    koşulu sağlanır (α: σ'dan bağımsız sabit; α = 0 ise kesin rekabetçi).
  • En küçük böyle c değerine rekabet oranı denir: c = supσ ALG(σ) / OPT(σ).
  • Oran ne kadar 1'e yakınsa, gelecek bilgisinin eksikliği o kadar az zarar verir.
Kötümser bakışAnaliz en kötü girdi üzerinedir: ortalama ya da olasılık varsayımı yoktur.
Maliyet problemiBurada maliyet en aza indirilir (c ≥ 1). Kazanç problemlerinde oran OPT / ALG olarak tanımlanır.

Rekabetçi Analiz

Düşman (Adversary) Modeli

Rekabet oranını alttan sınırlamak için algoritmaya karşı oynayan bir düşman düşünülür: girdiyi o üretir ve OPT'yi o çalıştırır.

Deterministik ALGDüşman algoritmanın kodunu bilir; her adımda ALG'nin en çok zarar göreceği isteği üretir.
Habersiz düşman(oblivious) Rastgele algoritmanın yazı-tura sonuçlarını göremez; diziyi baştan seçer. Beklenen ALG maliyeti ölçülür.
Uyarlanır düşman(adaptive) ALG'nin rastgele kararlarını görerek sonraki isteği seçer; rastgeleliğin faydası azalır.
Kanıt kalıbı: "Hiçbir deterministik algoritma c'den iyi olamaz" demek için, her ALG'ye karşı ALG(σ) / OPT(σ) ≥ c yapan bir σ dizisi kurulur.

Kayak Kiralama

Kayak Kiralama Problemi (Ski Rental)

  • Kayak takımı günlüğü 1 TL'ye kiralanabilir ya da B TL'ye satın alınabilir.
  • Kaç gün kayak yapılacağı (d) bilinmez: her sabah "bugün de kayacak mıyım?" sorusu yanıtlanır. Hava bozarsa sezon biter.
  • Her gün karar: bugün de kirala mı, yoksa satın al mı?
  • Geleceği bilen OPT kolaydır: OPT(d) = min(d, B).
010195101520başa başOPT

B = 10; yatay eksen gerçek gün sayısı d. En kötü oran d = B'de: 19/10 = 2 − 1/B.

Hep kiralad → ∞ iken maliyet d, OPT = B: oran sınırsız.
İlk gün satın ald = 1 iken maliyet B, OPT = 1: oran B.
Başa baş (break-even)B − 1 gün kirala, B. gün satın al: oran 2 − 1/B.

Aynı yapı: bulut sunucusunu saatlik mi kiralayalım, yıllık mı alalım; TCP bağlantısını açık mı tutalım, kapatalım mı.

Kayak Kiralama

Stratejilerin Maliyeti (B = 10)

05101520253005101520d (gün)maliyetOPT = min(d, 10)

Geleceği bilen OPT: d < 10 ise hep kiralar (maliyet d), d ≥ 10 ise ilk gün satın alır (maliyet 10).

05101520253005101520d (gün)maliyetOPT = min(d, 10)Hep kirala

Hep kirala: maliyet d. d büyüdükçe OPT = 10 sabitken maliyet sınırsız artar → rekabetçi değil.

05101520253005101520d (gün)maliyetOPT = min(d, 10)Hep kirala1. gün satın al

İlk gün satın al: maliyet hep 10. Ama d = 1 ise OPT = 1 → oran 10 = B. Kötü.

05101520253005101520d (gün)maliyetOPT = min(d, 10)Hep kirala1. gün satın alBaşa baş (10. gün al)

Başa baş: 9 gün kirala, 10. gün satın al. d < 10 iken OPT ile aynı; d ≥ 10 iken maliyet 9 + 10 = 19.

05101520253005101520d (gün)maliyetOPT = min(d, 10)Hep kirala1. gün satın alBaşa baş (10. gün al)ALG = 19OPT = 10

En kötü durum d = 10: ALG = 19, OPT = 10 → oran 1,9 = 2 − 1/B. Hiçbir d bundan kötü değildir.

Kayak Kiralama · Kodu adım adım çalıştır

Başa Baş Stratejisi: Kodu Adım Adım İzle

gün123456ALG = 0

B = 4 TL (satın alma), kira günlüğü 1 TL. Sezon aslında d = 6 gün sürecek; algoritma bunu bilmez, her sabah yalnızca "bugün de kayıyor muyum?" sorusunu görür.

gün1kira 123456ALG = 1

Gün 1: 1 < B → kirala. maliyet = 1.

gün1kira 12kira 13456ALG = 2

Gün 2: 2 < B → kirala. maliyet = 2.

gün1kira 12kira 13kira 1456ALG = 3

Gün 3: 3 < B → kirala. maliyet = 3.

gün1kira 12kira 13kira 14al 45kendi6kendiALG = 7

Gün 4 = B: kiraya verilen toplam B − 1 = 3 TL oldu; şimdi satın al: maliyet = 3 + 4 = 7.

gün1kira 12kira 13kira 14al 45kendi6kendiALG = 7

break: kayak artık bizim; 5. ve 6. günler bedava.

gün1kira 12kira 13kira 14al 45kendi6kendiALG = 7OPT = 4oran 7/4 = 1,75

ALG = 7, OPT = min(6, 4) = 4 (ilk gün satın almak). Oran 7/4 = 1,75 = 2 − 1/B. d ne olursa olsun oran bunu aşmaz.

int basaBas(int B, int d) {  // d bilinmez
  int maliyet = 0;
  for (int gun = 1; gun <= d; gun++) {
    if (gun < B) {
      maliyet += 1;             // kirala
    } else {
      maliyet += B;             // satın al
      break;                    // ücret biter
    }
  }
  return maliyet;
}

Kayak Kiralama

Neden Daha İyisi Yok? Alt Sınır

Her deterministik strateji tek bir sayı ile tanımlanır: k = satın alma günü.

  • Düşman: satın aldığınız günden sonra hava bozar, yani d = k.
  • ALG = (k − 1) kira + B, OPT = min(k, B).
  • k < B: oran (k − 1 + B) / k ≥ (2B − 1) / B.
  • k ≥ B: oran (k − 1 + B) / B ≥ (2B − 1) / B.
  • En iyisi k = B: oran 2 − 1/B.
Rastgele seçilen k ile beklenen oran e / (e − 1) ≈ 1,58'e iner (Karlin vd., 1994).
kkiraALGOPToran
1010110
211125,5
541452,8
981892
10919101,9
111020102
151424102,4
201929102,9

B = 10; d = k (düşmanın seçimi). Tablo, en kötü oranın k = B'de en küçük olduğunu gösterir.

Kayak Kiralama

Deneyin: Kayak Kiralama

Strateji: k − 1 gün kirala, k. gün hâlâ kayıyorsan satın al. En kötü oran, düşmanın d = k seçtiği durumdur.

Sayfalama

Sayfalama Problemi (Paging)

İşlemciistek:sayfa 4Önbellek (k = 3)701Yavaş bellek0 1 2 34 5 6 7…yükleçıkar
  • Hızlı bellek (önbellek, cache) k sayfa tutar; yavaş bellek sınırsızdır.
  • İstenen sayfa önbellekteyse isabet (hit, maliyet 0); değilse sayfa hatası (page fault, maliyet 1): sayfa yüklenir.
  • Önbellek doluysa hangi sayfa çıkarılacak? Gelecek istekler bilinmez: tipik bir çevrimiçi problem.
  • Amaç: toplam sayfa hatası sayısını en aza indirmek.

Sayfalama

Sayfa Çıkarma Politikaları

PolitikaHangi sayfayı çıkarır?Çevrimiçi?Rekabet oranı
FIFOÖnbelleğe en önce yüklenen sayfayı (kuyruk)evetk
LRUEn uzun süredir kullanılmayan sayfayı (least recently used)evetk
FWFHata olunca ve önbellek doluysa hepsini boşaltır (flush when full)evetk
LFUEn az sıklıkla kullanılan sayfayı (least frequently used)evetsınırsız
LIFOEn son yüklenen sayfayıevetsınırsız
OPT (MIN)Bir sonraki kullanımı en uzak gelecekte olanı (Belady, 1966)hayır1
OPT (longest forward distance) geleceği bilmeyi gerektirir; uygulanamaz ama karşılaştırma ölçütü olarak kullanılır. Kanıtlanabilir biçimde en az sayfa hatasını verir.

Sayfalama · Adım adım

FIFO Adım Adım

FIFO: önbellek bir kuyruk gibi davranır; en önce gelen ilk çıkar. İstek dizisi 7 0 1 2 0 3 0 4 2 3 0 3 2, k = 3. H: hata, ✓: isabet.

İstekÇ1Ç2Ç3Sonuç77H012030423032FIFO · k = 3 · sayfa hatası: 1

İstek 1: sayfa 7 yok → sayfa hatası; boş çerçeve Ç1'e yüklenir. Toplam hata: 1.

İstekÇ1Ç2Ç3Sonuç77H070H12030423032FIFO · k = 3 · sayfa hatası: 2

İstek 2: sayfa 0 yok → sayfa hatası; boş çerçeve Ç2'e yüklenir. Toplam hata: 2.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2030423032FIFO · k = 3 · sayfa hatası: 3

İstek 3: sayfa 1 yok → sayfa hatası; boş çerçeve Ç3'e yüklenir. Toplam hata: 3.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H030423032FIFO · k = 3 · sayfa hatası: 4

İstek 4: sayfa 2 yok → sayfa hatası; en önce yüklenen 7 çıkarılır. Toplam hata: 4.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓30423032FIFO · k = 3 · sayfa hatası: 4

İstek 5: sayfa 0 önbellekte → isabet. FIFO sırası değişmez. Toplam hata: 4.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0423032FIFO · k = 3 · sayfa hatası: 5

İstek 6: sayfa 3 yok → sayfa hatası; en önce yüklenen 0 çıkarılır. Toplam hata: 5.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H423032FIFO · k = 3 · sayfa hatası: 6

İstek 7: sayfa 0 yok → sayfa hatası; en önce yüklenen 1 çıkarılır. Toplam hata: 6.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H4430H23032FIFO · k = 3 · sayfa hatası: 7

İstek 8: sayfa 4 yok → sayfa hatası; en önce yüklenen 2 çıkarılır. Toplam hata: 7.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H4430H2420H3032FIFO · k = 3 · sayfa hatası: 8

İstek 9: sayfa 2 yok → sayfa hatası; en önce yüklenen 3 çıkarılır. Toplam hata: 8.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H4430H2420H3423H032FIFO · k = 3 · sayfa hatası: 9

İstek 10: sayfa 3 yok → sayfa hatası; en önce yüklenen 0 çıkarılır. Toplam hata: 9.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H4430H2420H3423H0023H32FIFO · k = 3 · sayfa hatası: 10

İstek 11: sayfa 0 yok → sayfa hatası; en önce yüklenen 4 çıkarılır. Toplam hata: 10.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H4430H2420H3423H0023H3023✓2FIFO · k = 3 · sayfa hatası: 10

İstek 12: sayfa 3 önbellekte → isabet. FIFO sırası değişmez. Toplam hata: 10.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3231H0230H4430H2420H3423H0023H3023✓2023✓FIFO · k = 3 · sayfa hatası: 10

İstek 13: sayfa 2 önbellekte → isabet. FIFO sırası değişmez. Toplam hata: 10.

Sayfalama · Adım adım

LRU Adım Adım

LRU: her sayfanın son kullanım zamanı izlenir; en eskisi çıkar. İstek dizisi 7 0 1 2 0 3 0 4 2 3 0 3 2, k = 3. H: hata, ✓: isabet.

İstekÇ1Ç2Ç3Sonuç77H012030423032LRU · k = 3 · sayfa hatası: 1

İstek 1: sayfa 7 yok → sayfa hatası; boş çerçeve Ç1'e yüklenir. Toplam hata: 1.

İstekÇ1Ç2Ç3Sonuç77H070H12030423032LRU · k = 3 · sayfa hatası: 2

İstek 2: sayfa 0 yok → sayfa hatası; boş çerçeve Ç2'e yüklenir. Toplam hata: 2.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2030423032LRU · k = 3 · sayfa hatası: 3

İstek 3: sayfa 1 yok → sayfa hatası; boş çerçeve Ç3'e yüklenir. Toplam hata: 3.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H030423032LRU · k = 3 · sayfa hatası: 4

İstek 4: sayfa 2 yok → sayfa hatası; en uzun süredir kullanılmayan 7 çıkarılır. Toplam hata: 4.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓30423032LRU · k = 3 · sayfa hatası: 4

İstek 5: sayfa 0 önbellekte → isabet. 0 artık en yeni kullanılan sayfa. Toplam hata: 4.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0423032LRU · k = 3 · sayfa hatası: 5

İstek 6: sayfa 3 yok → sayfa hatası; en uzun süredir kullanılmayan 1 çıkarılır. Toplam hata: 5.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓423032LRU · k = 3 · sayfa hatası: 5

İstek 7: sayfa 0 önbellekte → isabet. 0 artık en yeni kullanılan sayfa. Toplam hata: 5.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4403H23032LRU · k = 3 · sayfa hatası: 6

İstek 8: sayfa 4 yok → sayfa hatası; en uzun süredir kullanılmayan 2 çıkarılır. Toplam hata: 6.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4403H2402H3032LRU · k = 3 · sayfa hatası: 7

İstek 9: sayfa 2 yok → sayfa hatası; en uzun süredir kullanılmayan 3 çıkarılır. Toplam hata: 7.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4403H2402H3432H032LRU · k = 3 · sayfa hatası: 8

İstek 10: sayfa 3 yok → sayfa hatası; en uzun süredir kullanılmayan 0 çıkarılır. Toplam hata: 8.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4403H2402H3432H0032H32LRU · k = 3 · sayfa hatası: 9

İstek 11: sayfa 0 yok → sayfa hatası; en uzun süredir kullanılmayan 4 çıkarılır. Toplam hata: 9.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4403H2402H3432H0032H3032✓2LRU · k = 3 · sayfa hatası: 9

İstek 12: sayfa 3 önbellekte → isabet. 3 artık en yeni kullanılan sayfa. Toplam hata: 9.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4403H2402H3432H0032H3032✓2032✓LRU · k = 3 · sayfa hatası: 9

İstek 13: sayfa 2 önbellekte → isabet. 2 artık en yeni kullanılan sayfa. Toplam hata: 9.

Sayfalama · Adım adım

OPT Adım Adım

OPT: geleceği bilir; bir sonraki kullanımı en uzak olan sayfayı çıkarır. İstek dizisi 7 0 1 2 0 3 0 4 2 3 0 3 2, k = 3. H: hata, ✓: isabet.

İstekÇ1Ç2Ç3Sonuç77H012030423032OPT · k = 3 · sayfa hatası: 1

İstek 1: sayfa 7 yok → sayfa hatası; boş çerçeve Ç1'e yüklenir. Toplam hata: 1.

İstekÇ1Ç2Ç3Sonuç77H070H12030423032OPT · k = 3 · sayfa hatası: 2

İstek 2: sayfa 0 yok → sayfa hatası; boş çerçeve Ç2'e yüklenir. Toplam hata: 2.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2030423032OPT · k = 3 · sayfa hatası: 3

İstek 3: sayfa 1 yok → sayfa hatası; boş çerçeve Ç3'e yüklenir. Toplam hata: 3.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H030423032OPT · k = 3 · sayfa hatası: 4

İstek 4: sayfa 2 yok → sayfa hatası; 7 bir daha hiç istenmiyor → çıkarılır. Toplam hata: 4.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓30423032OPT · k = 3 · sayfa hatası: 4

İstek 5: sayfa 0 önbellekte → isabet. Toplam hata: 4.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0423032OPT · k = 3 · sayfa hatası: 5

İstek 6: sayfa 3 yok → sayfa hatası; 1 bir daha hiç istenmiyor → çıkarılır. Toplam hata: 5.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓423032OPT · k = 3 · sayfa hatası: 5

İstek 7: sayfa 0 önbellekte → isabet. Toplam hata: 5.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4243H23032OPT · k = 3 · sayfa hatası: 6

İstek 8: sayfa 4 yok → sayfa hatası; bir sonraki kullanımı en uzak olan 0 (11. istek) çıkarılır. Toplam hata: 6.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4243H2243✓3032OPT · k = 3 · sayfa hatası: 6

İstek 9: sayfa 2 önbellekte → isabet. Toplam hata: 6.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4243H2243✓3243✓032OPT · k = 3 · sayfa hatası: 6

İstek 10: sayfa 3 önbellekte → isabet. Toplam hata: 6.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4243H2243✓3243✓0203H32OPT · k = 3 · sayfa hatası: 7

İstek 11: sayfa 0 yok → sayfa hatası; 4 bir daha hiç istenmiyor → çıkarılır. Toplam hata: 7.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4243H2243✓3243✓0203H3203✓2OPT · k = 3 · sayfa hatası: 7

İstek 12: sayfa 3 önbellekte → isabet. Toplam hata: 7.

İstekÇ1Ç2Ç3Sonuç77H070H1701H2201H0201✓3203H0203✓4243H2243✓3243✓0203H3203✓2203✓OPT · k = 3 · sayfa hatası: 7

İstek 13: sayfa 2 önbellekte → isabet. Toplam hata: 7.

Sayfalama

Üç Politikanın Karşılaştırması

PolitikaSayfa hatasıİsabetALG / OPTGerekli bilgi
FIFO1031,43Yükleme sırası (kuyruk)
LRU941,29Son kullanım zamanı
OPT761Tüm gelecek istekler
  • İlk k = 3 hata kaçınılmazdır (zorunlu / soğuk hatalar, compulsory misses): her politika öder.
  • LRU, yerellik (locality of reference) olan dizilerde iyidir: yakın geçmişte kullanılan sayfa yakında yine kullanılır. Burada 0 sayfası sık istendiği için FIFO onu gereksiz yere çıkarır.
  • Gerçek sistemlerde LRU'ya yakın, ucuz yaklaşımlar kullanılır: saat algoritması (clock / ikinci şans).

Sayfalama · Kodu adım adım çalıştır

LRU: Kodu Adım Adım İzle

istek:123142onb:en eskien yeni

Önbellek boş, hata = 0. Liste başı en eski, sonu en yeni kullanılan sayfa.

istek:123142onb:en eskien yeni

Sayfa 1 listede yok: remove false → else dalı.

istek:123142onb:en eskien yeni

hata = 1. Önbellekte yer var (boyut 0 < 3) → çıkarma yok.

istek:123142onb:1en eskien yeni

Sayfa 1 sona eklenir.

istek:123142onb:1en eskien yeni

Sayfa 2 listede yok: remove false → else dalı.

istek:123142onb:1en eskien yeni

hata = 2. Önbellekte yer var (boyut 1 < 3) → çıkarma yok.

istek:123142onb:12en eskien yeni

Sayfa 2 sona eklenir.

istek:123142onb:12en eskien yeni

Sayfa 3 listede yok: remove false → else dalı.

istek:123142onb:12en eskien yeni

hata = 3. Önbellekte yer var (boyut 2 < 3) → çıkarma yok.

istek:123142onb:123en eskien yeni

Sayfa 3 sona eklenir.

istek:123142onb:23en eskien yeni

Sayfa 1 listede: remove true döner ve onu listeden çıkarır → isabet.

istek:123142onb:231en eskien yeni

Sayfa 1 sona eklenir: artık en yeni kullanılan.

istek:123142onb:231en eskien yeni

Sayfa 4 listede yok: remove false → else dalı.

istek:123142onb:31en eskien yeniçıkan: 2

hata = 4. Önbellek dolu → baştaki (en eski kullanılan) 2 çıkarılır.

istek:123142onb:314en eskien yeni

Sayfa 4 sona eklenir.

istek:123142onb:314en eskien yeni

Sayfa 2 listede yok: remove false → else dalı.

istek:123142onb:14en eskien yeniçıkan: 3

hata = 5. Önbellek dolu → baştaki (en eski kullanılan) 3 çıkarılır.

istek:123142onb:142en eskien yeni

Sayfa 2 sona eklenir.

istek:123142onb:142en eskien yeni

Dizi bitti: 6 istekte 5 sayfa hatası, 1 isabet. remove listeyi taradığı için her istek O(k); HashMap + çift bağlı liste ile O(1) olur.

int lruHata(int[] istekler, int k) {
  var onb = new LinkedList<Integer>();
  int hata = 0;
  for (int sayfa : istekler) {
    if (onb.remove((Integer) sayfa)) {
      onb.addLast(sayfa); // en yeni yap
    } else {
      hata++;
      if (onb.size() == k)
        onb.removeFirst(); // en eskiyi at
      onb.addLast(sayfa);
    }
  }
  return hata;
}

Sayfalama

LRU Önbelleği: O(1) Uygulama

class LruOnbellek<A, D>
    extends LinkedHashMap<A, D> {
  private final int k;

  LruOnbellek(int k) {
    super(16, 0.75f, true); // erişim sırası
    this.k = k;
  }

  @Override
  protected boolean removeEldestEntry(
      Map.Entry<A, D> enEski) {
    return size() > k;      // k aşılınca at
  }
}
  • LinkedHashMap = hash tablosu + çift bağlı liste.
  • true (accessOrder): her get/put öğeyi listenin sonuna taşır.
  • removeEldestEntry: boyut k'yı aşınca baştaki (en eski kullanılan) silinir.
  • Bul, taşı, sil: hepsi O(1); bellek O(k).
FIFO için aynı sınıf false (insertion order) ile kurulur: erişim sırayı değiştirmez.

Sayfalama

Teorem: Deterministik Alt Sınır k

  • k + 1 farklı sayfa yeter. Düşman her adımda ALG'nin önbelleğinde olmayan tek sayfayı ister → ALG her istekte hata yapar.
  • OPT (en uzağı çıkar) bir hata yaptığında, çıkardığı sayfa en az k − 1 istek boyunca istenmez → OPT en çok k istekte bir hata yapar.
  • Sonuç: ALG / OPT → k (Sleator ve Tarjan, 1985).
Örnekte (k = 3, LRU'ya karşı): LRU 12 hata, OPT 6 hata; ilk 3 zorunlu hata dışarıda tutulursa 9'a 3.
İstekÇ1Ç2Ç3Sonuç11H212H3123H4423H1413H2412H3312H4342H1341H2241H3231H4234HLRU · k = 3 · sayfa hatası: 12İstekÇ1Ç2Ç3Sonuç11H212H3123H4124H1124✓2124✓3134H4134✓1134✓2234H3234✓4234✓OPT · k = 3 · sayfa hatası: 6

Sayfalama

Teorem: LRU (ve FIFO) k-Rekabetçidir

701evre 12030evre 2423evre 3032evre 4
  • Diziyi evrelere (phase) böl: her evre, k farklı sayfa içeren en uzun parça; (k + 1). farklı sayfa yeni evreyi başlatır.
  • LRU, bir evrede en çok k hata yapar: evrede istenen bir sayfa, evre bitene kadar çıkarılmaz (ondan daha eski kullanılmış en az bir sayfa hep vardır). Her farklı sayfa en çok bir kez hata verir.
  • OPT, ardışık iki evre başına en az 1 hata yapar: bir evrenin 2. isteğinden sonraki evrenin 1. isteğine kadar k + 1 farklı sayfa istenir; k çerçeveye sığmaz.
  • m evre için LRU ≤ k · m, OPT ≥ m − 1 → LRU ≤ k · OPT + k.
Örnek dizide 4 evre: LRU = 9 ≤ 3 · 4, OPT = 7 ≥ 3. Teori en kötü durumu sınırlar; gerçek dizilerde yerellik sayesinde LRU, OPT'ye çok daha yakındır.

Sayfalama

Belady Anomalisi: Daha Çok Bellek, Daha Çok Hata

İstekÇ1Ç2Ç3Sonuç11H212H3123H4423H1413H2412H5512H1512✓2512✓3532H4534H5534✓FIFO · k = 3 · sayfa hatası: 9İstekÇ1Ç2Ç3Ç4Sonuç11H212H3123H41234H11234✓21234✓55234H15134H25124H35123H44123H54523HFIFO · k = 4 · sayfa hatası: 10
  • Dizi: 1 2 3 4 1 2 5 1 2 3 4 5.
  • FIFO, k = 3: 9 hata; k = 4: 10 hata. Önbellek büyüdü, hata arttı!
  • LRU aynı dizide: k = 3 → 10, k = 4 → 8. LRU ve OPT bir yığın algoritmasıdır (stack algorithm): k çerçevedeki sayfalar, k + 1 çerçevedekilerin alt kümesidir → anomali olmaz.

Sayfalama · Kodu adım adım çalıştır

Belady Dizisinde FIFO: Kodu Adım Adım İzle

123412512345kuyruken eskihata = 0

Belady dizisi 1 2 3 4 1 2 5 1 2 3 4 5, k = 3. Kuyruk yükleme sırasını, küme hızlı "var mı?" sorgusunu tutar.

1H23412512345kuyruken eski1hata = 1

p = 1 yok → hata 1 (zorunlu hata); yer var, kuyruğa eklenir.

1H2H3412512345kuyruken eski12hata = 2

p = 2 yok → hata 2 (zorunlu hata); yer var, kuyruğa eklenir.

1H2H3H412512345kuyruken eski123hata = 3

p = 3 yok → hata 3 (zorunlu hata); yer var, kuyruğa eklenir.

1H2H3H4H12512345kuyruken eski234çıkan 1hata = 4

p = 4 yok → hata 4. Önbellek dolu: en önce yüklenen 1 çıkar, 4 kuyruğun sonuna girer.

1H2H3H4H1H2512345kuyruken eski341çıkan 2hata = 5

p = 1 yok → hata 5. Önbellek dolu: en önce yüklenen 2 çıkar, 1 kuyruğun sonuna girer.

1H2H3H4H1H2H512345kuyruken eski412çıkan 3hata = 6

p = 2 yok → hata 6. Önbellek dolu: en önce yüklenen 3 çıkar, 2 kuyruğun sonuna girer.

1H2H3H4H1H2H5H12345kuyruken eski125çıkan 4hata = 7

p = 5 yok → hata 7. Önbellek dolu: en önce yüklenen 4 çıkar, 5 kuyruğun sonuna girer.

1H2H3H4H1H2H5H1✓2345kuyruken eski125hata = 7

p = 1 önbellekte → isabet. FIFO'da isabet kuyruk sırasını değiştirmez.

1H2H3H4H1H2H5H1✓2✓345kuyruken eski125hata = 7

p = 2 önbellekte → isabet. FIFO'da isabet kuyruk sırasını değiştirmez.

1H2H3H4H1H2H5H1✓2✓3H45kuyruken eski253çıkan 1hata = 8

p = 3 yok → hata 8. Önbellek dolu: en önce yüklenen 1 çıkar, 3 kuyruğun sonuna girer.

1H2H3H4H1H2H5H1✓2✓3H4H5kuyruken eski534çıkan 2hata = 9

p = 4 yok → hata 9. Önbellek dolu: en önce yüklenen 2 çıkar, 4 kuyruğun sonuna girer.

1H2H3H4H1H2H5H1✓2✓3H4H5✓kuyruken eski534hata = 9

p = 5 önbellekte → isabet. FIFO'da isabet kuyruk sırasını değiştirmez.

1H2H3H4H1H2H5H1✓2✓3H4H5✓kuyruken eski534hata = 9

return 9. Aynı kod k = 4 ile 10 hata verir: çerçeve artınca hata da arttı (Belady anomalisi).

int fifoHata(int[] istekler, int k) {
  Queue<Integer> kuyruk = new LinkedList<>();
  Set<Integer> kume = new HashSet<>();
  int hata = 0;
  for (int p : istekler) {
    if (kume.contains(p)) continue;   // isabet
    hata++;
    if (kume.size() == k)
      kume.remove(kuyruk.poll()); // en eski
    kuyruk.offer(p); kume.add(p);
  }
  return hata;
}

Sayfalama

Rastgele Sayfalama: İşaretleme Algoritması

İşaretleme (Marking)

  1. Evre başında tüm sayfaların işaretini kaldır.
  2. İstenen sayfayı işaretle (isabet ya da hata).
  3. Hata olursa işaretsiz sayfalardan birini rastgele çıkar.
  4. Tüm sayfalar işaretliyse yeni evre başlar (adım 1).

Sonuçlar

  • Habersiz düşmana karşı beklenen oran 2Hk (Fiat vd., 1991).
  • Hk = 1 + 1/2 + … + 1/k ≈ ln k. k = 8 için H8 ≈ 2,72 → oran ≈ 5,4 (deterministikte 8).
  • Hiçbir rastgele algoritma Hk'dan iyi olamaz.
  • LRU da bir işaretleme algoritmasıdır (en eski işaretsizi seçer).
7012030423032evre 1: {0, 1, 7}evre 2: {0, 2, 3}evre 3: {2, 3, 4}evre 4: {0, 2, 3}k = 3: her evre en çok k farklı sayfa içerir; (k + 1). farklı sayfa yeni evreyi başlatır
Rastgelelik, düşmanın "ALG'nin önbelleğinde olmayan sayfayı iste" stratejisini bozar: hangi sayfanın çıktığını bilemez.

Sayfalama · Kodu adım adım çalıştır

İşaretleme Algoritması: Kodu Adım Adım İzle

7012030423032önbellek7•hata = 1evre 1

İstekler 7 0 1 2 0 3 0 4 2 3 0 3 2, k = 3. p = 7 yok → hata 1; önbelleğe eklenir ve işaretlenir (•).

7012030423032önbellek0•7•hata = 2evre 1

p = 0 yok → hata 2 (zorunlu); yer var, eklenip işaretlenir.

7012030423032önbellek0•1•7•hata = 3evre 1

p = 1 yok → hata 3 (zorunlu); yer var, eklenip işaretlenir.

7012030423032önbellek012•adaylar [0, 1, 7] → çıkan 7hata = 4evre 2

Tüm sayfalar işaretliydi → yeni evre: işaretler silinir. p = 2 yok → hata 4. İşaretsiz adaylar [0, 1, 7] arasından rastgele 7 çıkar.

7012030423032önbellek0•12•hata = 4evre 2

p = 0 önbellekte → isabet; yalnızca işaretlenir (•).

7012030423032önbellek0•2•3•adaylar [1] → çıkan 1hata = 5evre 2

p = 3 yok → hata 5. İşaretsiz adaylar [1] arasından rastgele 1 çıkar.

7012030423032önbellek0•2•3•hata = 5evre 2

p = 0 önbellekte → isabet; yalnızca işaretlenir (•).

7012030423032önbellek024•adaylar [0, 2, 3] → çıkan 3hata = 6evre 3

Tüm sayfalar işaretliydi → yeni evre: işaretler silinir. p = 4 yok → hata 6. İşaretsiz adaylar [0, 2, 3] arasından rastgele 3 çıkar.

7012030423032önbellek02•4•hata = 6evre 3

p = 2 önbellekte → isabet; yalnızca işaretlenir (•).

7012030423032önbellek2•3•4•adaylar [0] → çıkan 0hata = 7evre 3

p = 3 yok → hata 7. İşaretsiz adaylar [0] arasından rastgele 0 çıkar.

7012030423032önbellek0•34adaylar [2, 3, 4] → çıkan 2hata = 8evre 4

Tüm sayfalar işaretliydi → yeni evre: işaretler silinir. p = 0 yok → hata 8. İşaretsiz adaylar [2, 3, 4] arasından rastgele 2 çıkar.

7012030423032önbellek0•3•4hata = 8evre 4

p = 3 önbellekte → isabet; yalnızca işaretlenir (•).

7012030423032önbellek0•2•3•adaylar [4] → çıkan 4hata = 9evre 4

p = 2 yok → hata 9. İşaretsiz adaylar [4] arasından rastgele 4 çıkar.

7012030423032önbellek0•2•3•hata = 9evre 4

return 9. Bu çekilişlerle işaretleme 9 hata yaptı (LRU 9, FIFO 10, OPT 7); başka tohumla sonuç değişebilir.

int isaretleme(int[] istekler, int k) {
  Set<Integer> onb = new HashSet<>();
  Set<Integer> isr = new HashSet<>();   // işaretli
  int hata = 0;
  for (int p : istekler) {
    if (!onb.contains(p)) {
      hata++;
      if (onb.size() == k) {
        if (isr.size() == k) isr.clear(); // yeni evre
        List<Integer> aday = new ArrayList<>(onb);
        aday.removeAll(isr);          // işaretsizler
        int i = zar.nextInt(aday.size());
        onb.remove(aday.get(i));
      }
      onb.add(p);
    }
    isr.add(p);
  }
  return hata;
}

Sayfalama

Deneyin: Sayfalama Politikaları

0–9 arası rakamlar, boşlukla ayrılmış (en çok 16 istek). Turuncu hücre: yeni yüklenen sayfa · yeşil: isabet. Enter = yeniden çalıştır.

Liste Güncelleme

Liste Güncelleme Problemi (List Update)

  • n öğeli bir bağlı liste; i. konumdaki öğeye erişmenin maliyeti i'dir (baştan taranır).
  • Erişilen öğe, erişimden sonra ücretsiz olarak öne doğru taşınabilir.
  • İstekler çevrimiçi gelir: hangi öğenin sık isteneceği bilinmez.
Öne taşı (MTF)Move-to-front: erişilen öğe listenin başına alınır.
Yer değiştirTranspose: erişilen öğe bir önceki ile yer değiştirir.
Sıklık sayacıFrequency count: öğeler erişim sayısına göre azalan sırada tutulur.
erişim DAmaliyet 1Bmaliyet 2Cmaliyet 3Dmaliyet 4Emaliyet 54 öderMTF sonrasıDmaliyet 1Amaliyet 2Bmaliyet 3Cmaliyet 4Emaliyet 5sonraki D: 1
Uygulamalar: kendini düzenleyen listeler (self-organizing lists), hash tablosu kovalarındaki zincirler, MTF dönüşümü ile veri sıkıştırma (bzip2).

Liste Güncelleme · Adım adım

Öne Taşı (MTF) Adım Adım

Başlangıç listesi A B C D E; istekler E D E A D E.

öncesonraA1B2C3D4E5EABCDistek: Emaliyet: 5toplam: 5

İstek E: 5. konumda → maliyet 5; başa taşınır. Toplam: 5.

öncesonraE1A2B3C4D5DEABCistek: Dmaliyet: 5toplam: 10

İstek D: 5. konumda → maliyet 5; başa taşınır. Toplam: 10.

öncesonraD1E2A3B4C5EDABCistek: Emaliyet: 2toplam: 12

İstek E: 2. konumda → maliyet 2; başa taşınır. Toplam: 12.

öncesonraE1D2A3B4C5AEDBCistek: Amaliyet: 3toplam: 15

İstek A: 3. konumda → maliyet 3; başa taşınır. Toplam: 15.

öncesonraA1E2D3B4C5DAEBCistek: Dmaliyet: 3toplam: 18

İstek D: 3. konumda → maliyet 3; başa taşınır. Toplam: 18.

öncesonraD1A2E3B4C5EDABCistek: Emaliyet: 3toplam: 21

İstek E: 3. konumda → maliyet 3; başa taşınır. Toplam: 21. Aynı dizide hiç taşımayan liste 24, transpoz (transpose) 26 öder.

StratejiEDEADEToplam
Öne taşı (MTF)55233321
Taşıma yok54514524
Yer değiştir55515526

Liste Güncelleme

Teorem: MTF 2-Rekabetçidir

  • Sleator ve Tarjan (1985): her istek dizisi σ için MTF(σ) ≤ 2 · OPT(σ) (yaklaşık; ücretli takaslar sayılmazsa).
  • Kanıt fikri: potansiyel fonksiyonu Φ = MTF listesi ile OPT listesi arasındaki ters sıralı çift (inversion) sayısı. Her erişimde MTF'nin gerçek maliyeti + ΔΦ ≤ 2 · (OPT maliyeti) − 1. Bu, amortize analizdir.

Yer değiştir rekabetçi değil

  • Son iki öğe sırayla istenir: xn, xn−1, xn, … Her erişim yerini değiştirir ama hep n. ve (n−1). konumda kalır → istek başına ≈ n. MTF ise ilk ikisinden sonra istek başına 2 öder.

Sıklık sayacı da değil

  • Önce x1 n kez, x2 n − 1 kez, … istenir; sonra ters sırada. Sayaç eski sırayı uzun süre korur; maliyet Θ(n) kat kötüleşebilir.

Veri Akışları

Veri Akışı (Data Stream) Modeli

  • Öğeler x1, x2, … tek tek gelir; akış çok uzun ya da sonsuz olabilir.
  • Her öğeye bir kez bakılır (tek geçiş); geçmiş tümüyle saklanamaz.
  • Her an bir sorunun cevabı hazır olmalı: "şu ana kadarki ortalama / ortanca / bir örneklem nedir?"
ProblemSaklanan özetÖğe başınaBellek
Hareketli ortalama (son k)Kuyruk + toplamO(1)O(k)
Çevrimiçi ortancaMax-heap + min-heapO(log n)O(n)
Rezervuar örneklemek öğelik örneklemO(1)O(k)
Akışta örüntü aramaSon m karakter + kayan hashO(1)O(m)
Çalışan ortalaman ve μO(1)O(1)

Veri Akışları

Hareketli Ortalama (Moving Average)

  • Akıştaki son k öğenin ortalaması: sensör verisini yumuşatma, borsada 50 günlük ortalama.
  • Saf yöntem her seferinde k öğeyi toplar: O(k).
  • Akıllı yöntem: kayan pencere (sliding window). Toplamı tut; yeni öğe girerken ekle, en eski çıkarken çıkar: O(1).
toplam ← toplam − xt−k + xt
ortalama = toplam / min(t, k)
class HareketliOrtalama {
  private final int k;
  private final Queue<Integer> pencere
      = new LinkedList<>();
  private int toplam = 0;

  HareketliOrtalama(int k) { this.k = k; }

  double sonraki(int deger) {
    if (pencere.size() == k)
      toplam -= pencere.poll();
    pencere.offer(deger);
    toplam += deger;
    return toplam / (double) pencere.size();
  }
}

Veri Akışları · Kodu adım adım çalıştır

Hareketli Ortalama: Kodu Adım Adım İzle

akış:486210pencere:toplam = 0

Yeni değer 4. Pencerede 0 öğe var (< 3) → çıkarma yok.

akış:486210pencere:4toplam = 4

4 kuyruğa eklenir, toplama katılır: toplam = 4.

akış:486210pencere:4toplam = 4

Ortalama = 4 / 1 = 4.

akış:486210pencere:4toplam = 4

Yeni değer 8. Pencerede 1 öğe var (< 3) → çıkarma yok.

akış:486210pencere:48toplam = 12

8 kuyruğa eklenir, toplama katılır: toplam = 12.

akış:486210pencere:48toplam = 12

Ortalama = 12 / 2 = 6.

akış:486210pencere:48toplam = 12

Yeni değer 6. Pencerede 2 öğe var (< 3) → çıkarma yok.

akış:486210pencere:486toplam = 18

6 kuyruğa eklenir, toplama katılır: toplam = 18.

akış:486210pencere:486toplam = 18

Ortalama = 18 / 3 = 6.

akış:486210pencere:486toplam = 18

Yeni değer 2. Pencere dolu (boyut 3 = k) → en eski çıkarılacak.

akış:486210pencere:86çıkan: 4toplam = 14

En eski öğe 4 kuyruktan alınır, toplamdan çıkarılır: toplam = 14.

akış:486210pencere:862toplam = 16

2 kuyruğa eklenir, toplama katılır: toplam = 16.

akış:486210pencere:862toplam = 16

Ortalama = 16 / 3 = 5,33.

akış:486210pencere:862toplam = 16

Yeni değer 10. Pencere dolu (boyut 3 = k) → en eski çıkarılacak.

akış:486210pencere:62çıkan: 8toplam = 8

En eski öğe 8 kuyruktan alınır, toplamdan çıkarılır: toplam = 8.

akış:486210pencere:6210toplam = 18

10 kuyruğa eklenir, toplama katılır: toplam = 18.

akış:486210pencere:6210toplam = 18

Ortalama = 18 / 3 = 6.

double sonraki(int deger) {
  if (pencere.size() == k)
    toplam -= pencere.poll(); // en eski
  pencere.offer(deger);
  toplam += deger;
  return toplam / (double) pencere.size();
}

Veri Akışları

Çevrimiçi Ortanca (Running Median)

  • Her yeni öğeden sonra o ana kadarki ortanca (median) istenir.
  • Her seferinde sıralamak: O(n log n). Sıralı diziye eklemek: O(n).
  • İki heap: küçük yarı bir max-heap'te (sol), büyük yarı bir min-heap'te (sag).
  • Değişmezler: sol'daki her öğe ≤ sag'daki her öğe; |sol| = |sag| ya da |sol| = |sag| + 1.
  • Ortanca heap tepelerinden O(1)'de okunur; ekleme O(log n).
sol (max)tepe = 53 1≤ 5sag (min)tepe = 815≥ 8ortanca = 5 (5 öğe)
Sayı adedi tekse ortanca sol'un tepesi; çiftse iki tepenin ortalamasıdır. Java'da max-heap: new PriorityQueue<>((a, b) -> b - a).

Veri Akışları · Kodu adım adım çalıştır

Çevrimiçi Ortanca: Kodu Adım Adım İzle

akış:5151387sol(max)sag(min)5boş

x = 5: sol boş → sol heap'ine eklenir.

akış:5151387sol(max)sag(min)5boş

Boyutlar 1 ve 0: denge tamam, taşıma yok.

akış:5151387sol(max)sag(min)5boşortanca = 5

Öğe sayısı tek: ortanca = sol tepesi = 5.

akış:5151387sol(max)sag(min)515

x = 15: 15 > 5 → sag heap'ine eklenir.

akış:5151387sol(max)sag(min)515

Boyutlar 1 ve 1: denge tamam, taşıma yok.

akış:5151387sol(max)sag(min)515ortanca = 10

Öğe sayısı çift: ortanca = (5 + 15) / 2 = 10.

akış:5151387sol(max)sag(min)5115

x = 1: 1 ≤ 5 → sol heap'ine eklenir.

akış:5151387sol(max)sag(min)5115

Boyutlar 2 ve 1: denge tamam, taşıma yok.

akış:5151387sol(max)sag(min)5115ortanca = 5

Öğe sayısı tek: ortanca = sol tepesi = 5.

akış:5151387sol(max)sag(min)53115

x = 3: 3 ≤ 5 → sol heap'ine eklenir.

akış:5151387sol(max)sag(min)31515

Denge bozuldu (|sol| = 3, |sag| = 1): sol tepesi 5 sag heap'ine taşınır.

akış:5151387sol(max)sag(min)31515ortanca = 4

Öğe sayısı çift: ortanca = (3 + 5) / 2 = 4.

akış:5151387sol(max)sag(min)315815

x = 8: 8 > 3 → sag heap'ine eklenir.

akış:5151387sol(max)sag(min)531815

Denge bozuldu (|sol| = 2, |sag| = 3): sag tepesi 5 sol heap'ine taşınır.

akış:5151387sol(max)sag(min)531815ortanca = 5

Öğe sayısı tek: ortanca = sol tepesi = 5.

akış:5151387sol(max)sag(min)5317815

x = 7: 7 > 5 → sag heap'ine eklenir.

akış:5151387sol(max)sag(min)5317815

Boyutlar 3 ve 3: denge tamam, taşıma yok.

akış:5151387sol(max)sag(min)5317815ortanca = 6

Öğe sayısı çift: ortanca = (5 + 7) / 2 = 6.

void ekle(int x) {
  if (sol.isEmpty() || x <= sol.peek())
    sol.offer(x);          // küçük yarı
  else
    sag.offer(x);          // büyük yarı
  if (sol.size() > sag.size() + 1)
    sag.offer(sol.poll());
  else if (sag.size() > sol.size())
    sol.offer(sag.poll());
}
double ortanca() {
  if (sol.size() == sag.size())
    return (sol.peek() + sag.peek()) / 2.0;
  return sol.peek();
}

Veri Akışları

Rezervuar Örnekleme (Reservoir Sampling)

  • Uzunluğu bilinmeyen bir akıştan, her öğenin eşit olasılıkla seçildiği k öğeli bir örneklem tutmak.
  • Algoritma R (Vitter, 1985): ilk k öğeyi rezervuara koy. Sonra 0 tabanlı i. öğe için (i ≥ k) j = rastgele[0, i] seç; j < k ise rezervuar[j] ← xi.
  • i. öğe k / (i + 1) olasılıkla girer; girerse rastgele bir yerdeki öğeyi çıkarır.
Kanıt (n öğe sonunda her öğe k / n olasılıkla rezervuardadır): xi girer: k/(i+1). Sonraki her t > i adımında çıkarılmama olasılığı 1 − (k/(t+1)) · (1/k) = t/(t+1). Çarpım:
k/(i+1) · (i+1)/(i+2) · … · (n−1)/n = k / n
2/3girer·3/4t = 3 kalır·4/5t = 4 kalır=2/5k / n

Örnek: k = 2, n = 5, x2 öğesi.

İlk k öğe için de aynı: girme olasılığı 1, sonraki çarpım k/(k+1) · … · (n−1)/n = k/n. Bellek O(k), öğe başına O(1).

Veri Akışları · Kodu adım adım çalıştır

Rezervuar Örnekleme: Kodu Adım Adım İzle

akis:100201302403504605r:100201302

İlk k = 3 öğe (10, 20, 30) doğrudan rezervuara konur.

akis:100201302403504605r:100201302

i = 3 (değer 40): j = rastgele[0, 3] → j = 1 çıktı (bu izlemede sabitlendi).

akis:100201302403504605r:100401302

j = 1 < 3 → r[1] = 40 (20 çıkar). 40'in girme olasılığı 3/4.

akis:100201302403504605r:100401302

i = 4 (değer 50): j = rastgele[0, 4] → j = 4 çıktı (bu izlemede sabitlendi).

akis:100201302403504605r:100401302

j = 4 ≥ 3 → 50 rezervuara girmez; rezervuar değişmez.

akis:100201302403504605r:100401302

i = 5 (değer 60): j = rastgele[0, 5] → j = 0 çıktı (bu izlemede sabitlendi).

akis:100201302403504605r:600401302

j = 0 < 3 → r[0] = 60 (10 çıkar). 60'in girme olasılığı 3/6.

akis:100201302403504605r:600401302

Akış bitti: örneklem [60, 40, 30]. Başka j değerleriyle başka sonuç çıkar; her öğe 3/6 = 1/2 olasılıkla seçilir.

List<Integer> rezervuar(int[] akis, int k) {
  List<Integer> r = new ArrayList<>();
  for (int i = 0; i < k; i++) r.add(akis[i]);
  for (int i = k; i < akis.length; i++) {
    int j = rastgele.nextInt(i + 1); // 0..i
    if (j < k)
      r.set(j, akis[i]);
  }
  return r;
}

Veri Akışları · Kodu adım adım çalıştır

Akışta Örüntü Arama: Kayan Hash

C0A1B2D3A4B5h = 0hp = 6631 ("AB")

Örüntü "AB", m = 2, B = 101. gucu = 101m−1 = 101, hp = 65 · 101 + 66 = 6631. Akış "CABDAB" karakter karakter gelir; her yeni karakterde hyeni = (heski − cçıkan · Bm−1) · B + cgiren: baştan O(m) yerine O(1).

C0A1B2D3A4B5h = 67hp = 6631 ("AB")0·101 + 67

t = 0, c = C (67): pencere henüz dolmadı; h = 67.

C0A1B2D3A4B5h = 6832hp = 6631 ("AB")67·101 + 65

t = 1: Pencere doldu: "CA". h = 6832 ≠ hp → eşleşme yok.

C0A1B2D3A4B5h = 6631hp = 6631 ("AB")(6832 − 67·101)·101 + 66

t = 2: Çıkan C (67 · 101 çıkarılır), giren B. h = 6631 = hp ve karakterler de tutuyor → eşleşme: 1.

C0A1B2D3A4B5h = 6734hp = 6631 ("AB")(6631 − 65·101)·101 + 68

t = 3: Çıkan A (65 · 101 çıkarılır), giren D. h = 6734 ≠ hp → eşleşme yok.

C0A1B2D3A4B5h = 6933hp = 6631 ("AB")(6734 − 66·101)·101 + 65

t = 4: Çıkan B (66 · 101 çıkarılır), giren A. h = 6933 ≠ hp → eşleşme yok.

C0A1B2D3A4B5h = 6631hp = 6631 ("AB")(6933 − 68·101)·101 + 66

t = 5: Çıkan D (68 · 101 çıkarılır), giren B. h = 6631 = hp ve karakterler de tutuyor → eşleşme: 4. Hash eşitliği yetmez: çakışma olabileceği için karakterler de karşılaştırılır.

void ara(String akis, String oruntu) {
  int m = oruntu.length(), B = 101, h = 0, hp = 0;
  int gucu = 1;                         // B^(m-1)
  for (int i = 0; i < m - 1; i++) gucu *= B;
  for (int i = 0; i < m; i++)
    hp = hp * B + oruntu.charAt(i);
  for (int t = 0; t < akis.length(); t++) {
    char c = akis.charAt(t);
    if (t >= m) h -= akis.charAt(t - m) * gucu;
    h = h * B + c;          // giren eklenir
    if (t >= m - 1 && h == hp
        && akis.startsWith(oruntu, t - m + 1))
      System.out.println("eşleşme: " + (t - m + 1));
  }
}

Artımlı Öğrenme · Adım adım

Artımlı Öğrenme (Incremental Learning)

Özgün veriMODEL 1Artımlı öğrenme (zaman)

Başlangıçta model özgün veri kümesi ile eğitilir: MODEL 1.

Özgün veriMODEL 1Yeni veri 1öğrenmeArtımlı öğrenme (zaman)

Yeni veri 1 gelir. Tüm veriyle baştan eğitmek yerine model yalnızca yeni veriyle güncellenir.

Özgün veriMODEL 1Yeni veri 1öğrenmeMODEL 2Artımlı öğrenme (zaman)

MODEL 2 hem eski hem yeni verideki bilgiyi temsil eder; eski veri yeniden işlenmez.

Özgün veriMODEL 1Yeni veri 1öğrenmeMODEL 2Yeni veri 2öğrenmeArtımlı öğrenme (zaman)

Yeni veri 2 gelir; aynı güncelleme tekrarlanır.

Özgün veriMODEL 1Yeni veri 1öğrenmeMODEL 2Yeni veri 2öğrenmeMODEL 3Artımlı öğrenme (zaman)

MODEL 3 üç veri kümesinin bilgisini taşır. Model hep güncel, maliyet yalnızca yeni veri kadardır.

Artımlı Öğrenme

Artımlı Güncelleme ve Zorlukları

Çalışan ortalama

Ortalama yeni öğeyle güncellenir; geçmişi saklamaya gerek yoktur:

μn = μn−1 + (xn − μn−1) / n

Akış 4, 8, 6: μ = 4 → 4 + (8 − 4)/2 = 6 → 6 + (6 − 6)/3 = 6.

Çevrimiçi gradyan inişi

w ← w − η · ∇ℓ(w; xt, yt)

Her örnek bir kez kullanılır; η: öğrenme oranı.

Zorluklar

  • Felaket boyutunda unutma (catastrophic forgetting): yeni veriye uyum sağlarken eski bilgi kaybolur.
  • Kavram kayması (concept drift): verinin dağılımı zamanla değişir; eski veri yanıltıcı olabilir.
  • Sıra etkisi: veri hangi sırayla gelirse model ona göre şekillenir.
  • Gürültü: tek bir aykırı örnek modeli bozabilir; küçük η ve kayan pencere yardımcı olur.

Özet

Problemler ve Sonuçlar

ProblemÇevrimiçi algoritmaSonuçNot
Kayak kiralamaB − 1 gün kirala, sonra al2 − 1/Bdeterministikte en iyi; rastgele e/(e−1)
SayfalamaLRU, FIFO, FWFkdeterministikte en iyi
SayfalamaLFU, LIFOsınırsızrekabetçi değil
Sayfalama (rastgele)İşaretleme2Hkalt sınır Hk
Liste güncellemeÖne taşı (MTF)2transpoz ve sıklık sayacı rekabetçi değil
Hareketli ortalamaKuyruk + toplamO(1)bellek O(k)
Çevrimiçi ortancaİki heapO(log n)ortanca okuma O(1)
Rezervuar örneklemeAlgoritma RO(1)her öğe k/n olasılıkla

Üst beş satırdaki sayılar rekabet oranı; alttakiler öğe başına zamandır.

Özet

Özet

KonuHatırlanacaklar
Modelgirdi parça parça gelir; karar hemen verilir ve geri alınamaz
Rekabet oranıALG(σ) ≤ c · OPT(σ) + α, her σ için; en kötü durum analizi, düşman modeli
Kayak kiralamaOPT = min(d, B); başa baş stratejisi 2 − 1/B; daha iyi deterministik strateji yok
SayfalamaFIFO, LRU k-rekabetçi; OPT en uzak geleceği çıkarır; FIFO'da Belady anomalisi
Liste güncellememaliyet = konum; MTF 2-rekabetçi (potansiyel fonksiyonu: ters çiftler)
Veri akışlarıtek geçiş, az bellek: kayan pencere, iki heap, rezervuar, kayan hash
Artımlı öğrenmemodel yeni veriyle güncellenir; unutma ve kavram kayması zorlukları

Özet

Sık Yapılan Hatalar

"Çevrimiçi = internet" sanmakÇevrimiçi algoritma, girdinin zamanla açığa çıktığı modeldir; ağ bağlantısıyla ilgisi yoktur.
Oranı ortalama durumla karıştırmakRekabet oranı en kötü girdiye göredir; "genelde iyi çalışır" bir rekabet oranı değildir.
FIFO ile LRU'yu karıştırmakFIFO'da isabet sırayı değiştirmez; LRU'da isabet sayfayı en yeni yapar.
Zorunlu hataları unutmakİlk k farklı sayfa her politikada hata verir; OPT bile 0 hata yapamaz.
Rezervuarda yanlış aralıkj = rastgele[0, i] olmalı (i dahil, 0 tabanlı). nextInt(i) yazmak olasılıkları bozar.
Ortancada dengeyi unutmakYalnızca eklemek yetmez; boyut farkı 1'i aşınca tepe öbür heap'e taşınmalıdır.

Özet

Örnek Problemler

  1. İstek dizisi 1 2 3 4 1 2 5 1 2 3 4 5, k = 3 için OPT kaç sayfa hatası yapar?
  2. Kayak kiralamada B = 20. Başa baş stratejisinin oranı nedir? 5. gün satın alan stratejinin en kötü oranı nedir?
  3. A B C D listesinde MTF ile D C D A isteklerinin toplam maliyeti nedir?
  4. Akış 2, 9, 4, 7 için çevrimiçi ortancaları sırasıyla yazın.
  5. Rezervuar örneklemede k = 2, akışın 0 tabanlı 9. öğesi rezervuara hangi olasılıkla girer? Akış 10 öğeyle biterse bu öğe sonda hangi olasılıkla rezervuardadır?
Cevapları göster
  1. 7 hata: 1 2 3 (zorunlu), 4 (3'ü at), 5 (4'ü at), 3 (1 ya da 2'yi at), 4. FIFO 9, LRU 10 yapar.
  2. 2 − 1/20 = 1,95. k = 5: d = 5 iken ALG = 4 + 20 = 24, OPT = 5 → 4,8.
  3. D: 4 → D A B C; C: 4 → C D A B; D: 2 → D C A B; A: 3 → A D C B. Toplam 13.
  4. 2 → 2; 2, 9 → 5,5; 2, 4, 9 → 4; 2, 4, 7, 9 → 5,5.
  5. Girme: k/(i + 1) = 2/10 = 1/5. Son öğe olduğu için sonda da 1/5 = k/n.

Özet

Alıştırmalar

  1. FIFO sayfalamayı bir Queue ve bir HashSet ile O(1) zamanda yazın.
  2. OPT'yi (Belady) Java ile yazın. Zaman karmaşıklığı nedir?
  3. Kayak kiralamada "B/2. gün satın al" stratejisinin oranını bulun.
  4. Çevrimiçi ortancaya sil(x) eklemek neden zordur?
  5. k = 1 rezervuarda 3 öğeli akışın her öğesinin 1/3 olasılıkla seçildiğini gösterin.
  6. Son k öğenin en büyüğünü amortize O(1) zamanda bulun.
Cevaplar / ipuçları
  1. İsabet: kume.contains(p). Hata: doluysa kume.remove(kuyruk.poll()); sonra offer + add.
  2. Hata başına ileri tarama: toplam O(n² · k); sonraki kullanım indisleri önceden hesaplanıp heap'te tutulursa O(n log k).
  3. d = B/2 iken ALG = (B/2 − 1) + B, OPT = B/2 → oran 3 − 2/B. Başa baştan (2 − 1/B) kötü.
  4. Heap keyfi öğeyi hızlı silemez; sayaçlı TreeMap ya da tembel silme gerekir.
  5. 1. öğe: 1 · (1/2) · (2/3) = 1/3; 2. öğe: (1/2) · (2/3) = 1/3; 3. öğe: 1/3.
  6. Monoton azalan deque: yeni gelen küçükleri arkadan atar, pencere dışı baştan çıkar; baştaki en büyüktür.

Özet

Kaynaklar

  • A. Borodin ve R. El-Yaniv, Online Computation and Competitive Analysis, Cambridge University Press, 1998.
  • D. D. Sleator ve R. E. Tarjan, "Amortized Efficiency of List Update and Paging Rules", Communications of the ACM 28(2), 1985.
  • L. A. Belady, "A Study of Replacement Algorithms for a Virtual-Storage Computer", IBM Systems Journal 5(2), 1966.
  • A. Fiat, R. M. Karp, M. Luby, L. A. McGeoch, D. D. Sleator ve N. E. Young, "Competitive Paging Algorithms", Journal of Algorithms 12(4), 1991.
  • J. S. Vitter, "Random Sampling with a Reservoir", ACM Transactions on Mathematical Software 11(1), 1985.
  • Cormen, Leiserson, Rivest ve Stein, Introduction to Algorithms, 4. baskı, 2022 (Bölüm 27: Online Algorithms).

Son

Bölüm 13: Çevrimiçi Algoritmalar
Sonraki bölüm: Bölüm 14: Paralel Algoritmalar · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.