Bölüm 9: Ç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.
Çoktan Seçmeli · Kayak Kiralama
Soru 6: Geç Satın Alma
B = 10 iken 15. gün satın alan (14 gün kiralayan) deterministik stratejinin en kötü durum rekabet oranı kaçtır?
B: Düşman d = 15 seçer: ALG = 14 + 10 = 24, OPT = min(15, 10) = 10 → 2,4. 1,9 başa baş stratejisinin (k = 10) oranıdır; 1,5 = 15/10 satın alma bedelini unutmaktır; 2,9, k = 20 içindir.
Klasik Soru · Kayak Kiralama
Soru 7: 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 8: FIFO Sayfalama İzleme
fifoHata(new int[]{1, 2, 3, 1, 4, 1, 2, 5}, 3) çağrısında kuyruk nasıl değişir, kaç sayfa hatası olur?
k = 3 çerçeve, önbellek boş. İstekler: 1 2 3 1 4 1 2 5. Kuyruğun başı en önce yüklenen sayfadır.
Sayfa 1 yok → sayfa hatası, hata = 1. Yer var, çıkarma yok.
Sayfa 2 yok → sayfa hatası, hata = 2. Yer var, çıkarma yok.
Sayfa 3 yok → sayfa hatası, hata = 3. Yer var, çıkarma yok.
Sayfa 1 kümede → isabet, continue. FIFO'da isabet kuyruk sırasını değiştirmez.
Sayfa 4 yok → sayfa hatası, hata = 4. Kuyruk dolu → baştaki 1 atılır.
Sayfa 1 yok → sayfa hatası, hata = 5. Kuyruk dolu → baştaki 2 atılır.
Sayfa 2 yok → sayfa hatası, hata = 6. Kuyruk dolu → baştaki 3 atılır.
Sayfa 5 yok → sayfa hatası, hata = 7. Kuyruk dolu → baştaki 4 atılır.
8 istekte 7 sayfa hatası. 1 sayfası sık istenmesine rağmen yalnızca "en eski yüklenen" olduğu için 4 gelince atıldı; aynı dizide LRU 6, OPT 5 hata yapar.
int fifoHata(int[] istekler, int k) { Queue<Integer> kuyruk = new LinkedList<>(); Set<Integer> kume = new HashSet<>(); int hata = 0; for (int sayfa : istekler) { if (kume.contains(sayfa)) continue; // isabet hata++; if (kuyruk.size() == k) kume.remove(kuyruk.poll()); // en eskiyi at kuyruk.offer(sayfa); kume.add(sayfa); } return hata; }
Adım Adım Çalıştırma · Sayfalama
Soru 9: 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 10: Aynı Dizide OPT
Önceki sorudaki dizi (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 11: LinkedHashMap ile LRU
Sunumdaki LruOnbellek sınıfı (super(16, 0.75f, true), removeEldestEntry: size() > k) ile aşağıdaki kod ne yazdırır? Kurucudaki true, false yapılırsa (ekleme sırası) ilk satır ne olur?
LruOnbellek<Integer, String> c =
new LruOnbellek<>(2);
c.put(1, "a");
c.put(2, "b");
c.get(1);
c.put(3, "c");
System.out.println(c.keySet());
System.out.println(c.get(2));Cevabı göster
Çıktı:
[1, 3] null
- put(1), put(2) → sıra 1, 2.
get(1)erişim sırasında 1'i sona taşır → 2, 1. - put(3) → boyut 3 > 2: en eski (baştaki) 2 silinir → 1, 3.
get(2)→ null (sayfa hatası).
false ile erişim sırayı değiştirmez (FIFO): put(3) en önce eklenen 1'i siler → [2, 3].
Çıktı Sorusu · Sayfalama
Soru 12: 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 13: 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.
Klasik Soru · Sayfalama
Soru 14: OPT Neden Uygulanamaz?
Belady'nin OPT politikası neden gerçek bir işletim sisteminde kullanılamaz, buna rağmen neden önemlidir? İstek dizisi önceden verilmiş olsaydı OPT'yi nasıl gerçeklerdiniz; zaman karmaşıklığı ne olurdu?
Cevabı göster
OPT "bir sonraki kullanımı en uzak olan sayfayı" çıkarır: bu, gelecekteki istekleri bilmeyi gerektirir. Çevrimiçi bir sistem σt geldiğinde σt+1'i bilmez; OPT çevrimdışı bir algoritmadır.
- Önemi: kanıtlanabilir biçimde en az sayfa hatasını verir; rekabet oranlarında karşılaştırma ölçütüdür (ALG / OPT) ve gerçek politikaların ne kadar iyileştirilebileceğini gösterir.
- Gerçekleme (dizi biliniyorsa): her hatada önbellekteki k sayfanın sonraki kullanımını ileri tarayarak bulmak O(n · k) → toplam O(n² · k). Sonraki kullanım indisleri sondan başa bir geçişte önceden hesaplanıp önbellek bir max-heap'te tutulursa O(n log k).
Çoktan Seçmeli · Sayfalama
Soru 15: Evre Sayısı
k = 3 için istek dizisi 1 2 3 1 4 5 6 4 1 2 evrelere bölünüyor (her evre k farklı sayfa içeren en uzun parça). Kaç evre vardır ve LRU'nun bu dizideki hata sayısı için evre argümanı hangi üst sınırı verir?
D: [1 2 3 1] [4 5 6 4] [1 2]: dördüncü farklı sayfa (4, sonra 1) yeni evre başlatır. LRU evre başına en çok k hata yapar → ≤ 3 · 3 = 9 (gerçekte 8: ikinci evrede 4 isabettir). OPT ise ardışık iki evre başına en az 1 hata yapar.
Çoktan Seçmeli · Sayfalama
Soru 16: İş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.
Çoktan Seçmeli · Sayfalama
Soru 17: Zorunlu Hatalar
Bir istek dizisinde 6 farklı sayfa geçiyor ve önbellek k = 3 çerçeveli, başta boş. Geleceği bilen OPT politikası için kesin olarak ne söylenebilir?
B: Her farklı sayfa ilk istendiğinde önbellekte olamaz (zorunlu/soğuk hata): en az 6 hata, hangi politika olursa olsun. Üst sınır dizinin uzunluğuna bağlıdır; 6 ile sınırlı değildir (D yanlış).
Klasik Soru · Sayfalama
Soru 18: 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 19: Ö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 20: 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.
Adım Adım Çalıştırma · Veri Akışları
Soru 21: Hareketli Ortalama İzleme
k = 3 iken sonraki sırasıyla 6, 2, 7, 3, 9 ile çağrılıp sonuçlar yazdırılıyor. Çıktı nedir?
k = 3'lük kayan pencere boş. Akış: 6, 2, 7, 3, 9.
6 eklenir: toplam = 6, ortalama = 6 / 1 = 6,0.
2 eklenir: toplam = 8, ortalama = 8 / 2 = 4,0.
7 eklenir: toplam = 15, ortalama = 15 / 3 = 5,0.
Yeni değer 3; pencere dolu → en eski 6 çıkarılır, toplam = 9.
3 eklenir: toplam = 12, ortalama = 12 / 3 = 4,0.
Yeni değer 9; pencere dolu → en eski 2 çıkarılır, toplam = 10.
9 eklenir: toplam = 19, ortalama = 19 / 3 = 6,333333333333333. Her çağrı O(1): toplam baştan hesaplanmaz.
double sonraki(int deger) { if (pencere.size() == k) toplam -= pencere.poll(); // en eski pencere.offer(deger); toplam += deger; return toplam / (double) pencere.size(); } // main: k = 3; her x için println(sonraki(x))
Çıktı Sorusu · Veri Akışları
Soru 22: Ç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 23: 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 24: 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?
A: 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 25: 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.
Çıktı Sorusu · Veri Akışları
Soru 26: Akışta Kayan Hash
Akış karakter karakter geliyor: "ACAC". Örüntü "CA" (m = 2), h = c₀ · 101 + c₁ (A = 65, C = 67). Her konumdaki pencere için kayan güncelleme hyeni = (heski − cçıkan · 101) · 101 + cgiren ile hash'i hesaplayın; eşleşme hangi konumdadır?
Cevabı göster
| konum | pencere | hesap | hash | sonuç |
|---|---|---|---|---|
| 0 | AC | 65 · 101 + 67 | 6632 | — |
| 1 | CA | (6632 − 65 · 101) · 101 + 65 | 6832 | eşleşme |
| 2 | AC | (6832 − 67 · 101) · 101 + 67 | 6632 | — |
h("CA") = 67 · 101 + 65 = 6832 → eşleşme 1. konumda. Hash eşitliğinde karakterler de karşılaştırılır (çakışma olabilir). Güncelleme O(1): akışta yalnızca son m karakter saklanır.
Çoktan Seçmeli · Veri Akışları
Soru 27: Çalışan Ortalama
Çalışan ortalama μn = μn−1 + (xn − μn−1) / n formülüyle güncelleniyor. Akış 4, 8, 6, 10 için son μ kaçtır?
C: μ = 4 → 4 + (8 − 4)/2 = 6 → 6 + (6 − 6)/3 = 6 → 6 + (10 − 6)/4 = 7 = (4 + 8 + 6 + 10)/4. 7,5, son iki değerin hareketli ortalaması gibi davranmaktır; 8, son adımda n yerine 2'ye bölmektir. Geçmiş saklanmaz: O(1) bellek.