Bölüm 6: Böl ve Fethet Yaklaşımı
Çoktan Seçmeli · Paradigma
Soru 1: İş Nerede Yapılır?
Birleştirme sıralamasında ve hızlı sıralamada asıl iş (karşılaştırmaların hemen hepsi) hangi adımda yapılır?
C: Birleştirme sıralaması diziyi ortadan böler (O(1)), işi sıralı yarıları birleştirirken yapar. Hızlı sıralamada iş pivota göre parçalamadadır; parçalar yerinde sıralandığı için birleştirme adımı yoktur.
Çoktan Seçmeli · Özyineleme Bağıntıları
Soru 2: Hangi Bağıntı?
Algoritma ile özyineleme bağıntısı eşleştirmelerinden hangisi doğrudur?
C: us tek bir özyinelemeli çağrı yapar (y bir kez hesaplanır) ve sabit sayıda çarpma ekler → Θ(log n). Birleştirme sıralaması 2T(n/2) + Θ(n), ikili arama T(n/2) + Θ(1)'dir; fib iki çağrı yaptığı için T(n) = T(n − 1) + T(n − 2) + Θ(1) → üstel.
Klasik Soru · Özyineleme Bağıntıları
Soru 3: Ana Teoremle Çözüm
Aşağıdaki üç bağıntıyı ana teoremle çözün; her biri için a, b, nlogba, durum ve sonucu yazın.
(a) T(n) = 8T(n/2) + n² (b) T(n) = 2T(n/2) + n² (c) T(n) = 4T(n/2) + n²
Cevabı göster
| a, b | nlogba | f(n) | durum | T(n) | |
|---|---|---|---|---|---|
| (a) | 8, 2 | n³ | n² | 1 (yapraklar) | Θ(n³) |
| (b) | 2, 2 | n | n² | 3 (kök) | Θ(n²) |
| (c) | 4, 2 | n² | n² | 2 (eşit) | Θ(n² log n) |
(a) saf blok matris çarpımının bağıntısıdır: 8 alt çarpım yüzünden kazanç yoktur. (b)'de düzenlilik koşulu sağlanır: 2·(n/2)² = n²/2 ≤ ½·n². (c)'de her düzeyin toplamı n²'dir ve log₂ n düzey vardır.
f(n) ile nlogba karşılaştırılır; büyük olan kazanır, eşitse bir log n çarpanı eklenir.
Çoktan Seçmeli · Özyineleme Bağıntıları
Soru 4: Karekök Bağıntısı
T(n) = 2T(n/4) + √n bağıntısının ana teoreme göre çözümü nedir?
A: a = 2, b = 4 → nlog₄2 = n1/2 = √n. f(n) = √n ile aynı mertebede → durum 2 → Θ(√n · log n). Θ(√n) seçeneği log çarpanını unutur; Θ(n · log n) ise kritik üssü 1 sanmaktan gelir.
Çoktan Seçmeli · Özyineleme Bağıntıları
Soru 5: Ana Teoremin Sınırı
Aşağıdaki bağıntılardan hangisine ana teorem doğrudan uygulanabilir?
D: a = 9, b = 3 → nlog₃9 = n² = f(n) → durum 2 → Θ(n² log n). A sabit azaltmadır (b yok), B eşit olmayan bölmedir, C'de f(n) = n/log n, n'den polinom olarak küçük değildir (durumlar arasında kalır). Bunlar özyineleme ağacı ya da yerine koyma ile çözülür.
Çıktı Sorusu · Hızlı Üs Alma
Soru 6: Çarpım Sayacı
Hızlı üs alma kodu yaptığı çarpımları sayacak biçimde değiştirildi. Program ne yazar? Saf yöntem (döngüyle n − 1 çarpım) ile karşılaştırın.
static int carpim = 0; static long us(long x, int n) { if (n == 0) return 1; long y = us(x, n / 2); if (n % 2 == 0) { carpim += 1; return y * y; } carpim += 2; return x * y * y; } // main: long s = us(2, 20); System.out.println(s + " " + carpim);
Cevabı göster
Çıktı: 1048576 7
- n dizisi: 20 → 10 → 5 → 2 → 1 → 0.
- Çarpımlar: n = 1 (tek): 2, n = 2 (çift): 1, n = 5 (tek): 2, n = 10: 1, n = 20: 1 → 7.
- Saf yöntem 19 çarpım yapar. Hızlı üs alma en çok 2·(⌊log₂ n⌋ + 1) çarpım yapar: T(n) = T(n/2) + O(1) = O(log n).
Çoktan Seçmeli · Hızlı Üs Alma
Soru 7: Yarımı İki Kez Hesaplamak
us metodunda y değişkeni kullanılmayıp çift n için return us(x, n / 2) * us(x, n / 2); yazılırsa (tek n için de benzer biçimde) çalışma süresi ne olur?
B: İki çağrı ve sabit ek iş: T(n) = 2T(n/2) + Θ(1). Ana teoremde a = 2, b = 2, log₂ 2 = 1 > 0 → Durum 1 → Θ(n). Özyineleme ağacında log₂ n düzey vardır ama yaprak sayısı n'dir. us(3, 11) bu sürümle 31, us(2, 16) 63 çağrı yapar; tek çağrılı sürüm 5 ve 6 çağrı.
Çıktı Sorusu · Dışbükey Örtü
Soru 8: Yönelim Testi
A = (1, 1) en sol, B = (9, 3) en sağ noktadır. capraz(A, B, X) değerlerini P, Q, R, S, T için hesaplayın. Üst kümede Quickhull hangi noktayı C olarak seçer; ACB üçgeni içinde kalan hangi nokta elenir?capraz = (B.x − A.x)(P.y − A.y) − (B.y − A.y)(P.x − A.x)
Cevabı göster
capraz = 8·(y − 1) − 2·(x − 1):
| P | Q | R | S | T | |
|---|---|---|---|---|---|
| capraz | 36 | -18 | 40 | 18 | 16 |
| taraf | sol | sağ | sol | sol | sol |
- Üst (sol) küme: P, R, S, T. En büyük capraz R (40) → C = R örtüdedir. Alt kümede tek nokta Q (−18) vardır.
- T için capraz(A, R, T) = 4·3 − 6·4 = −12 ve capraz(R, B, T) = 4·(−3) − (−4)·0 = −12: iki kenarın da sağında → üçgenin içinde, T elenir.
- capraz(A, R, P) = 8 > 0 → P, AR'nin dışında; capraz(R, B, S) = 4 > 0 → S, RB'nin dışında. Özyineleme bu iki kümeyle sürer.
Çoktan Seçmeli · Dışbükey Örtü
Soru 9: Quickhull'un En Kötü Durumu
Quickhull hangi durumda O(n²) sürer?
B: Her çağrı S'yi bir kez tarar: O(|S|). Bölme hep 1 ve |S| − 2 gibi dengesizse T(n) = T(n − 1) + O(n) = O(n²) olur (ör. noktalar dışbükey bir eğri üzerinde ve en uzak nokta hep bir uca komşu). Noktaların çoğu ilk üçgenin içindeyse tam tersine hepsi bir adımda elenir; bu en hızlı durumdur.
Çıktı Sorusu · En Yakın Nokta Çifti
Soru 10: Orta Şeridi Tarama
En yakın çift algoritmasında L doğrusu x = 10'dadır; iki yarıdan dSol = 5, dSag = 4 döndü. Y (y'ye göre sıralı) listesi: (8,1), (13,2), (11,4), (7,6), (12,9), (9,10), (15,12). Şerit hangi noktalardan oluşur, kaç uzaklık hesaplanır ve kod hangi d'yi döndürür?
double d = Math.min(dSol, dSag); List<Nokta> s = new ArrayList<>(); // şerit for (Nokta p : Y) // y sırası if (Math.abs(p.x - m.x) < d) s.add(p); for (int i = 0; i < s.size(); i++) { Nokta p = s.get(i); for (int j = i + 1; j < s.size() && s.get(j).y - p.y < d; j++) d = Math.min(d, mesafe(p, s.get(j))); } return d;
Cevabı göster
- d = min(5, 4) = 4. Şerit |x − 10| < 4: (15,12) dışarıda; 6 nokta kalır (y sırası korunur).
- Her nokta yalnızca y farkı d'den küçük olan sonrakilerle karşılaştırılır; d küçüldükçe iç döngü daha erken durur.
- Hesaplanan uzaklıklar: (8,1)–(13,2) = 5,1, (8,1)–(11,4) = 4,24, (13,2)–(11,4) = 2,83, (11,4)–(7,6) = 4,47, (12,9)–(9,10) = 3,16 → 5 uzaklık.
- Sonuç: d = 2,83, çift (13,2)–(11,4). Bu çift L'yi keser; iki yarıda ayrı ayrı bulunamazdı.
Çoktan Seçmeli · En Yakın Nokta Çifti
Soru 11: Neden En Çok 7 Komşu?
Şeritteki bir p noktasının en çok 7 sonraki noktayla karşılaştırılması yeterlidir. Bunun gerekçesi hangisidir?
D: p'nin üstündeki δ × 2δ dikdörtgen, kenarı δ/2 olan 8 kareye bölünür. Bir karedeki iki nokta aynı yarıda olur ve aralarındaki uzaklık en çok δ/√2 < δ olurdu; bu, o yarının en yakın uzaklığının δ olmasıyla çelişir. Şerit uzun olabilir; sınırlı olan, her noktanın komşu sayısıdır.
Adım Adım Çalıştırma · Karatsuba
Soru 12: Karatsuba İzleme
System.out.println(karatsuba(47, 85)) çağrısının çağrı ağacını ve her çağrının döndürdüğü değeri izleyin.
main, karatsuba(47, 85)'i çağırır. Kod üç özyinelemeli çağrı yapar: z0 = b·d, z1 = (a + b)(c + d), z2 = a·c.
Her iki sayı da ≥ 10 → taban değil. n = 2, p = 10¹ = 10: a = 4, b = 7, c = 8, d = 5 (47 = 4·10 + 7, 85 = 8·10 + 5).
z0 = karatsuba(b, d) = karatsuba(7, 5): 7 < 10 → taban, doğrudan 35.
z1 = karatsuba(a + b, c + d) = karatsuba(11, 13): ikisi de ≥ 10. n = 2, p = 10 → a = 1, b = 1, c = 1, d = 3.
İç z0 = karatsuba(1, 3) = 3 (taban).
İç z1 = karatsuba(1 + 1, 1 + 3) = karatsuba(2, 4) = 8 (taban).
İç z2 = karatsuba(1, 1) = 1 (taban).
11 · 13 = z2·p² + (z1 − z2 − z0)·p + z0 = 1·100 + (8 − 1 − 3)·10 + 3 = 143.
z2 = karatsuba(a, c) = karatsuba(4, 8) = 32 (taban).
47 · 85 = 32·100 + (143 − 32 − 35)·10 + 35 = 3200 + 760 + 35 = 3995. 7 çağrı, 5 taban çarpımı (okul yöntemi 4 basamak çarpımı yapardı; kazanç büyük n'de belirginleşir).
long karatsuba(long x, long y) { if (x < 10 || y < 10) return x * y; int n = Math.max(basamak(x), basamak(y)); long p = (long) Math.pow(10, n / 2); long a = x / p, b = x % p; long c = y / p, d = y % p; long z0 = karatsuba(b, d); long z1 = karatsuba(a + b, c + d); long z2 = karatsuba(a, c); return z2 * p * p + (z1 - z2 - z0) * p + z0; }
Çoktan Seçmeli · Karatsuba
Soru 13: Karatsuba'da Çarpım Sayısı
n = 2k basamaklı iki sayı Karatsuba ile çarpılıyor; her bölmede yarıların tam n/2 basamak olduğu ve tabanın tek basamaklı çarpım olduğu kabul ediliyor. n = 8 için kaç tek basamaklı çarpım yapılır?
C: Her düzeyde çarpım sayısı 3 katına çıkar: 3log₂8 = 3³ = 27. Okul yöntemi n² = 64 çarpım yapar (4 alt çarpımlı saf böl ve fethet de 4³ = 64). 24 = 3·8, düzey sayısının yanlış hesaplanmasından gelir. Genel olarak nlog₂3 ≈ n1,585.
Adım Adım Çalıştırma · Strassen
Soru 14: Strassen Adım Adım
A = [[2, 1], [0, 3]] ve B = [[1, 4], [5, 2]] matrislerinin çarpımını Strassen'in yedi çarpımıyla hesaplayın.
A = [[2, 1], [0, 3]], B = [[1, 4], [5, 2]]. Bloklar 1×1 olduğu için her blok tek bir sayıdır: A11 = 2, A12 = 1, A21 = 0, A22 = 3; B11 = 1, B12 = 4, B21 = 5, B22 = 2.
P1 = A11·(B12 − B22) = 2·(4 − 2) = 4.
P2 = (A11 + A12)·B22 = (2 + 1)·2 = 6.
P3 = (A21 + A22)·B11 = (0 + 3)·1 = 3.
P4 = A22·(B21 − B11) = 3·(5 − 1) = 12.
P5 = (A11 + A22)·(B11 + B22) = (2 + 3)·(1 + 2) = 15.
P6 = (A12 − A22)·(B21 + B22) = (1 − 3)·(5 + 2) = -14.
P7 = (A11 − A21)·(B11 + B12) = (2 − 0)·(1 + 4) = 10.
C11 = P5 + P4 − P2 + P6 = 15 + 12 − 6 − 14 = 7 · C12 = P1 + P2 = 10 · C21 = P3 + P4 = 15 · C22 = P5 + P1 − P3 − P7 = 15 + 4 − 3 − 10 = 6. Kontrol: 2·1 + 1·5 = 7 ✓.
P1 = A11 * (B12 - B22); P2 = (A11 + A12) * B22; P3 = (A21 + A22) * B11; P4 = A22 * (B21 - B11); P5 = (A11 + A22) * (B11 + B22); P6 = (A12 - A22) * (B21 + B22); P7 = (A11 - A21) * (B11 + B12); C11 = P5 + P4 - P2 + P6; C12 = P1 + P2; C21 = P3 + P4; C22 = P5 + P1 - P3 - P7;
Çoktan Seçmeli · Strassen
Soru 15: Strassen'de Skaler Çarpım
16 × 16'lık iki matris, taban durumu 1 × 1 olan Strassen algoritmasıyla çarpılıyor. Yapılan skaler çarpım sayısı ve klasik üç döngülü yöntemin çarpım sayısı nedir?
A: n = 2⁴ → 7⁴ = 2401 skaler çarpım; klasik yöntem n³ = 16³ = 4096 çarpım yapar. 343 ve 512, n = 8 içindir. Bağıntı T(n) = 7T(n/2) + Θ(n²) → Θ(nlog₂7) ≈ Θ(n2,807); kazanç tümüyle 8 → 7 azaltmasından gelir.
Klasik Soru · Değerlendirme
Soru 16: En Büyük Öğe
Bir dizinin en büyük öğesini böl ve fethet ile bulan int enBuyuk(int[] dizi, int alt, int ust) metodunu yazın. Özyineleme bağıntısı, çözümü ve n öğe için yapılan karşılaştırma sayısı nedir?
Cevabı göster
int enBuyuk(int[] d, int alt, int ust) { if (alt == ust) return d[alt]; int orta = (alt + ust) / 2; int sol = enBuyuk(d, alt, orta); int sag = enBuyuk(d, orta + 1, ust); return Math.max(sol, sag); }
T(n) = 2T(n/2) + O(1) → a = 2, b = 2, nlog₂2 = n > 1 → durum 1 → Θ(n).
Her birleştirme 1 karşılaştırma yapar; özyineleme ağacında n yaprak ve n − 1 iç düğüm vardır → n − 1 karşılaştırma, yani basit döngüyle aynı. Böl ve fethet burada süreyi değil, paralelliği iyileştirir: derinlik O(log n).
Çoktan Seçmeli · Değerlendirme
Soru 17: Paradigma Seçimi
Problemin yapısı ile uygun paradigma eşleştirmelerinden hangisi doğrudur?
D: Alt problemler bağımsızsa böl ve fethet, örtüşüyorsa dinamik programlama, yerel en iyi seçim küresel en iyiye götürüyorsa açgözlü yaklaşım uygundur. Örtüşen alt problemlerde düz böl ve fethet aynı işi tekrar tekrar yapar (Fibonacci: O(φⁿ)).