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

Bölüm 6: Böl ve Fethet Yaklaşımı · Çalışma Soruları
Böl · Yönet · BirleştirAna teoremBirleştirme ve hızlı sıralamaHızlı üs almaQuickhullEn yakın nokta çiftiKaratsuba ve Strassen
Sercan KÜLCÜ

Ç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, 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.

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)

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

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

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

Son

Bölüm 6: 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.