Bölüm 11: Böl ve Fethet Yaklaşımı

Bölüm 11: Böl ve Fethet Yaklaşımı · Çalışma Soruları
Böl · Yönet · BirleştirÖzyineleme ağacı ve ana teoremİkili arama ve sıralamaHızlı üs almaQuickhullEn yakın nokta çiftiKaratsuba ve Strassen
Sercan KÜLCÜ

Ç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, bnlogbaf(n)durumT(n)
(a)8, 2n³n²1 (yapraklar)Θ(n³)
(b)2, 2nn²3 (kök)Θ(n²)
(c)4, 2n²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?

844422222222227 yaprak: T(1) = 183·4 = 129·2 = 1827
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?

4091132213304385476557618729altust

Sıralı 10 öğeli dizide 50 aranıyor; 50 dizide yok. İlk çağrı ara(dizi, 0, 9, 50).

4091132213304385476557618729altortaust

orta = (0 + 9) / 2 = 4. dizi[4] = 30 < 50 → sağ yarı: ara(5, 9).

4091132213304385476557618729altortaust

orta = (5 + 9) / 2 = 7. dizi[7] = 55 > 50 → sol yarı: ara(5, 6).

4091132213304385476557618729altortaust

orta = (5 + 6) / 2 = 5. dizi[5] = 38 < 50 → sağ yarı: ara(6, 6).

4091132213304385476557618729altortaust

orta = (6 + 6) / 2 = 6. dizi[6] = 47 < 50 → sağ yarı: ara(7, 6).

4091132213304385476557618729altust

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.

4091132213304385476557618729altust

Ç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?

dizi3027138293104435ijtk

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.

dizi3027138293104435ijt3k

dizi[0] = 3 ≤ dizi[3] = 9 → soldan 3 alınır.

dizi3027138293104435ijt39k

dizi[1] = 27 > dizi[3] = 9 → sağdan 9 alınır.

dizi3027138293104435ijt3910k

dizi[1] = 27 > dizi[4] = 10 → sağdan 10 alınır.

dizi3027138293104435ijt391027k

dizi[1] = 27 ≤ dizi[5] = 43 → soldan 27 alınır.

dizi3027138293104435jt39102738k

dizi[2] = 38 ≤ dizi[5] = 43 → soldan 38 alınır. Sol yarı bitti (i = 3 > orta), ilk while sona erer.

dizi3027138293104435t3910273843

İkinci while hiç dönmez (i > orta). Üçüncü while sağda kalan 43'ü olduğu gibi kopyalar.

dizi3027138293104435t3910273843

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?

70219243348556

pivot = dizi[ust] = 5 (turuncu). i = alt − 1 = −1: ≤ pivot bölgesi (yeşil) henüz boş.

70219243348556j

dizi[0] = 7 > 5 → hiçbir şey yapılmaz; öğe sağ bölgede kalır.

20719243348556ij

dizi[1] = 2 ≤ 5 → i = 0, takas(0, 1) → [2, 7, 9, 4, 3, 8, 5].

20719243348556ij

dizi[2] = 9 > 5 → hiçbir şey yapılmaz; öğe sağ bölgede kalır.

20419273348556ij

dizi[3] = 4 ≤ 5 → i = 1, takas(1, 3) → [2, 4, 9, 7, 3, 8, 5].

20413273948556ij

dizi[4] = 3 ≤ 5 → i = 2, takas(2, 4) → [2, 4, 3, 7, 9, 8, 5].

20413273948556ij

dizi[5] = 8 > 5 → hiçbir şey yapılmaz; öğe sağ bölgede kalır.

20413253948576i

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?

n = 10

main, us(2, 10)'u çağırır: 2¹⁰ hesaplanacak. Her çağrı önce n/2 için kendini çağırır.

n = 10

us(2, 10): y = us(2, 5) hesaplanmalı (n / 2 = 5).

n = 10n = 5

us(2, 5): y = us(2, 2) hesaplanmalı (n / 2 = 2).

n = 10n = 5n = 2

us(2, 2): y = us(2, 1) hesaplanmalı (n / 2 = 1).

n = 10n = 5n = 2n = 1

us(2, 1): y = us(2, 0) hesaplanmalı (n / 2 = 0).

n = 10n = 5n = 2n = 1n = 0→ 1

n = 0 → taban durumu: 1 döner. Zincirde 5 çerçeve birikti: n her seferinde yarıya iner.

n = 10n = 5n = 2n = 1→ 2n = 0→ 1

us(2, 1): y = 1; 1 tek → x · y · y = 2 · 1 · 1 = 2 (2 çarpım).

n = 10n = 5n = 2→ 4n = 1→ 2n = 0→ 1

us(2, 2): y = 2; 2 çift → y · y = 4 (1 çarpım).

n = 10n = 5→ 32n = 2→ 4n = 1→ 2n = 0→ 1

us(2, 5): y = 4; 5 tek → x · y · y = 2 · 4 · 4 = 32 (2 çarpım).

n = 10→ 1024n = 5→ 32n = 2→ 4n = 1→ 2n = 0→ 1

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)

A(1,1)B(9,3)P(3,6)Q(6,0)R(5,7)S(8,5)T(5,4)
Cevabı göster

capraz = 8·(y − 1) − 2·(x − 1):

PQRST
capraz36-18401816
tarafsolsağsolsolsol
  • Ü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.

47 · 85

main, karatsuba(47, 85)'i çağırır. Kod üç özyinelemeli çağrı yapar: z0 = b·d, z1 = (a + b)(c + d), z2 = a·c.

47 · 85

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).

47 · 857 · 5= 35

z0 = karatsuba(b, d) = karatsuba(7, 5): 7 < 10 → taban, doğrudan 35.

47 · 857 · 5= 3511 · 13

z1 = karatsuba(a + b, c + d) = karatsuba(11, 13): ikisi de ≥ 10. n = 2, p = 10 → a = 1, b = 1, c = 1, d = 3.

47 · 857 · 5= 3511 · 131 · 3= 3

İç z0 = karatsuba(1, 3) = 3 (taban).

47 · 857 · 5= 3511 · 131 · 3= 32 · 4= 8

İç z1 = karatsuba(1 + 1, 1 + 3) = karatsuba(2, 4) = 8 (taban).

47 · 857 · 5= 3511 · 131 · 3= 32 · 4= 81 · 1= 1

İç z2 = karatsuba(1, 1) = 1 (taban).

47 · 857 · 5= 3511 · 13= 1431 · 3= 32 · 4= 81 · 1= 1

11 · 13 = z2·p² + (z1 − z2 − z0)·p + z0 = 1·100 + (8 − 1 − 3)·10 + 3 = 143.

47 · 857 · 5= 3511 · 13= 1431 · 3= 32 · 4= 81 · 1= 14 · 8= 32

z2 = karatsuba(a, c) = karatsuba(4, 8) = 32 (taban).

47 · 85= 39957 · 5= 3511 · 13= 1431 · 3= 32 · 4= 81 · 1= 14 · 8= 32

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.

P1?P2?P3?P4?P5?P6?P7?

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.

P14P2?P3?P4?P5?P6?P7?

P1 = A11·(B12 − B22) = 2·(4 − 2) = 4.

P14P26P3?P4?P5?P6?P7?

P2 = (A11 + A12)·B22 = (2 + 1)·2 = 6.

P14P26P33P4?P5?P6?P7?

P3 = (A21 + A22)·B11 = (0 + 3)·1 = 3.

P14P26P33P412P5?P6?P7?

P4 = A22·(B21 − B11) = 3·(5 − 1) = 12.

P14P26P33P412P515P6?P7?

P5 = (A11 + A22)·(B11 + B22) = (2 + 3)·(1 + 2) = 15.

P14P26P33P412P515P6-14P7?

P6 = (A12 − A22)·(B21 + B22) = (1 − 3)·(5 + 2) = -14.

P14P26P33P412P515P6-14P710

P7 = (A11 − A21)·(B11 + B12) = (2 − 0)·(1 + 4) = 10.

P14P26P33P412P515P6-14P710C =7101567 çarpım (klasik 8)

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(φⁿ)).

Son

Bölüm 11: Böl ve Fethet Yaklaşımı: Çalışma Soruları
Konu anlatımı: Böl ve fethet sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.