Bölüm 11: Böl ve Fethet Yaklaşımı
Çoktan Seçmeli · Paradigma
Soru 1: Bağımsız Alt Problemler
Böl ve fethet yaklaşımının verimli çalışması için alt problemler nasıl olmalıdır?
B: Aynı fonksiyon her alt problem için kendini özyinelemeli çağırır; alt problemler bağımsız olduğu için hiçbir iş tekrarlanmaz. Örtüşen alt problemlerde (Fibonacci) aynı iş defalarca yapılır ve dinamik programlama gerekir. 1 + (n − 1) gibi dengesiz bölmeler ise T(n) = T(n − 1) + O(n) = O(n²) verir.
Çoktan Seçmeli · Paradigma
Soru 2: İş 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.
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.
Ana fikir: 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?
C: 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) ise kritik üssü 1 sanmaktan gelir.
Çıktı Sorusu · Özyineleme Bağıntıları
Soru 5: Özyineleme Ağacı
T(n) = 3T(n/2) + n, T(1) = 1 bağıntısı için n = 8 iken özyineleme ağacının her düzeyindeki toplam iş nedir? T(8) kaçtır? Ana teorem hangi sonucu verir?
Cevabı göster
- Düzey 0: 8 · Düzey 1: 3 · 4 = 12 · Düzey 2: 9 · 2 = 18 · Yapraklar: 27 · T(1) = 27
- T(8) = 8 + 12 + 18 + 27 = 65 (kontrol: T(2) = 5, T(4) = 19, T(8) = 3·19 + 8 = 65)
Düzey toplamları 1,5 kat büyür; işin çoğu yapraklardadır. a = 3, b = 2 → nlog₂3 ≈ n1,585 > n → durum 1 → Θ(nlog₂3). Bu, Karatsuba çarpımının bağıntısıdır.
Çoktan Seçmeli · Özyineleme Bağıntıları
Soru 6: 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 · Arama ve Sıralama
Soru 7: İkili Arama Çıktısı
Dizi [2, 3, 4, 7, 8, 9, 10, 21, 22, 31, 33, 37, 38, 39, 40, 42, 45] ve aranan = 35 için kod ekrana ne yazar, ne döndürür? Kaç karşılaştırma turu yapılır?
int baslangic = 0; int bitis = dizi.length - 1; while (baslangic <= bitis) { int orta = baslangic + (bitis - baslangic) / 2; System.out.println(dizi[orta]); if (dizi[orta] == aranan) { return orta; } else if (dizi[orta] > aranan) { bitis = orta - 1; } else { baslangic = orta + 1; } } return -1;
Cevabı göster
Çıktı: 22 38 33 37 (alt alta); dönüş değeri -1.
- [0, 16] → orta 8: 22 < 35 → baslangic = 9
- [9, 16] → orta 12: 38 > 35 → bitis = 11
- [9, 11] → orta 10: 33 < 35 → baslangic = 11
- [11, 11] → orta 11: 37 > 35 → bitis = 10; aralık boş, döngü biter.
4 tur ≤ ⌊log₂ 17⌋ + 1 = 5. orta = baslangic + (bitis − baslangic) / 2 yazımı, çok büyük indislerde baslangic + bitis toplamının taşmasını önler.
Adım Adım Çalıştırma · Arama ve Sıralama
Soru 8: Özyinelemeli İkili Arama
System.out.println(ara(dizi, 0, 9, 50)) çağrısında hangi ara çağrıları yapılır ve ne yazdırılır?
Sıralı 10 öğeli dizide 50 aranıyor; 50 dizide yok. İlk çağrı ara(dizi, 0, 9, 50).
orta = (0 + 9) / 2 = 4. dizi[4] = 30 < 50 → sağ yarı: ara(5, 9).
orta = (5 + 9) / 2 = 7. dizi[7] = 55 > 50 → sol yarı: ara(5, 6).
orta = (5 + 6) / 2 = 5. dizi[5] = 38 < 50 → sağ yarı: ara(6, 6).
orta = (6 + 6) / 2 = 6. dizi[6] = 47 < 50 → sağ yarı: ara(7, 6).
alt = 7 > ust = 6: aralık boş → −1 döner. Bu −1, hiçbir işlem yapılmadan tüm çağrılar boyunca yukarı taşınır.
Çağrılar sırayla kapanır; main −1 alır. 4 karşılaştırma yapıldı (doğrusal arama 10). T(n) = T(n/2) + O(1) = O(log n).
int ara(int[] dizi, int alt, int ust, int aranan) { if (alt > ust) return -1; // boş aralık int orta = (alt + ust) / 2; if (dizi[orta] == aranan) return orta; if (dizi[orta] < aranan) return ara(dizi, orta + 1, ust, aranan); return ara(dizi, alt, orta - 1, aranan); }
Çoktan Seçmeli · Arama ve Sıralama
Soru 9: İkili Aramanın Ön Koşulu
İkili aramanın doğru sonuç vermesi için dizi hangi koşulu sağlamalıdır ve en kötü durum zaman karmaşıklığı nedir?
A: Ortadaki öğeye bakarak bir yarıyı atabilmek için dizi sıralı olmalıdır. Tekrar eden öğeler aramayı bozmaz; yalnızca kopyalardan hangisinin indisinin döneceği belli değildir (ilk kopya gerekiyorsa bulununca sola doğru aramaya devam edilir). Boyun 2'nin kuvveti olması gerekmez.
Adım Adım Çalıştırma · Arama ve Sıralama
Soru 10: birlestir İzleme
dizi = [3, 27, 38, 9, 10, 43] için birlestir(dizi, 0, 2, 5) çağrısında t dizisi nasıl dolar? Kaç karşılaştırma yapılır?
Sol yarı dizi[0..2] = [3, 27, 38], sağ yarı dizi[3..5] = [9, 10, 43] kendi içinde sıralı. t, 6 hücrelik geçici dizi; i sol, j sağ yarının başında.
dizi[0] = 3 ≤ dizi[3] = 9 → soldan 3 alınır.
dizi[1] = 27 > dizi[3] = 9 → sağdan 9 alınır.
dizi[1] = 27 > dizi[4] = 10 → sağdan 10 alınır.
dizi[1] = 27 ≤ dizi[5] = 43 → soldan 27 alınır.
dizi[2] = 38 ≤ dizi[5] = 43 → soldan 38 alınır. Sol yarı bitti (i = 3 > orta), ilk while sona erer.
İkinci while hiç dönmez (i > orta). Üçüncü while sağda kalan 43'ü olduğu gibi kopyalar.
arraycopy t'yi dizi[0..5]'e geri yazar: [3, 9, 10, 27, 38, 43]. 5 karşılaştırma yapıldı (en çok n − 1 = 5); birleştirme O(n).
void birlestir(int[] dizi, int alt, int orta, int ust) { int[] t = new int[ust - alt + 1]; int i = alt, j = orta + 1, k = 0; while (i <= orta && j <= ust) t[k++] = (dizi[i] <= dizi[j]) ? dizi[i++] : dizi[j++]; while (i <= orta) t[k++] = dizi[i++]; while (j <= ust) t[k++] = dizi[j++]; System.arraycopy(t, 0, dizi, alt, t.length); }
Çoktan Seçmeli · Arama ve Sıralama
Soru 11: Eşitlikte Hangisi?
birlestir metodunda dizi[i] <= dizi[j] koşulu dizi[i] < dizi[j] olarak değiştirilirse ne olur?
B: Eşitlikte artık sağ yarıdaki öğe önce alınır; eşit anahtarlı iki kaydın göreli sırası bozulur. Sonuç yine sıralıdır ve karşılaştırma sayısı değişmez; yalnızca kararlılık (stable) kaybolur. Kayıtlar başka bir alana göre önceden sıralanmışsa bu fark önemlidir.
Çıktı Sorusu · Arama ve Sıralama
Soru 12: Birleştirme Sırası
Birleştirme sıralamasına her birlestir çağrısından sonra bir yazdırma satırı eklendi. birlestirSirala(dizi, 0, 5) çağrısı dizi = [6, 2, 9, 1, 7, 3] için ne yazar?
void birlestirSirala(int[] dizi, int alt, int ust) { if (alt >= ust) return; int orta = (alt + ust) / 2; birlestirSirala(dizi, alt, orta); birlestirSirala(dizi, orta + 1, ust); birlestir(dizi, alt, orta, ust); System.out.println(alt + "-" + ust + " " + Arrays.toString(dizi)); }
Cevabı göster
0-1 [2, 6, 9, 1, 7, 3] 0-2 [2, 6, 9, 1, 7, 3] 3-4 [2, 6, 9, 1, 7, 3] 3-5 [2, 6, 9, 1, 3, 7] 0-5 [1, 2, 3, 6, 7, 9]
- Önce sol yarı [6, 2, 9] tamamen sıralanır (0-1, 0-2), sonra sağ yarı [1, 7, 3] (3-4, 3-5), en son iki yarı (0-5) birleşir.
- 5 birlestir çağrısı = n − 1 (her birleştirme bir iç düğüm). Yazdırma eklenmeseydi iş yine 2T(n/2) + Θ(n) = Θ(n log n) olurdu.
Adım Adım Çalıştırma · Arama ve Sıralama
Soru 13: parcala İzleme
Lomuto parçalaması dizi = [7, 2, 9, 4, 3, 8, 5] için parcala(dizi, 0, 6) çağrısında nasıl ilerler; dizi ve dönüş değeri ne olur?
pivot = dizi[ust] = 5 (turuncu). i = alt − 1 = −1: ≤ pivot bölgesi (yeşil) henüz boş.
dizi[0] = 7 > 5 → hiçbir şey yapılmaz; öğe sağ bölgede kalır.
dizi[1] = 2 ≤ 5 → i = 0, takas(0, 1) → [2, 7, 9, 4, 3, 8, 5].
dizi[2] = 9 > 5 → hiçbir şey yapılmaz; öğe sağ bölgede kalır.
dizi[3] = 4 ≤ 5 → i = 1, takas(1, 3) → [2, 4, 9, 7, 3, 8, 5].
dizi[4] = 3 ≤ 5 → i = 2, takas(2, 4) → [2, 4, 3, 7, 9, 8, 5].
dizi[5] = 8 > 5 → hiçbir şey yapılmaz; öğe sağ bölgede kalır.
takas(i + 1, ust): pivot 3. indise yerleşir. Solunda ≤ 5, sağında > 5 olanlar var; dönüş 3. Toplam 6 karşılaştırma: Θ(n).
int parcala(int[] dizi, int alt, int ust) { int pivot = dizi[ust]; int i = alt - 1; for (int j = alt; j < ust; j++) { if (dizi[j] <= pivot) { i++; takas(dizi, i, j); } } takas(dizi, i + 1, ust); return i + 1; }
Çoktan Seçmeli · Arama ve Sıralama
Soru 14: Sıralı Girdide Hızlı Sıralama
Pivotu her zaman son öğe seçen hızlı sıralama, zaten sıralı n öğeli bir diziye uygulanıyor. Bağıntı ve süre nedir?
D: Son öğe en büyüktür; parçalama bir tarafa n − 1 öğe, diğer tarafa 0 öğe bırakır. Her düzeyde O(n) iş, n düzey → n(n − 1)/2 karşılaştırma. Çare: rastgele pivot ya da üçün ortancası; bu durumda beklenen süre O(n log n) olur.
Çıktı Sorusu · Arama ve Sıralama
Soru 15: Kaç Karşılaştırma?
parcala metodundaki if (dizi[j] <= pivot) satırından önce sayac++ eklendi. Aşağıdaki kod ne yazar? n = 100 olsaydı sonuç ne olurdu?
static int sayac = 0; static void hizliSirala(int[] dizi, int alt, int ust) { if (alt < ust) { int p = parcala(dizi, alt, ust); hizliSirala(dizi, alt, p - 1); hizliSirala(dizi, p + 1, ust); } } // main: int[] dizi = {1, 2, 3, 4, 5, 6}; hizliSirala(dizi, 0, 5); System.out.println(sayac);
Cevabı göster
Çıktı: 15
- Sıralı dizide her pivot o aralığın en büyüğüdür; pivot yerinde kalır ve sağ parça boştur.
- parcala sırayla 6, 5, 4, 3, 2 öğelik aralıklarda çağrılır: 5 + 4 + 3 + 2 + 1 = 15 karşılaştırma.
- n = 100: n(n − 1)/2 = 4950. Dengeli bölmede bu sayı yaklaşık n log₂ n ≈ 664 olurdu.
Adım Adım Çalıştırma · Hızlı Üs Alma
Soru 16: Hızlı Üs Alma İzleme
System.out.println(us(2, 10)) çağrısında çağrı yığını nasıl değişir, her çağrı ne döndürür ve toplam kaç çarpım yapılır?
main, us(2, 10)'u çağırır: 2¹⁰ hesaplanacak. Her çağrı önce n/2 için kendini çağırır.
us(2, 10): y = us(2, 5) hesaplanmalı (n / 2 = 5).
us(2, 5): y = us(2, 2) hesaplanmalı (n / 2 = 2).
us(2, 2): y = us(2, 1) hesaplanmalı (n / 2 = 1).
us(2, 1): y = us(2, 0) hesaplanmalı (n / 2 = 0).
n = 0 → taban durumu: 1 döner. Zincirde 5 çerçeve birikti: n her seferinde yarıya iner.
us(2, 1): y = 1; 1 tek → x · y · y = 2 · 1 · 1 = 2 (2 çarpım).
us(2, 2): y = 2; 2 çift → y · y = 4 (1 çarpım).
us(2, 5): y = 4; 5 tek → x · y · y = 2 · 4 · 4 = 32 (2 çarpım).
us(2, 10): y = 32; 10 çift → y · y = 1024 (1 çarpım). Toplam 1 + 2 + 1 + 2 = 6 çarpım (saf yöntem 9).
long us(long x, int n) { if (n == 0) return 1; // taban long y = us(x, n / 2); if (n % 2 == 0) return y * y; // çift return x * y * y; // tek }
Çıktı Sorusu · Hızlı Üs Alma
Soru 17: Ç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).
Çıktı Sorusu · Hızlı Üs Alma
Soru 18: Örtüşen Alt Problemler
Düz özyinelemeli Fibonacci koduna bir çağrı sayacı eklendi. Program ne yazar? Kaç kez fib(2) hesaplanır?
static int cagri = 0; static long fib(int n) { cagri++; if (n < 2) return n; return fib(n - 1) + fib(n - 2); } // main: long f = fib(6); System.out.println(f + " " + cagri);
Cevabı göster
Çıktı: 8 25
- Çağrı sayısı c(n) = 1 + c(n − 1) + c(n − 2), c(0) = c(1) = 1: c(2) = 3, c(3) = 5, c(4) = 9, c(5) = 15, c(6) = 25.
- fib(2) 5 kez hesaplanır: alt problemler bağımsız değil, örtüşüyor. T(n) = T(n − 1) + T(n − 2) + O(1) = O(φⁿ).
- Sonuçları saklayan dinamik programlama aynı değeri O(n) sürede bulur; bu yüzden Fibonacci böl ve fethet için kötü bir örnektir.
Çıktı Sorusu · Dışbükey Örtü
Soru 19: 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 20: 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 21: 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 22: Şeridi Yeniden Sıralamak
En yakın nokta çifti algoritmasında noktalar baştan bir kez y'ye göre sıralanmak yerine şerit her çağrıda y'ye göre yeniden sıralanırsa toplam süre ne olur?
A: Birleştirme adımı O(n log n) olur: T(n) = 2T(n/2) + O(n log n). Özyineleme ağacının log n düzeyinin her biri O(n log n) iş yapar → O(n log² n). Y listesi önceden sıralanıp bölmede sıra korunursa birleştirme O(n), toplam O(n log n) kalır.
Çoktan Seçmeli · En Yakın Nokta Çifti
Soru 23: 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 24: 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 25: 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.
Klasik Soru · Karatsuba
Soru 26: Karatsuba ile 21 · 43
21 · 43 çarpımını Karatsuba yöntemiyle (m = 1, 10m = 10) hesaplayın: a, b, c, d, z2, z0, z1 ve ad + bc değerlerini yazın. Saf böl ve fethette kaç çarpım gerekirdi?
Cevabı göster
- a = 2, b = 1, c = 4, d = 3
- z2 = a·c = 8 · z0 = b·d = 3 · z1 = (a + b)(c + d) = 3·7 = 21
- ad + bc = z1 − z2 − z0 = 21 − 8 − 3 = 10 (kontrol: 2·3 + 1·4 = 10)
- Sonuç: 8·100 + 10·10 + 3 = 903
Saf böl ve fethet ac, ad, bc, bd için 4 çarpım yapar; Karatsuba 3 çarpım ve birkaç toplama/çıkarma ile yetinir. Bağıntı 4T(n/2) + O(n) = O(n²) yerine 3T(n/2) + O(n) = O(n1,585).
Adım Adım Çalıştırma · Strassen
Soru 27: 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 28: Strassen Formülleri
Strassen'in yedi çarpımı (P1 … P7) ile sonuç blokları için aşağıdakilerden hangisi doğrudur?
A: Doğru formüller: C11 = P5 + P4 − P2 + P6, C12 = P1 + P2, C21 = P3 + P4, C22 = P5 + P1 − P3 − P7. C'deki + P7 en sık yapılan işaret hatasıdır: program hata vermeden yanlış matris üretir. Bu yüzden uygulama küçük bir örnekte klasik yöntemle karşılaştırılarak test edilir.
Çoktan Seçmeli · Strassen
Soru 29: 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 30: 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 31: 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(φⁿ)).