Bölüm 13: Çevrimiçi Algoritmalar
Çoktan Seçmeli · Çevrimiçi Model
Soru 1: Hangisi Çevrimiçi Çalışabilir?
Öğeler tek tek geliyor ve her öğe geldiğinde o ana kadarki öğelerin sıralı hâli hazır olmalı. Hangi algoritma bu çevrimiçi modele doğal olarak uyar?
B: Eklemeli sıralama gelen öğeyi o ana kadarki sıralı diziye yerleştirir; geleceği bilmesi gerekmez. Seçimli sıralama ilk adımda bile tüm girdinin en küçüğünü bilmek zorundadır; birleştirme ve QuickSort da girdinin tamamına ihtiyaç duyar (çevrimdışı).
Çoktan Seçmeli · Çevrimiçi Model
Soru 2: Rekabet Oranının Tanımı
Bir en küçükleme probleminde çevrimiçi algoritma ALG için "c-rekabetçidir" ifadesi ne anlama gelir?
A: Rekabet oranı bir en kötü durum garantisidir: her σ için maliyet OPT'nin c katını (artı sabit) aşmaz. Olasılık varsayımı yoktur (B ortalama durumdur). Ölçülen maliyettir, süre değil. D yalnızca bir girdiden söz eder; garanti tüm girdiler içindir.
Çoktan Seçmeli · Çevrimiçi Model
Soru 3: Düşman Türleri
Rastgele bir sayfalama algoritmasını analiz ederken habersiz (oblivious) düşman için hangisi doğrudur?
C: Habersiz düşman algoritmayı bilir ama yazı-tura sonuçlarını göremez; diziyi önceden belirler ve beklenen maliyet ölçülür. B uyarlanır (adaptive) düşmandır; bu durumda rastgeleliğin faydası azalır. İşaretleme algoritmasının 2Hk oranı habersiz düşmana karşıdır.
Adım Adım Çalıştırma · Kayak Kiralama
Soru 4: Başa Baş Stratejisi
kayakMaliyet(5, 5, 7): B = 5, satın alma günü k = 5, gerçek gün sayısı d = 7. Maliyet nasıl birikir, rekabet oranı nedir?
Satın alma 5 TL, kira günlüğü 1 TL. Strateji: k − 1 = 4 gün kirala, 5. gün hâlâ kayılıyorsa satın al. Sezon d = 7 gün sürecek (algoritma bunu bilmiyor).
gün = 1 ≠ k → kiralanır: maliyet = 1.
gün = 2 ≠ k → kiralanır: maliyet = 2.
gün = 3 ≠ k → kiralanır: maliyet = 3.
gün = 4 ≠ k → kiralanır: maliyet = 4.
gün = 5 = k → satın alınır: maliyet = 4 + 5 = 9, break. Kalan günler (6, 7) bedavadır.
ALG = 9, OPT = min(d, B) = min(7, 5) = 5 → oran 1,8 = 2 − 1/B. d = 5 olsaydı da ALG 9, OPT 5 olurdu: düşmanın en iyi seçimi d = k'dir.
int kayakMaliyet(int B, int k, int d) { int maliyet = 0; for (int gun = 1; gun <= d; gun++) { if (gun == k) { maliyet += B; break; } // satın al maliyet += 1; // kirala } return maliyet; }
Çıktı Sorusu · Kayak Kiralama
Soru 5: B = 12 için Oranlar
Kayak kiralamada satın alma fiyatı B = 12 TL. (a) Başa baş stratejisinin (11 gün kirala, 12. gün al) rekabet oranı nedir? (b) 4. gün satın alan stratejinin en kötü durum oranı nedir; düşman hangi d'yi seçer?
Cevabı göster
- (a) Düşman d = 12 seçer: ALG = 11 + 12 = 23, OPT = 12 → 23/12 = 2 − 1/12 ≈ 1,92.
- (b) Düşman satın alınan gün sezonu bitirir: d = 4. ALG = 3 kira + 12 = 15, OPT = min(4, 12) = 4 → 15/4 = 3,75.
Genel: k < B için oran (k − 1 + B)/k, k ≥ B için (k − 1 + B)/B; ikisi de k = B'de en küçük değeri 2 − 1/B alır. Erken satın almak da geç satın almak da kötüdür.
Klasik Soru · Kayak Kiralama
Soru 6: Neden 2 − 1/B'den İyisi Yok?
Kayak kiralamada hiçbir deterministik çevrimiçi stratejinin 2 − 1/B'den iyi rekabet oranına sahip olamayacağını düşman argümanıyla gösterin. Rastgelelik bu sınırı nasıl değiştirir?
Cevabı göster
Deterministik her strateji tek bir sayıyla tanımlanır: k = satın alma günü. Düşman kodu bildiği için sezonu tam satın alınan gün bitirir: d = k.
- ALG = (k − 1) + B, OPT = min(k, B).
- k < B (k ≤ B − 1): oran (k − 1 + B)/k = 1 + (B − 1)/k ≥ 1 + 1 = 2 > 2 − 1/B.
- k ≥ B: oran (k − 1 + B)/B ≥ (2B − 1)/B.
Her k için oran ≥ 2 − 1/B; eşitlik k = B'de. Rastgele seçilen k ile düşman satın alma gününü bilemez: beklenen oran e/(e − 1) ≈ 1,58'e iner (Karlin vd.).
Adım Adım Çalıştırma · Sayfalama
Soru 7: LRU Sayfalama İzleme
lruHata(new int[]{2, 3, 2, 1, 5, 2, 4, 5, 3, 2}, 3) çağrısında onb listesi nasıl değişir, kaç sayfa hatası olur?
k = 3, liste boş. İstekler: 2 3 2 1 5 2 4 5 3 2. Liste başı en uzun süredir kullanılmayan sayfadır.
Sayfa 2 yok → hata = 1. Yer var.
Sayfa 3 yok → hata = 2. Yer var.
Sayfa 2 listede: remove true → isabet; sona eklenir, artık en yeni kullanılan.
Sayfa 1 yok → hata = 3. Yer var.
Sayfa 5 yok → hata = 4. Dolu → baştaki (en eski kullanılan) 3 atılır.
Sayfa 2 listede: remove true → isabet; sona eklenir, artık en yeni kullanılan.
Sayfa 4 yok → hata = 5. Dolu → baştaki (en eski kullanılan) 1 atılır.
Sayfa 5 listede: remove true → isabet; sona eklenir, artık en yeni kullanılan.
Sayfa 3 yok → hata = 6. Dolu → baştaki (en eski kullanılan) 2 atılır.
Sayfa 2 yok → hata = 7. Dolu → baştaki (en eski kullanılan) 4 atılır.
10 istekte 7 hata, 3 isabet. remove listeyi taradığı için her istek O(k); LinkedHashMap 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; }
Çıktı Sorusu · Sayfalama
Soru 8: Belady'nin OPT Politikası
İstek dizisi 2 3 2 1 5 2 4 5 3 2 ve k = 3 için Belady'nin OPT politikası (bir sonraki kullanımı en uzak olanı çıkar) kaç sayfa hatası yapar? Her çıkarmada hangi sayfa atılır?
Cevabı göster
| İstek | 2 | 3 | 2 | 1 | 5 | 2 | 4 | 5 | 3 | 2 |
|---|---|---|---|---|---|---|---|---|---|---|
| Sonuç | H | H | ✓ | H | H | ✓ | H | ✓ | ✓ | H |
| Çıkan | 1 | 2 | 4 |
- 5 gelince önbellek {2, 3, 1}: sonraki kullanımlar 2 → 6., 3 → 9., 1 → hiç → 1 atılır.
- 4 gelince {2, 3, 5}: 2 → 10., 3 → 9., 5 → 8. → en uzak 2 atılır.
- Son 2 gelince {4, 3, 5}: 4 bir daha istenmiyor → 4 atılır.
OPT = 6 hata; LRU ve FIFO 7. İlk 3 farklı sayfanın hatası (2, 3, 1) her politikada zorunludur.
Çıktı Sorusu · Sayfalama
Soru 9: Belady Anomalisi
İstek dizisi 0 1 2 3 0 1 4 0 1 2 3 4. FIFO ve LRU, k = 3 ve k = 4 çerçeveyle kaçar sayfa hatası yapar? Sonucu yorumlayın.
Cevabı göster
| Politika | k = 3 | k = 4 |
|---|---|---|
| FIFO | 9 | 10 |
| LRU | 10 | 8 |
FIFO'da önbellek büyüdüğü hâlde hata 9'dan 10'a arttı: Belady anomalisi. k = 4'te 0, 1 sayfaları sıra gereği tam ihtiyaç duyulmadan önce atılır.
LRU ve OPT birer yığın algoritmasıdır: k çerçevedeki sayfalar her an k + 1 çerçevedekilerin alt kümesidir, bu yüzden çerçeve artınca hata artamaz (LRU: 10 → 8).
Çoktan Seçmeli · Sayfalama
Soru 10: FIFO ile LRU Farkı
Önbellekte 3, 5, 8 sayfaları var (FIFO yükleme sırası 3, 5, 8; LRU kullanım sırası da başlangıçta 3, 5, 8). Sırasıyla 3 (isabet) ve 9 (hata) isteniyor. FIFO ve LRU 9 için hangi sayfaları çıkarır?
A: FIFO'da isabet sırayı değiştirmez: en önce yüklenen 3 çıkar (hemen az önce kullanılmış olsa da). LRU'da isabet 3'ü en yeni yapar (sıra 5, 8, 3); en uzun süredir kullanılmayan 5 çıkar. İki politikanın tek farkı isabetin sırayı güncelleyip güncellememesidir.
Çoktan Seçmeli · Sayfalama
Soru 11: İşaretleme Algoritmasının Oranı
Rastgele işaretleme (marking) algoritması habersiz düşmana karşı 2Hk-rekabetçidir. k = 4 için bu oran yaklaşık kaçtır?
D: H₄ = 1 + 1/2 + 1/3 + 1/4 = 25/12 ≈ 2,08 → 2H₄ = 25/6 ≈ 4,17. 2,08, rastgele algoritmalar için alt sınır Hk'dır; 4,00 deterministik LRU/FIFO'nun k oranıdır; 8,00 = 2k.
Klasik Soru · Sayfalama
Soru 12: Deterministik Alt Sınır k
Hiçbir deterministik sayfalama algoritmasının k'dan iyi rekabet oranına sahip olamayacağını, yalnızca k + 1 farklı sayfa kullanan bir düşman dizisiyle gösterin.
Cevabı göster
- Düşman algoritmanın kodunu bilir; her adımda ALG'nin önbelleğinde olmayan tek sayfayı ister (k + 1 sayfadan biri her zaman dışarıdadır). ALG her istekte hata yapar: n istekte n hata.
- OPT bir hata yaptığında bir sonraki kullanımı en uzak sayfayı çıkarır. Diğer k − 1 sayfa o sayfadan önce istenmek zorundadır, yani sonraki hataya kadar en az k istek geçer: OPT en çok ⌈n/k⌉ hata yapar.
Oran ALG / OPT ≥ n / (n/k) = k (Sleator ve Tarjan). LRU ve FIFO bu sınıra ulaşır (k-rekabetçi); daha iyisi için rastgelelik gerekir (2Hk).
Adım Adım Çalıştırma · Liste Güncelleme
Soru 13: Öne Taşı İzleme
mtfMaliyet, A B C D listesi ve D D C D C D istekleriyle çağrılıyor. Her istekte maliyet ve liste nasıl değişir?
Liste A B C D; istekler D D C D C D. i. konumdaki öğeye erişmek i birim tutar (baştan taranır).
D: 4. konumda → maliyet 4, toplam 4; D başa taşınır.
D: 1. konumda → maliyet 1, toplam 5; D başa taşınır.
C: 4. konumda → maliyet 4, toplam 9; C başa taşınır.
D: 2. konumda → maliyet 2, toplam 11; D başa taşınır.
C: 2. konumda → maliyet 2, toplam 13; C başa taşınır.
D: 2. konumda → maliyet 2, toplam 15; D başa taşınır.
MTF toplamı 15. Aynı dizide hiç taşımayan liste 4+4+3+4+3+4 = 22, transpoz (bir öne al) 17 öder: sık istenen D ve C hızla öne gelir.
int mtfMaliyet(LinkedList<Character> liste, char[] istekler) { int toplam = 0; for (char x : istekler) { int konum = liste.indexOf(x) + 1; // 1 tabanlı toplam += konum; liste.remove((Character) x); liste.addFirst(x); // öne taşı } return toplam; }
Çoktan Seçmeli · Liste Güncelleme
Soru 14: Liste Güncelleme Stratejileri
Liste güncelleme problemindeki stratejiler için hangisi doğrudur?
C: Sleator–Tarjan: MTF ≤ 2 · OPT; potansiyel Φ = MTF ve OPT listeleri arasındaki ters sıralı çiftler (amortize analiz). Transpoz son iki öğe sırayla istenince istek başına ≈ n öder; sıklık sayacı sıra değişince eski düzeni uzun süre korur. MTF bazı dizilerde (ör. A B C D'de C A C D B A) taşımamaktan kötü olabilir.
Çıktı Sorusu · Veri Akışları
Soru 15: Çevrimiçi Ortanca
İki heap'li çevrimiçi ortanca yapısına (sol: max-heap, sag: min-heap) sırasıyla 7, 3, 9, 1, 5 ekleniyor ve her eklemeden sonra System.out.print(ortanca() + " ") çalıştırılıyor. Çıktı nedir? En sonda heap'lerde ne vardır?
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(); }
Cevabı göster
Çıktı: 7.0 5.0 7.0 5.0 5.0
| x | sol (max-heap) | sag (min-heap) | ortanca |
|---|---|---|---|
| 7 | 7 | — | 7 (tek) |
| 3 | 3 | 7 | (3 + 7)/2 = 5 |
| 9 | 3, 7 (7 geri taşındı) | 9 | 7 |
| 1 | 1, 3 | 7, 9 | (3 + 7)/2 = 5 |
| 5 | 1, 3, 5 | 7, 9 | 5 |
9 eklenince sag'a girer, sag > sol olduğu için sag'ın tepesi 7 sol'a taşınır. 1 eklenince sol 3 öğeye çıkar, tepe 7 sag'a geçer. ortanca() double döndürür: tek sayıda da 7.0 yazılır.
Çıktı Sorusu · Veri Akışları
Soru 16: Rezervuar Örnekleme
rezervuar(new int[]{5, 8, 2, 9, 4, 7}, 2) çağrılıyor; rastgele.nextInt(i + 1) sırasıyla 1, 3, 0, 4 döndürüyor. Dönen liste nedir? 0 tabanlı 3. öğe (9) rezervuara hangi olasılıkla girer, akış sonunda hangi olasılıkla rezervuardadır?
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; }
Cevabı göster
- İlk k = 2 öğe: r = [5, 8].
- i = 2 (2), j = 1 < 2 → r[1] = 2 → [5, 2].
- i = 3 (9), j = 3 ≥ 2 → girmez.
- i = 4 (4), j = 0 → r[0] = 4 → [4, 2].
- i = 5 (7), j = 4 → girmez.
Sonuç [4, 2].
9'un girme olasılığı k/(i + 1) = 2/4 = 1/2; akış sonunda rezervuarda olma olasılığı her öğe gibi k/n = 2/6 = 1/3 (1/2 · 4/5 · 5/6).
Çoktan Seçmeli · Veri Akışları
Soru 17: Rezervuarda Kalma Olasılığı
k = 3'lük rezervuar örneklemede 0 tabanlı i = 11. öğe gelince rezervuara hangi olasılıkla girer? Akış toplam n = 20 öğeyle biterse bu öğe sonda hangi olasılıkla rezervuardadır?
D: Girme k/(i + 1) = 3/12 = 1/4. Sonraki her t > i adımında çıkarılmama (t)/(t + 1); çarpım 1/4 · 12/13 · … · 19/20 = 3/20 = k/n: her öğe için aynı. 3/11, aralığı nextInt(i) sanmaktır; 1/20 tek öğeli örneklem içindir.
Çoktan Seçmeli · Veri Akışları
Soru 18: nextInt(i) Hatası
Rezervuar kodunda rastgele.nextInt(i + 1) yerine rastgele.nextInt(i) yazılırsa (i ≥ k) ne olur?
B: nextInt(i) 0 … i − 1 üretir; j < k olasılığı k/(i + 1) yerine k/i olur. Geç gelen öğeler gereğinden sık girer, erkenler daha sık çıkar: örneklem düzgün değildir. i = k'da olasılık 1'e çıkar: k. öğe kesin girer.