Selection problem
$A = [6, 4, 8, 9, 5, 2, 1]$ ve $k = 3$. Sorted hâli $[1, 2, 4, 5, 6, 8, 9]$, üçüncü eleman 4. Yani 3-select'in cevabı 4.
Input: $n$ sayılık bir $A$ array'i ve bir tam sayı $k \in \{1, \dots, n\}$. Output: $A$'nın $k$-th smallest elemanı (Bilkent slaytlarındaki adıyla $k$-th order statistic).
- $k = 1$: minimum, $k = n$: maximum, $k = \lceil n/2 \rceil$: median.
- Sorting ile çözüm: MergeSort ile sort et ($O(n\log n)$), $k$-th elemanı döndür ($O(1)$). Toplam $O(n\log n)$.
Bu neden yetmiyor? Tek bir eleman için bütün array'i sort ediyoruz. $k = 1$ için tek bir tarama $O(n)$'de işi bitiriyor. Soru şu: her $k$ için $O(n)$ mümkün mü? Mümkün, dersin sonunda göreceğiz.
- Selection ⇒ median: Kolay yön. Median $=$ Select$(A, n, \lceil n/2\rceil)$.
- Linear median ⇒ linear selection: Elinde $O(n)$'lik bir median algoritması varsa Select'te pivot olarak tam median'ı kullan. Her adımda array yarıya iner: $T(n) \le T(n/2) + cn = O(n)$ (Bölüm 5).
"$k$-th smallest" bir rank belirtir, array'deki $k$. konumu değil. Unsorted bir array'de $A[k]$'yı döndürmenin anlamı yok. Bilkent slaytı ayrıca "sorting'i MergeSort ile yap, QuickSort ile değil" der, çünkü QuickSort'un worst case'i $\Theta(n^2)$.
$A = [6, 4, 8, 9, 5, 2, 1]$ için 5-select ne döndürür?
Lower bound: minimum bile Ω(n)
Yedi kutudan altısını açtın, birini açmadın. En küçük sayı açmadığın kutuda olabilir. Görmediğin bir sayı hakkında hiçbir şey bilemezsin, o yüzden her kutuyu açman gerekir.
SelectMin tam olarak bunu yapar: $m \leftarrow \infty$, her $A[i]$ için $A[i] < m$ ise $m \leftarrow A[i]$. Tek tarama, $O(n)$. Daha hızlısı olamaz:
Minimumu bulan her deterministic algoritmanın running time'ı $\Omega(n)$'dir.
- Doğru çalışan bir deterministic algoritma, bir $X$ input'unda $A[i]$'yi hiç okumasın. Output'u $v$ olsun.
- $X'$ input'u: $X$'in aynısı, sadece $X'[i] = (\min X) - 1$.
- Algoritma $X'$ üzerinde okuduğu her yerde $X$ ile aynı değerleri görür. Deterministic olduğu için aynı adımları atar ve yine $v$ döndürür.
- Ama $X'$'in minimumu $X'[i]$, yani $v$ değil. Algoritma iki input'tan birinde yanlış cevap verir: contradiction. Demek ki her elemanı okumalı, en az $n$ adım.
- 3. adımda: aynı okumalar ⇒ aynı işlemler ⇒ aynı output.
- Her zaman doğru randomized algorithm (Las Vegas): Random bit'leri sabitle. O bit'lerle $A[i]$'yi atlayan bir koşu varsa aynı argüman, aynı bit'lerle $X'$'te yanlış cevap verdirir. Algoritma her zaman doğru olduğu için hiçbir koşu bir elemanı atlayamaz: yine $\Omega(n)$.
- Küçük bir probability ile yanılabilen (Monte Carlo): Argüman olduğu gibi işlemez, çünkü algoritmanın bazen yanılmasına izin var. Notlarda yok, ama fikir şu: minimumu random bir konuma koyarsan $q$ konum okuyan algoritma onu kabaca $q/n$ probability ile görür. $\delta$ hata payıyla doğru olmak için yaklaşık $(1-\delta)n$ okuma gerekir. Constant $\delta$ için yine $\Omega(n)$.
- Herhangi bir $k$ için: Evet, $\Omega(n)$. Okunmamış bir eleman döndürülen değerin altına ya da üstüne taşınırsa o değerin rank'i değişir.
"Minimumu bulan her deterministic algoritma neden $\Omega(n)$ zaman ister? Argümanı yeniden kur."
İpucu 1
Algoritmanın bir konumu hiç okumadığını varsay. O konumdaki değeri değiştirince algoritmanın davranışı değişir mi?
İpucu 2
Yeni değeri hepsinden küçük seç. Output aynı kalır ama doğru cevap değişir.
Bir deterministic algoritma minimumu bulurken her input'ta $n-1$ eleman okuyor. Ne söylenebilir?
Select: partition yap, tek tarafa in
Unsorted array'de binary search gibi düşün. Bir pivot $p$ seç, array'i ondan küçükler ($L$) ve büyükler ($R$) diye ayır. Aradığın eleman ya $p$'nin kendisi, ya $L$'de ya da $R$'de. Sadece bir tarafa in. QuickSort iki tarafa da recursive call yapar, Select yalnızca birine.
Select(A, n, k):
if n = 1: return A[1]
p ← ChoosePivot(A, n)
L ← { a ∈ A : a < p } R ← { a ∈ A : a > p }
if |L| = k − 1: return p (durum 1)
if |L| > k − 1: return Select(L, |L|, k) (durum 2)
if |L| < k − 1: return Select(R, |R|, k − |L| − 1) (durum 3)
Elemanların farklı olduğunu varsayıyoruz (eşit elemanlar Bölüm 4'te). ChoosePivot şimdilik bir kara kutu: correctness'ı etkilemez, sadece running time'ı etkiler.
Class-prep S8'in array'i: $A = [7, 2, 9, 4, 1, 8, 5]$. Pivot kuralı "son eleman" (S8'deki pivot 5 de son eleman). $k$'yı değiştirip oynat ya da kendi array'ini yaz. Kareler algoritmanın gerçek çalışmasından üretiliyor. Altta aynı array'in sorted hâli duruyor; algoritma onu görmez, sadece sana yol gösterir. Aktif subarray orada hep bitişik bir rank aralığıdır, aranan rank ise baştan sona aynı kalır: atılan küçüklerin sayısı artı o call'daki $k$.
Önce tahmin et: S8 array'inde $k = 5$ için kaç call olur, son call'daki $k$ kaçtır? Sonra "Sorted array" preset'inde $k = 1$'i dene: pivot hep son eleman olunca kaç call çıkar?
Durum 3'te $L$'nin $|L|$ elemanı ve $p$'nin kendisi, yani $|L| + 1$ eleman, aradığımızdan küçüktür ve $R$'ye girmez. Cevabın $A$'daki rank'i $k$ ise $R$ içindeki rank'i $k - (|L| + 1)$ olur. $k - |L|$ yazarsan pivot'u saymayı unutmuş olursun.
Bilkent slaytlarındaki R-SELECT, Hoare partition kullanır: pivot ayrı tutulmaz, bir tarafın içinde kalır. Sol parça $k$ eleman içeriyorsa sağa $i - k$ ile inilir. Slayt örneği: $[6, 10, 13, 5, 8, 3, 2, 11]$, $i = 7$. Partition sonrası sol $[2, 3, 5]$ ($k = 3$), sağ $[13, 8, 10, 6, 11]$. Sağda 4th smallest aranır, cevap 11. Formül, pivot'un bir tarafa konup konmadığına bağlı. Sınavda hangi pseudocode verildiyse ona göre yaz.
"Select$(A, n, k)$'yı $A = [7, 2, 9, 4, 1, 8, 5]$, $k = 5$, pivot 5 ile elle izle. $A_<$, $A_>$, seçilen dal ve recursive call'daki yeni $k$ nedir?"
İpucu 1
Önce $L$ ve $R$'yi yaz, sonra $|L|$'yi $k - 1 = 4$ ile karşılaştır.
İpucu 2
$|L| = 3 < 4$: durum 3. Pivot ve $L$ atılınca kaç eleman eksildi?
Çözümü göster
$L = [2, 4, 1]$, $R = [7, 9, 8]$. $|L| = 3 < k - 1 = 4$ ⇒ durum 3: Select$(R, 3, 5 - 3 - 1 = 1)$. $R$'nin en küçüğü 7. Kontrol: sorted $A = [1, 2, 4, 5, 7, 8, 9]$, beşinci eleman 7. ✓
Neden $k - |L| - 1$: $L$'deki 3 eleman ve pivot 5, toplam 4 eleman, 7'den küçük ve $R$'de yok. 7'nin $R$ içindeki rank'i $5 - 4 = 1$.
Aynı $A = [7, 2, 9, 4, 1, 8, 5]$, pivot 5, ama $k = 2$. Select hangi recursive call'u yapar?
Correctness ve eşit elemanlar
Select, "küçük array'lerde doğru çalışıyorum" varsayımına güvenir. Ama subarray'in boyu $n-1$ olmak zorunda değil, $n$'den küçük herhangi bir sayı olabilir. Bu yüzden strong induction kullanırız: "$n$'den küçük her boy için doğru" diye varsayarız.
IH($n$): $n$ boyundaki her $A$ ve her $k \in \{1, \dots, n\}$ için Select, $A$'nın $k$-th smallest elemanını döndürür.
Base case ($n = 1$): $k = 1$ olmak zorunda, tek eleman döner. ✓
Inductive step: $i \ge 2$ olsun ve IH her $1 \le n < i$ için doğru olsun. $|A| = i$.
- Durum 1 $|L| = k - 1$: $p$'den küçük tam $k-1$ eleman var, yani $p$ $k$-th smallest. ✓
- Durum 2 $|L| > k - 1$: $k$-th smallest $L$'dedir ve $L$'nin de $k$-th smallest elemanıdır. $|L| < i$ (pivot dışarıda) ve $1 \le k \le |L|$, yani IH uygulanır. ✓
- Durum 3 $|L| < k - 1$: cevap $R$'de, rank'i $k - |L| - 1$. IH'yi uygulamadan önce kontrol: $1 \le k - |L| - 1$ (çünkü $|L| < k - 1$) ve $k - |L| - 1 \le |R|$ (çünkü bu $k \le |L| + |R| + 1 = i$ demek). $|R| < i$. ✓
Pivot'un ne olduğu hiçbir yerde kullanılmadı: Select her pivot seçimiyle doğru.
[3, 3, 3, 3] ile ne olur?
Pivot 3. $L = \{a < 3\} = \emptyset$, $R = \{a > 3\} = \emptyset$. $|L| = 0 < k - 1 = 1$ ⇒ durum 3: Select$(\emptyset, 0, 1)$. Boş array'de 1. eleman istenir ve algoritma çöker. Bozulan varsayım elemanların farklı olması. O varsayım altında $|L| + |R| + 1 = n$ olur; burada $0 + 0 + 1 \ne 4$.
$L = \{a < p\}$, $E = \{a = p\}$, $G = \{a > p\}$.
- $k \le |L|$ ise Select$(L, k)$;
- $|L| < k \le |L| + |E|$ ise $p$ döndür;
- değilse Select$(G, k - |L| - |E|)$.
$[3,3,3,3]$, $k = 2$: $|E| = 4$, $0 < 2 \le 4$ ⇒ 3 döner. ✓
$L$ yerine $\{a \le p\}$ alırsan ve $p$ maksimumsa $L = A$ olur: aynı boyda tekrar recursive call, yani sonsuz recursion. İspat da çöker, çünkü IH sadece kesin daha küçük boylar için geçerli. Her recursive call boyu en az 1 azaltmalı.
"Select'in, hangi pivot kullanılırsa kullanılsın, $k$-th smallest elemanı döndürdüğünü strong induction ile ispatla. Durum 3'te IH'den önce hangi eşitsizlikleri kontrol etmelisin?"
İpucu 1
IH'yi "boyu $n$ olan her array ve her geçerli $k$" diye kur. Subarray'in boyu kaç olabilir?
İpucu 2
IH'nin şartı: yeni $k$, subarray'in geçerli aralığında olmalı. $1 \le k - |L| - 1 \le |R|$ eşitsizliğini durum koşulundan ve $n = |L| + |R| + 1$'den çıkar.
Durum 3'te $k - |L| - 1 \ge 1$ neden doğrudur?
Pivot seçimi running time'ı belirler
Correctness her pivot ile sağlanıyor. Running time ise her adımda kaç eleman atıldığına bağlı. Aşağıda $n = 64$, $A = [1, 2, \dots, 64]$, $k = 64$ (en büyük) için üç pivot kuralı yan yana çalışıyor. Çubuk o anki subarray'in boyunu, sayı o ana kadar taranan elemanların toplamını gösterir.
Her adım sadece 1 eleman atar: $T(n) = T(n-1) + \Theta(n)$. Recurrence'ı aç:
$$c_2\,\frac{n(n+1)}{2} = c_2(n + (n-1) + \dots + 1) \;\le\; T(n) \;\le\; c_1(n + (n-1) + \dots + 1) = c_1\,\frac{n(n+1)}{2}$$İki yönden de $n^2/2$ mertebesinde: $T(n) = \Theta(n^2)$. (Bu, en kötü $k$ için geçerli. Pivot min iken $k = 1$ olsaydı ilk adımda biterdi.)
$T(n) \le T(n/2) + cn$.
- Açarak (geometric series): $cn + \tfrac{cn}{2} + \tfrac{cn}{4} + \dots \le cn \cdot \tfrac{1}{1 - 1/2} = 2cn = O(n)$.
- Master theorem: $a = 1$, $b = 2$, $d = 1$; $a < b^d$ ⇒ $O(n^d) = O(n)$.
MergeSort da yarıya böler ama iki yarıyı da çözer: her level'da toplam iş $n$, $\log n$ level var ⇒ $n \log n$ ($a = 2 = b^d$). Select tek yarıya iner: level işi her seferinde yarıya düşer, toplam bir geometric series olur ⇒ $O(n)$. Sonucu belirleyen, subproblem sayısı.
Pivot her seferinde en kötü ihtimalle $c$–$(1-c)$ bölmesi veriyorsa ($c < 1$ bir constant) subarray her adımda en fazla $c$ katına iner: $\sum_i c^i n \le \frac{n}{1-c} = O(n)$. Yarıya inmek için constant olmayan ($\omega(1)$) sayıda adım gerekiyorsa bu adımların her biri en az $n/2$ iş yapar, toplam $\omega(n)$ olur.
"Pivot hep min/max ise recurrence'ı yaz, aç, lower ve upper bound'u ispatla. Pivot hep tam median ise recurrence'ı iki yolla çöz. MergeSort da yarıya böldüğü hâlde cevap neden $O(n\log n)$ değil?"
İpucu 1
Min pivot'ta recursive call $n - 1$ boyunda. Partition her elemana bakar: $\Theta(n)$.
İpucu 2
Median pivot'ta level işlerini yaz: $n, n/2, n/4, \dots$ Bu seriyi MergeSort'un $n, n, n, \dots$ serisiyle karşılaştır.
$T(n) = T(n/2) + n$, $T(1) = 1$ ise $T(n)$ nedir?
Random pivot: QuickSelect
Random seçilen pivot kabaca 1/2 probability ile "orta yarıdan" gelir, yani rank'i $n/4$ ile $3n/4$ arasındadır. O zaman iki parça da en fazla $3n/4$ olur. Ortalama iki denemede bir array dörtte bir küçülür, bu da yine bir geometric series verir.
- Worst-case: $\Theta(n^2)$. Her seferinde en kötü pivot gelebilir (Bilkent slaytı: $[1, \dots, 8]$'de $i = 8$ ararken her pivot en küçük çıkar, boy 8, 7, 6, …).
- Expected: $O(n)$, her input için. Expected value, algoritmanın kendi yazı-turaları üzerinden alınır.
Faz argümanı (CS161 L5 concept check): Faz $i$: array boyu $\big((3/4)^{i+1}n,\ (3/4)^i n\big]$ aralığında. İyi pivot gelme probability'si $\tfrac12 \pm O(1/n)$ ⇒ bir fazdaki expected recursive call sayısı $\le 2 + O(1/n)$. Fazdaki her recursive call $\le c(3/4)^i n$ iş yapar:
$$\mathbb{E}[T(n)] \le \sum_{i \ge 0} 2c\left(\tfrac34\right)^i n = 8cn = O(n).$$Üç pivot kuralını aynı input'ta dene. Array, $1..n$ sayılarının karışık bir dizilişi. Her çubuk bir recursive call'un subarray boyu. Toplam iş, bu boyların toplamı, çünkü partition her call'da subarray'in her elemanına bir kez bakar.
Önce tahmin et: $n = 32$, $k = 1$, kötü pivot (max): kaç recursive call olur, toplam iş $n(n+1)/2 = 528$'e ne kadar yaklaşır? Random pivot'ta aynı $k$ için kaç call beklersin?
- Worst-case: en kötü input ve en şanssız yazı-turalar. Expected: en kötü input, yazı-turaların ortalaması.
- "Expected $O(n)$" random input varsaymaz. Input kötü niyetli olabilir; şans algoritmanın içinde.
- Pivot seçimlerini görüp input'u ona göre kuran bir "bad guy" varsa randomness işe yaramaz (CS161 slayt s.31). O durum için Bölüm 7.
- Pratikte yine de QuickSelect kullanılır, çünkü constant'ı çok küçük. Median of medians'ın constant'ı büyük (slayt s.50: "pick a random pivot if you don't expect nefarious arrays").
"Random pivot'lu Select'in worst-case ve expected running time'ı nedir? İki ifadenin farkını açıkla. Notlar pratikte neden bu sürümün kullanıldığını söylüyor?"
İpucu 1
Worst-case için: hiçbir yazı-tura dizisi yasak değil. Her seferinde en küçük eleman pivot olabilir mi?
İpucu 2
Expected için faz argümanı: bir fazda kaç recursive call beklersin, faz $i$'de bir recursive call ne kadar iş yapar?
Random pivot'un array'i, iki parçanın da boyu $\le 3n/4$ olacak şekilde partition etme probability'si yaklaşık kaçtır?
A=[7,4,3,6,1,9], k=4 global index. Last pivot kullanarak her [start,end) aralığını yaz. Sonra k=3 bir rank olsaydı hangi indeksi arardın?
İpucu
Çözümü göster
(0,6): pivot 9,r=5 → (0,5). Pivot 1,r=0 → (1,5). Pivot 7,r=4 → return 7. Rank 3 ise hedef indeks 2’dir. A/B/C formları index, D formu global rank kullanır.
Median of medians: ChoosePivot
Tam median'ı bulmak, çözmeye çalıştığımız problemin ta kendisi (Idea #2 bu yüzden döngüsel). Ama tam median'a gerek yok. En kötü ihtimalle %30–%70 partition veren bir pivot da yeter. Bu pivot'u küçük bir "temsilci" kümeden hesaplarız: 5'li grupların median'ları.
- $A$'yı $g = \lceil n/5 \rceil$ gruba böl (sonuncusunda 5'ten az eleman olabilir).
- Her grubu sort et, ortadakini al: median'lar kümesi $C$, $|C| = g$.
- $p \leftarrow$ Select$(C, g, \lceil g/2 \rceil)$: median of medians.
- $p$'yi döndür. Select partition'ı bununla yapar.
Örnek seç ve oynat. Sütunlar 5'li grupları gösterir. İspattaki resim için sütunlar median'larına göre dizilir; algoritmanın bunu yapması gerekmez.
1'den 43'e kadar sayılar karışık sırada. 9 grup var (sonuncusu $\{26, 35, 43\}$, 3 elemanlı). Median'lar $M = \{11, 27, 32, 17, 19, 10, 29, 24, 35\}$; sorted hâli $10, 11, 17, 19, \mathbf{24}, 27, 29, 32, 35$, ortadaki 24. Partition: $|L| = 23$, $|R| = 19$. Resimde x'ten kesin küçük 14, kesin büyük 13 eleman görülür.
- ChoosePivot içindeki Select, $n$ elemanlı $A$ üzerinde değil, $\lceil n/5 \rceil$ elemanlı $C$ üzerinde çalışır. Input küçüldüğü için recursion biter. Idea #2 ise Select$(A, n/2)$'yi aynı $A$ üzerinde isterdi.
- 5 elemanlı bir grubu sort etmek constant iş: MergeSort da InsertionSort da en fazla birkaç düzine işlem yapar. $\lceil n/5 \rceil$ grup ⇒ toplam $O(n)$. InsertionSort'un $n^2$'si burada $5^2 = 25$, yani bir constant.
"ChoosePivot'u adım adım anlat. Her 5'li grubu sort etmek neden grup başına $O(1)$, toplamda $O(n)$? Yavaş InsertionSort ile sort etsen algoritma yine linear olur mu?"
İpucu 1
Grup boyu $n$'e bağlı mı? Bir constant'ın karesi de constant'tır.
İpucu 2
Grup sayısı $\lceil n/5 \rceil$. Grup başına constant iş çarpı grup sayısı.
Gruplar $[9, 1, 7, 3, 5]$, $[2, 8, 6, 4, 10]$, $[15, 11, 13, 12, 14]$. Median of medians kaçtır?
Lemma: |L|, |R| ≤ 7n/10 + 5
Grupların yarısının median'ı $x$'ten küçük. Bu grupların her birinde 3 eleman (median ve altındaki iki eleman) $x$'ten küçük. Grupların yarısı $\approx n/10$ grup eder, çarpı 3 ⇒ $\approx 3n/10$ eleman kesin olarak $x$'ten küçük. Demek ki $x$'ten büyükler en fazla $\approx 7n/10$. Simetrik olarak küçükler için de aynısı geçerli.
$g = \lceil n/5 \rceil$. $x$, $g$ median'ın median'ı olduğu için $\lceil g/2 \rceil$ grubun median'ı $\le x$ (x'in kendi grubu dâhil). x'in kendi grubu ve eksik kalan son grup hariç geriye en az $\lceil g/2 \rceil - 2$ grup kalır. Bunların her biri $x$'ten küçük 3 eleman verir:
$$|R| \le (n - 1) - 3\left(\left\lceil \tfrac g2 \right\rceil - 2\right) = n + 5 - 3\left\lceil \tfrac g2 \right\rceil \le n + 5 - \tfrac{3n}{10} = \tfrac{7n}{10} + 5$$(Son adım: $\lceil g/2 \rceil \ge g/2 \ge n/10$.) $|L|$ için hesap aynı.
- 3 nereden? Sorted 5'li grupta median ve ondan küçük 2 eleman.
- "Grupların yarısı" nereden? $x$ median of medians olduğu için median'ların yarısı ondan küçük.
- +5 nereden? İki grubu saymadık ($-2$ grup, yani $+6$) ve $x$'in kendisi ne $L$'de ne $R$'de ($-1$): $6 - 1 = 5$.
Bilkent slaytları "$|R| \ge 3n/10 - 6$" yazıp recursion'ı en fazla $n - (3n/10 - 6) = 7n/10 + 6$ eleman üzerinde kurar ($x$'i çıkarmadan sayar). Constant'ın 5 ya da 6 olması fark etmez, ikisi de aynı $O(n)$'i verir.
Master theorem burada uygulanmaz, çünkü iki farklı boyda subproblem var. Sadeleştirilmiş $T(n) \le T(n/5) + T(7n/10) + cn$ için substitution: $T(n) \le dn$ tahmin et;
$$\tfrac{d n}{5} + \tfrac{7 d n}{10} + cn = \tfrac{9}{10}dn + cn \le dn \iff d \ge 10c.$$$d = \max(T(1), 10c)$ ile $T(n) = O(n)$. İkinci recursive call neden $n/2$ değil de $7n/10$? Çünkü tam median yerine yaklaşığını hesapladık. Dengeden biraz kaybettik, karşılığında pivot'u hesaplanabilir hâle getirdik.
$n = 15$: gruplar $[1, 2, 3, 14, 15]$, $[4, 5, 6, 12, 13]$, $[7, 8, 9, 10, 11]$. Median'lar 3, 6, 9 ⇒ $x = 6$. Gerçek median 8. $|L| = 5$, $|R| = 9$.
Bound $7 \cdot 15/10 + 5 = 15.5 > 15$: küçük $n$'de lemma hiçbir şey söylemez. $7n/10 + 5 < n \iff n > 50/3$, yani lemma $n \ge 17$'den itibaren anlamlı. Slaytlardaki pseudocode'un "len(A) ≤ 50 ise sort et" base case'i bu yüzden var.
"Standart resmi çiz: gruplar sütun, sütunlar sorted, sütunlar median'a göre dizili. $x$'ten kesin küçük elemanları tara. $|A_<|, |A_>| \le 7n/10 + 5$ eşitsizliğini 3'ün, 'grupların yarısı'nın ve +5'in nereden geldiğiyle açıkla."
İpucu 1
Bölüm 7'deki animasyonun 5. karesi tam bu resim. Taralı bölge $x$'in sol üstü.
İpucu 2
Taralı sütun sayısını $\lceil g/2 \rceil$ cinsinden yaz, iki sütunu "güvenilmez" diye çıkar, sonra $n - 1$'den düş.
Çözümü göster
Her sütun kendi içinde küçükten büyüğe sorted (üstte küçük), sütunlar median'a göre soldan sağa dizili. $x$ ortadaki sütunun median'ı. Solundaki her sütunun median'ı $\le x$ ve o sütunda median'ın üstündeki 2 eleman da median'dan küçük ⇒ sütun başına 3 eleman $< x$. Böyle $\lceil g/2\rceil$ sütun var. $x$'in sütunu (orada $x$ hariç sadece 2 eleman var) ve eksik son grup için 2 sütun düşülür: en az $3(\lceil g/2\rceil - 2) \ge 3n/10 - 6$ eleman $< x$. $x$ hariç toplam $n - 1$ eleman var ⇒ $|R| \le n - 1 - 3n/10 + 6 = 7n/10 + 5$. $|L|$ simetrik (sağ alt bölge).
$n = 1000$ iken median of medians pivot'uyla Select'in ikinci recursive call'u en fazla kaç elemanlıdır (Lemma 5)?
Neden 5'li grup?
İki recursive call'un boy oranlarının toplamı 1'den küçükse her level'daki toplam iş bir öncekinin constant bir kesri olur: geometric series, $O(n)$. Toplam tam 1 ise her level $n$ iş yapar, $\log n$ level ⇒ $n\log n$.
$s$ elemanlı gruplarda içteki recursive call $n/s$ boyunda. Grupların yarısının her biri $(s+1)/2$ eleman verir ⇒ kesin küçükler $\approx \frac{s+1}{2}\cdot\frac{n}{2s}$, dıştaki recursive call $\approx \frac{3s-1}{4s}n$.
| Grup boyu | İç recursive call | Dış recursive call | Toplam | Sonuç |
|---|---|---|---|---|
| 3 | $n/3$ | $2n/3$ | $1$ | $\Theta(n\log n)$ |
| 5 | $n/5$ | $7n/10$ | $9/10$ | $O(n)$, $d \ge 10c$ |
| 7 | $n/7$ | $5n/7$ | $6/7$ | $O(n)$, $C = 7$ |
Tablodaki oranları aynı array'de gör. Sütunlar sorted gruplar, median'larına göre dizili. Mavi hücreler $x$'ten kesin küçük, turuncular kesin büyük. Gri olanlar hakkında resim hiçbir şey söylemez, onlar $x$'in iki tarafına da düşebilir. Dıştaki recursive call en kötü ihtimalle bilinmeyenlerin hepsini ve bir taraftaki kesinleri birlikte alır.
Önce tahmin et: $n = 45$ iken 3'lü, 5'li ve 7'li gruplarda iki recursive call'un boyları toplamı $n$'nin kaçta kaçı olur? Hangisi 1'e en yakın?
- 7'li: $T(n) = n + T(n/7) + T(5n/7)$. $T \le Cn$: $\tfrac{6}{7}Cn + n \le Cn \iff C \ge 7$. En küçük $C = 7$.
- 3'lü: $T(n) = n + T(n/3) + T(2n/3)$. $\tfrac13 + \tfrac23 = 1$: $Cn + n \le Cn$ hiçbir $C$ ile sağlanmaz. Her level tam $n$ iş yapar, derinlik $\log_{3/2} n$ ⇒ $\Theta(n\log n)$.
- Oranlar toplamı 1'den büyükse (class prep L3 S3) level işi büyür ve sonuç linear'dan da kötü olur.
Grup büyüdükçe algoritma iyileşmez. 5 ve üstü her constant grup boyunda sonuç $O(n)$, ama grubu sort etme maliyeti ve constant'lar büyür. 5, linear sonucu veren en küçük grup boyu (4'lü gruplarda da oranlar toplamı $\tfrac14 + \tfrac34 = 1$ çıkar).
Çoktan seçmeli recurrence sorusu: "$T(n) = T(n/2) + T(n/10) + T(n/20) + n$." Seçenekler $\Theta(\log n)$, $\Theta(n)$, $\Theta(n\log n)$, $\Theta(n^{\log_2 3})$, $\Theta(n^3)$.
İpucu 1
Oranları topla: $\tfrac12 + \tfrac1{10} + \tfrac1{20}$. 1'den küçük mü?
İpucu 2
$T(n) \le dn$ tahmin et. $d$ için bir koşul çıkıyor mu? Lower bound için $+n$ terimine bak.
Çözümü göster
Toplam $\tfrac{13}{20} < 1$. Substitution: $\tfrac{13}{20}dn + n \le dn \iff d \ge \tfrac{20}{7}$. Yani $T(n) = O(n)$. $+n$ terimi yüzünden $T(n) \ge n$, sonuç $\Theta(n)$ (seçenek 2).
"3'lü ve 7'li gruplarla analizi tekrarla: iki subproblem'in boyu ne, oranların toplamı ne, recurrence $O(n)$ verir mi? 3'ün neden çok küçük olduğunu substitution cevaplarınla açıkla."
İpucu 1
3'lü grupta median ve altındaki 1 eleman: grup başına 2 kesin küçük, grupların yarısı $n/6$.
İpucu 2
Substitution'da $\tfrac13 Cn + \tfrac23 Cn + n \le Cn$ yazmayı dene. Nerede takılıyorsun?
Gruplar 3'lü olursa Select'in recurrence'ı ve sonucu ne olur?
Select ile çözülen sorular
| Yol | Running time | Ne zaman iyi? |
|---|---|---|
| (i) Sort et, ilk $k$'yı al | $O(n\log n)$ | Output'un sorted olması da isteniyorsa |
| (ii) $x$ = Select$(A, n, k)$, sonra bir tarama: $\le x$ olanları topla | $O(n)$ | Her $k$ için asymptotic olarak en iyi |
| (iii) $k$ kez SelectMin, her seferinde çıkar | $O(kn)$ | Sadece $k = O(1)$ iken (ii) ile aynı mertebede; $k = \omega(\log n)$ olunca sorting'den bile kötü |
En küçük $k = \sqrt n$ elemanı (sorted olması gerekmeden) istiyorsun. En hızlı yol hangisi?
"Implement an O(n) algorithm that, given a set S of n distinct numbers and a positive integer k≤n, determines the k numbers in S that have the closest value to the median of S."
2019-20 vizesinde aynı soru "Describe an O(n) algorithm … that are closest to the median of S" diye sorulmuştu. Tek ders sınavı bir programlama sınavı: "Implement" burada bir function yazmak demek.
İpucu 1
Önce median $m$'yi bul. Hangi algoritma bunu $O(n)$'de yapar?
İpucu 2
"Değerce en yakın" = $|s - m|$ en küçük. Her eleman için bu mesafeyi hesapla. Soru yine bir selection problem'ine dönüştü.
İpucu 3
Mesafeler arasında $k$-th smallest olanı bul, sonra tek taramayla ondan büyük olmayanları topla. İki sayı aynı mesafede olabilir ($m - d$ ve $m + d$). Select distinct eleman istiyor: mesafeyi değerle birlikte $(|s - m|, s)$ çifti olarak tut.
Çözümü göster
- $m \leftarrow$ Select$(S, \lceil n/2 \rceil)$ (median of medians): $O(n)$.
- Her $s \in S$ için $D$'ye $(|s - m|, s)$ çiftini yaz: $O(n)$. $S$'nin elemanları farklı olduğu için çiftler de farklı (lexicographic sıra: önce mesafe, eşitse değer).
- $t \leftarrow$ Select$(D, k)$, yani $k$-th smallest çift: $O(n)$.
- $D$'yi tara, $\le t$ olan çiftlerin $s$'sini output'a yaz. Tam $k$ eleman çıkar: $O(n)$.
def closest_to_median(S, k):
n = len(S)
m = select(S, (n + 1) // 2) # median, O(n)
D = [(abs(s - m), s) for s in S] # (mesafe, değer), hepsi farklı
t = select(D, k) # k-th smallest çift, O(n)
return [s for (d, s) in D if (d, s) <= t] # tam k eleman, O(n)
Burada select, Bölüm 7'deki median of medians Select'i. Toplam: üç $O(n)$ adım ve bir tarama, yani worst case $O(n)$.
Neden doğru: $t$, $k$-th smallest çift olduğu için tam $k$ çift $\le t$. Seçilen her elemanın mesafesi, seçilmeyen her elemanın mesafesinden büyük değil. Median'ın kendisi mesafe 0 ile her zaman seçilir; $k \le n$ olduğu için onu dışarıda bırakamayız, yoksa $k = n$ iken $k$ eleman bulunamaz.
Örnek: $S = [3, 19, 7, 40, 11, 16, 1, 14, 28]$, $k = 3$. Sorted hâli $1, 3, 7, 11, 14, 16, 19, 28, 40$ ⇒ $m = 14$. Çiftler sırayla $(0, 14), (2, 16), (3, 11), (5, 19), (7, 7), \ldots$ ⇒ $t = (3, 11)$, cevap $\{14, 16, 11\}$.
Eşit mesafe: $S = [1, 4, 5, 6, 9]$, $k = 2$, $m = 5$. 4 ve 6'nın mesafesi 1. Çiftler $(0, 5), (1, 4), (1, 6), \ldots$ ⇒ $t = (1, 4)$, cevap $\{5, 4\}$. $\{5, 6\}$ de doğru bir cevap; çift sırası sadece birini seçmemizi sağlıyor.
Not: Repodaki referans çözüm median'a rank olarak en yakın $k$ elemanı alıyor. Soru değerce yakınlığı soruyor; doğru yöntem yukarıda.
Repodaki 2019-20 çözüm notu, sorted array'de median'ın sağındaki ve solundaki $k/2$ konumu alıyor. Bu, rank'i en yakın elemanları verir. Counterexample: $S = [1, 2, 10, 11, 12]$, $k = 3$, $m = 10$. Rank komşuları $\{2, 10, 11\}$, ama değerce en yakınlar $\{10, 11, 12\}$ (mesafe 0, 1 ve 2; 2'nin mesafesi 8). 2020-21 sorusu "closest value" diyerek bunu açıkça istiyor.
"QuickSort'u worst case'te $O(n\log n)$ çalışacak şekilde nasıl değiştirirsin? Kısaca açıkla."
İpucu 1
QuickSort'u $n^2$'ye ne götürüyor? Dengesiz pivot.
İpucu 2
Tam median'ı worst case'te $O(n)$'de bulabiliyorsun.
Çözümü göster
Her adımda pivot'u median of medians Select'iyle tam median olarak seç: Select$(A, n, \lceil n/2 \rceil)$, $O(n)$. Partition zaten $O(n)$. İki yarı da $\le n/2$: $T(n) = 2T(n/2) + O(n) = O(n\log n)$, worst case'te bile. (Pratikte constant büyük olduğu için random pivot tercih edilir.)
"$n$ uzunluklu iki array veriliyor; ikisinin birleşiminin median'ını bul. (1.1) Array'ler unsorted ise algoritma ve bunun neden en iyi running time olduğu. (1.2) İki array de sorted ise daha hızlısı?"
İpucu 1 (1.1)
İki array'i tek array'de topla, $2n$ elemanlı array'de Select çalıştır. Lower bound için Bölüm 2: okunmayan bir eleman median'ı değiştirebilir.
İpucu 2 (1.2)
Daha genel soru: iki sorted array'de $k$-th smallest. $A$'nın ve $B$'nin $\lfloor k/2\rfloor$. elemanını karşılaştır. Küçük olanın o elemana kadar olan kısmı $k$-th elemanı içerebilir mi?
İpucu 3 (1.2)
$A[i] \le B[i]$ ($i = \lfloor k/2 \rfloor$) ise $A[i]$'den küçük en fazla $(i-1) + (i-1) \le k-2$ eleman var, yani $A[1..i]$'nin hepsi $k$-th elemandan önce gelir: at, $k \leftarrow k - i$. Her adım $k$'yı yarıya indirir.
Çözüm taslağını göster
1.1: İki array'i tek array'de topla ($O(n)$), $2n$ eleman üzerinde Select ile $n$-th elemanı bul: $O(n)$. Daha hızlısı olamaz: bir elemanı okumayan algoritmaya karşı o eleman değiştirilip median kaydırılabilir, yani lower bound $\Omega(n)$.
1.2: kth$(A, B, k)$: array'lerden biri boşsa öbürünün $k$-th elemanını döndür; $k = 1$ ise $\min(A[1], B[1])$. Yoksa $i = \min(\lfloor k/2 \rfloor, |A|)$, $j = \min(\lfloor k/2 \rfloor, |B|)$; $A[i] \le B[j]$ ise $A$'nın ilk $i$ elemanını at ve $k \leftarrow k - i$, değilse $B$'nin ilk $j$ elemanını at ve $k \leftarrow k - j$. Median $=$ kth$(A, B, n)$. Her adım $k$'yı yaklaşık yarıya indirir: $O(\log n)$.
Son kontrol
Kâğıt kalemle çöz, sonra cevaba bak.
Select'te $k = 9$ ve partition sonrası $|L| = 4$. Hangi recursive call yapılır?
Random pivot'lu Select'in (QuickSelect) worst-case running time'ı nedir?
Median of medians'ta $T(n) \le T(n/5) + T(7n/10) + cn$ neden $O(n)$?
Lemma 5'teki "$+5$" nereden gelir?