Bölüm 1: Giriş
Çoktan Seçmeli · Algoritma Kavramı
Soru 1: Belirsiz Adım
Bir bilgisayar için yazılmış çay hazırlama algoritmasında “Çayın demlenmesini bekle.” adımı algoritmanın hangi özelliğini ihlal eder?
B: Her adımın tek bir anlamı olmalıdır; bilgisayar için adım “10 dakika bekle” biçiminde yazılmalıdır. Beklemek yapılabilir bir işlemdir (etkinlik sorunu yok); sorun sürenin yoruma bırakılmasıdır.
Çoktan Seçmeli · Algoritma Kavramı
Soru 2: Durmayan Döngü
Aşağıdaki yöntem bir algoritma olarak hangi özelliği her girdi için sağlamaz?
int adim(int n) { int sayac = 0; while (n != 0) { n = n - 2; sayac++; } return sayac; }
C: n tek sayıysa n hep tek kalır ve hiçbir zaman 0 olmaz; döngü durmaz. Algoritma her girdi için sonlu sayıda adımdan sonra durmalıdır. Adımlar açık ve yapılabilir; durduğu girdilerde bir çıktı da üretir.
Çoktan Seçmeli · Algoritma Kavramı
Soru 3: Deterministik mi?
Aşağıdakilerden hangisi aynı girdiyle iki kez çalıştırıldığında farklı adımlar izleyebilir?
A: Rastgele algoritma zar atar: pivot her çalıştırmada farklı olabileceği için karşılaştırma sırası da değişir (sonuç yine sıralı dizidir). B, C ve D deterministiktir: aynı girdide her zaman aynı adımları izler.
Çıktı Sorusu · Algoritma Analizi
Soru 4: Satır Satır Sayım
Sunumdaki sayım kuralıyla (yorumlardaki sayılar; i < n karşılaştırması n + 1 kez) n = 8 için toplam kaç temel işlem yapılır? i = 0 ve her i++ de birer işlem sayılırsa sonuç ne olur? Her iki durumda T(n) hangi sınıftadır?
int toplam = 0; // 1 kez for (int i = 0; i < n; i++) // n+1 kez toplam += dizi[i]; // n kez return toplam; // 1 kez
Cevabı göster
Yorumlardaki sayım: 1 + (n + 1) + n + 1 = 2n + 3 → n = 8 için 19.
i = 0 (1 kez) ve i++ (n kez) eklenince: 3n + 4 → n = 8 için 28.
Hangi işlemlerin sayıldığı yalnızca sabitleri değiştirir; iki ifade de n ile doğrusal büyür: T(n) = Θ(n). Bu yüzden analizde saniye ya da kesin işlem sayısı yerine büyüme hızına bakılır.
Çoktan Seçmeli · Algoritma Analizi
Soru 5: Milyon Öğede Karesel Süre
Saniyede 10⁹ temel işlem yapan bir bilgisayarda, n² işlem yapan bir algoritma n = 10⁶ öğeli girdiyi yaklaşık ne kadar sürede bitirir?
A: n² = 10¹² işlem; 10¹² / 10⁹ = 1000 saniye, yani 16,7 dakika. 1 ms n işleme, 20 ms n log₂ n işleme, 32 yıl n³ = 10¹⁸ işleme karşılık gelir.
Klasik Soru · Algoritma Analizi
Soru 6: 1 Saniyede En Büyük n
Saniyede 10⁹ temel işlem yapan bir bilgisayar 1 saniyede en fazla kaç öğelik girdiyi çözebilir? f(n) = n, f(n) = n² ve f(n) = 2ⁿ için ayrı ayrı bulun.
Cevabı göster
- f(n) = n: n ≤ 10⁹ → n = 1.000.000.000
- f(n) = n²: n ≤ √10⁹ → n = 31.622 (31.622² = 999.950.884; 31.623² > 10⁹)
- f(n) = 2ⁿ: 2²⁹ = 536.870.912 ≤ 10⁹ < 2³⁰ = 1.073.741.824 → n = 29
Bilgisayar 1000 kat hızlansa n² için sınır yalnızca √1000 ≈ 31,6 katına, 2ⁿ için ise yalnızca 10 artar (2¹⁰ ≈ 1000). Daha hızlı donanım sabiti küçültür; büyüme hızını değiştiren algoritmadır.
Çıktı Sorusu · Algoritma Analizi
Soru 7: Girdi Dört Katına Çıkınca
Bir algoritma n = 1000 öğede 2 ms sürüyor. Aynı makinede n = 4000 öğede yaklaşık ne kadar sürer? Çalışma süresi (a) Θ(n), (b) Θ(n²), (c) Θ(n³), (d) Θ(log n) ise ayrı ayrı hesaplayın.
Cevabı göster
| Sınıf | oran f(4000)/f(1000) | tahmini süre |
|---|---|---|
| Θ(n) | 4 | 8 ms |
| Θ(n²) | 4² = 16 | 32 ms |
| Θ(n³) | 4³ = 64 | 128 ms |
| Θ(log n) | log₂ 4000 / log₂ 1000 = 11,97 / 9,97 | 2,4 ms |
Sabit c makineden gelir ve oranda sadeleşir: T(4000)/T(1000) = f(4000)/f(1000). Logaritmik algoritmada girdinin dört katına çıkması yalnızca 2 adım ekler.
Klasik Soru · Algoritma Analizi
Soru 8: Θ İçin Sabitleri Bulmak
T(n) = 2n² + 50n + 400 = Θ(n²) olduğunu tanımla gösterin: c₁, c₂ ve n₀ sabitlerini bulun. c₂ = 3 seçilirse en küçük n₀ kaçtır?
Cevabı göster
Alt sınır: 2n² ≤ 2n² + 50n + 400 her n ≥ 1 için doğrudur (50n + 400 > 0) → c₁ = 2.
Üst sınır: 2n² + 50n + 400 ≤ 3n² ⇔ n² − 50n − 400 ≥ 0 ⇔ n ≥ (50 + √4100)/2 = 57,02.
| n | 3n² | 2n² + 50n + 400 | |
|---|---|---|---|
| 57 | 9.747 | 9.748 | ✗ (1 eksik) |
| 58 | 10.092 | 10.028 | ✓ |
Sonuç: c₁ = 2, c₂ = 3, n₀ = 58 ile 2n² ≤ T(n) ≤ 3n² → T(n) = Θ(n²). Sabitler tek değildir: c₂ = 452 seçilirse n₀ = 1 de olur (50n + 400 ≤ 450n²).
Çoktan Seçmeli · Algoritma Analizi
Soru 9: Baskın Terim
T(n) = 5n² + 100n log₂ n + 7 için aşağıdakilerden hangisi doğrudur?
A: n = 100'de 5n² = 50.000, 100n log₂ n = 66.439. Ama asimptotik sınıfı büyük n'deki baskın terim belirler: n = 1000'de 5.000.000'a karşı 996.578. Katsayılar sınıfı değiştirmez; n² terimi bir noktadan sonra (n ≈ 143) hep öndedir.
Çıktı Sorusu · Karmaşıklık Örnekleri
Soru 10: En Büyük Öğe
enBuyukBul(new int[]{3, 9, 2, 9, 11, 7}) çağrısında eleman > enBuyuk karşılaştırması kaç kez yapılır, enBuyuk kaç kez güncellenir ve metot ne döndürür?
Integer enBuyukBul(int[] dizi) { if (dizi.length == 0) return null; int enBuyuk = dizi[0]; for (int eleman : dizi) if (eleman > enBuyuk) enBuyuk = eleman; return enBuyuk; }
Cevabı göster
Dönüş: 11 · karşılaştırma: 6 · güncelleme: 2
- for-each tüm öğeleri,
dizi[0]'ın kendisini de gezer: n = 6 karşılaştırma. - enBuyuk: 3 → 9 → 11. İkinci 9, 9'dan büyük olmadığı için güncelleme yapmaz.
Karşılaştırma sayısı her girdide n'dir → Θ(n); ek bellek O(1).
Çoktan Seçmeli · Karmaşıklık Örnekleri
Soru 11: Sıralı mı Kontrolü
Aşağıdaki fonksiyon en kötü durumda hangi girdide çalışır ve kaç karşılaştırma yapar (n = dizi.length)?
int ara(int[] dizi, int hedef) { for (int i = 0; i < dizi.length - 1; i++) { if (dizi[i] > dizi[i + 1]) { return 0; } } return -1; }
B: Fonksiyon ilk düzensizlikte 0 ile döner. Hiç düzensizlik yoksa (dizi artan sıralı) döngü n − 1 kez çalışır ve −1 döner: en kötü durum O(n). Ters sıralı dizide ilk karşılaştırmada çıkılır: en iyi durum O(1). hedef parametresi hiç kullanılmaz.
Çıktı Sorusu · Karmaşıklık Örnekleri
Soru 12: Asallık Testi
asalMi(121) ve asalMi(101) çağrılarında for döngüsü içinde kaç bölme (n % i) yapılır, sonuçlar nedir?
boolean asalMi(int n) { if (n <= 1) return false; else if (n == 2) return true; else if (n % 2 == 0) return false; int kokN = (int) Math.sqrt(n) + 1; for (int i = 3; i < kokN; i += 2) if (n % i == 0) return false; return true; }
Cevabı göster
- 121: √121 = 11 → kokN = 12 → i = 3, 5, 7, 9, 11. 121 % 11 = 0 → false, 5 bölme (121 = 11 · 11).
- 101: (int) √101 = 10 → kokN = 11 → i = 3, 5, 7, 9; hiçbiri bölmez → true, 4 bölme.
Çift sayılar döngüden önce elenir; yalnızca tek i denenir: en fazla ≈ √n / 2 bölme → O(√n). + 1 olmasaydı 121 için i = 11 denenmez ve 121 yanlışlıkla asal bulunurdu.
Çoktan Seçmeli · Karmaşıklık Örnekleri
Soru 13: Sıralı Diziye Kabarcık
Sunumdaki kabarcikSirala (bayraksız) metoduna 200 öğeli, zaten artan sıralı bir dizi verilirse dizi[j] > dizi[j + 1] karşılaştırması kaç kez yapılır?
B: Bayrak olmadığı için girdi sıralı olsa da iç döngü kısalmaz: (n − 1) + (n − 2) + … + 1 + 0 = n(n − 1)/2 = 200 · 199 / 2 = 19.900. 199, bayraklı (erken çıkışlı) sürümün en iyi durumudur; 20.100 = n(n + 1)/2, 40.000 = n².
Çıktı Sorusu · Karmaşıklık Örnekleri
Soru 14: Matris Çarpımı
matrisCarp metodu A = [[2, 0], [1, 3]] ve B = [[4, 1], [2, 5]] ile çağrılıyor. Sonuç matrisi nedir, en içteki çarpma kaç kez yapılır? n × n matrislerde n = 10 için kaç çarpma yapılır?
int[][] matrisCarp(int[][] A, int[][] B) { int n = A.length, m = B[0].length; int p = B.length; int[][] sonuc = new int[n][m]; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { int eleman = 0; for (int k = 0; k < p; k++) eleman += A[i][k] * B[k][j]; sonuc[i][j] = eleman; } return sonuc; }
Cevabı göster
Sonuç: [[8, 2], [10, 16]]
- c₀₀ = 2·4 + 0·2 = 8 · c₀₁ = 2·1 + 0·5 = 2
- c₁₀ = 1·4 + 3·2 = 10 · c₁₁ = 1·1 + 3·5 = 16
Her cᵢⱼ için n çarpma, n² öğe → n³ çarpma: n = 2 için 8, n = 10 için 1000 çarpma. T(n) = Θ(n³).
Çıktı Sorusu · Karmaşıklık Örnekleri
Soru 15: Permütasyon Sırası
permutasyon(new int[]{1, 2, 3}, 0) çağrısı kaç satır yazdırır? Yazdırılan 4. ve 5. satırlar nedir? (takas iki hücrenin değerini değiştirir.)
void permutasyon(int[] dizi, int k) { if (k == dizi.length) { System.out.println(Arrays.toString(dizi)); return; } for (int i = k; i < dizi.length; i++) { takas(dizi, k, i); permutasyon(dizi, k + 1); takas(dizi, k, i); } }
Cevabı göster
3! = 6 satır; sırasıyla:
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] // 4. satır [3, 2, 1] // 5. satır [3, 1, 2]
k = 0'da sırayla 1, 2, 3 başa alınır; her biri için kalan iki öğe iki sırada dizilir. 3 başa alınırken takas(0, 2) [3, 2, 1] verir, bu yüzden 5. satır [3, 1, 2] değil [3, 2, 1]'dir. Her satırı yazmak n adım: toplam Θ(n · n!).
Adım Adım Çalıştırma · Karmaşıklık Örnekleri
Soru 16: fib(4) Çağrı Ağacı
Saf özyinelemeli fib(4) çağrıldığında çağrılar hangi sırayla açılır, kaç çağrı yapılır ve sonuç ne olur?
fib(4) çağrıldı: 4 ≤ 1 değil. Satır 3'te önce fib(3) çağrılır; fib(4) toplama için yığında bekler.
fib(3) de taban durum değil → önce fib(2).
fib(2) → fib(1) çağrısı. Yığın derinliği 4 (main dahil).
fib(1): n ≤ 1 → taban durum, 1 döner.
fib(2)'nin ikinci çağrısı fib(0) = 0. fib(2) = 1 + 0 = 1 döner.
fib(3) ikinci çağrısını yapar: fib(1) = 1. fib(3) = 1 + 1 = 2 döner.
fib(4), fib(2)'yi çağırır: aynı alt problem ikinci kez baştan çözülür.
fib(1) = 1 ve fib(0) = 0 → bu fib(2) de 1 döner.
fib(4) = fib(3) + fib(2) = 2 + 1 = 3. Toplam 9 çağrı; fib(2) iki kez, fib(1) üç kez hesaplandı.
long fib(int n) { if (n <= 1) return n; return fib(n - 1) + fib(n - 2); }
Çıktı Sorusu · Karmaşıklık Örnekleri
Soru 17: Çağrı Sayıları
fib(6) ve fibBellek(6) ayrı ayrı çağrılırsa (bellek dizisi başta sıfır) her biri toplam kaç kez çağrılır (ilk çağrı dahil) ve ne döndürür?
long fib(int n) { if (n <= 1) return n; return fib(n - 1) + fib(n - 2); } long fibBellek(int n) { if (n <= 1) return n; if (bellek[n] == 0) bellek[n] = fibBellek(n - 1) + fibBellek(n - 2); return bellek[n]; }
Cevabı göster
İkisi de 8 döndürür.
- fib(6): 25 çağrı. Ç(n) = 1 + Ç(n − 1) + Ç(n − 2), Ç(0) = Ç(1) = 1: 1, 1, 3, 5, 9, 15, 25. Çağrı sayısı Fibonacci gibi büyür → O(2ⁿ).
- fibBellek(6): 11 çağrı = 2n − 1. Her F(k) bir kez hesaplanır; ikinci çağrı (n − 2) bellekten hazır döner → O(n).
Çoktan Seçmeli · Karmaşıklık Örnekleri
Soru 18: Büyüme Sırası
Büyüme hızına göre küçükten büyüğe doğru sıralama hangisidir?
D: 1 < log n < √n < n < n log n < n² < n³ < 2ⁿ < n!. n = 10⁶'da log₂ n ≈ 20, √n = 1000. n! en hızlı büyür: n = 10'da bile 3.628.800, 2¹⁰ ise 1024'tür.
Adım Adım Çalıştırma · Eklemeli Sıralama
Soru 19: Her Turdan Sonra Yazdırma
Her dış turdan sonra yazdıran eklemeli sıralama A = {5, 7, 3, 4, 2, 8} için ne yazdırır?
i = 1: anahtar = 7, A[0] = 5 ≤ 7 → while hiç dönmez; 7 yerinde kalır. Dizi değişmeden yazdırılır.
anahtar = 3. Kendinden büyük 2 öğe birer sağa kaydırıldı; j = -1 olunca koşul yanlış. Boşalan hücre j + 1 = 0.
A[0] = 3; A[0..2] sıralı. Satır yazdırılır.
anahtar = 4. Kendinden büyük 2 öğe birer sağa kaydırıldı; j = 0 olunca koşul yanlış. Boşalan hücre j + 1 = 1.
A[1] = 4; A[0..3] sıralı. Satır yazdırılır.
anahtar = 2. Kendinden büyük 4 öğe birer sağa kaydırıldı; j = -1 olunca koşul yanlış. Boşalan hücre j + 1 = 0.
A[0] = 2; A[0..4] sıralı. Satır yazdırılır.
i = 5: anahtar = 8, solundaki 7 ≤ 8 → kaydırma yok, 8 yerinde kalır. Dizi değişmeden yazdırılır. Döngü biter: 5 satır yazıldı, son satır sıralı dizidir.
for (int i = 1; i < A.length; ++i) { int anahtar = A[i]; int j = i - 1; while (j >= 0 && A[j] > anahtar) { A[j + 1] = A[j]; j = j - 1; } A[j + 1] = anahtar; System.out.println(Arrays.toString(A)); }
Çıktı Sorusu · Eklemeli Sıralama
Soru 20: Karşılaştırma ve Kaydırma
Eklemeli sıralama (Sirala) [2, 5, 4, 1, 3] dizisini sıralarken A[j] > anahtar karşılaştırması kaç kez yapılır, kaç kaydırma yapılır? Kaydırma sayısı dizinin hangi özelliğine eşittir?
Cevabı göster
| i | anahtar | karşılaştırılan | kaydırma | sonuç |
|---|---|---|---|---|
| 1 | 5 | 2 | 0 | 2 5 4 1 3 |
| 2 | 4 | 5, 2 | 1 | 2 4 5 1 3 |
| 3 | 1 | 5, 4, 2 | 3 | 1 2 4 5 3 |
| 4 | 3 | 5, 4, 2 | 2 | 1 2 3 4 5 |
Toplam 9 karşılaştırma, 6 kaydırma. i = 3'te j = −1 olunca j >= 0 yanlış olur ve A[j] karşılaştırılmaz.
Kaydırma sayısı = ters çift sayısı: (2,1), (5,4), (5,1), (5,3), (4,1), (4,3). Sıralı girdide 0, ters sıralıda n(n − 1)/2.
Çoktan Seçmeli · Eklemeli Sıralama
Soru 21: Azalan Sıralama
Sunumdaki Sirala metodunun diziyi büyükten küçüğe sıralaması için yapılması gereken tek değişiklik hangisidir?
C: Anahtardan küçük öğeler sağa kaydırılırsa büyükler solda toplanır. Algoritmanın geri kalanı (sıralı kısım solda, anahtar kendi yerine) aynen kalır. B anahtarı yanlış hücreye yazar; D sıralı kısmın dışına taşar.
Çoktan Seçmeli · Eklemeli Sıralama
Soru 22: Durum ve Sınır
Eklemeli sıralamanın çalışma süresi için hangisi doğrudur?
D: Sıralı girdide her anahtar için tek karşılaştırma yapılır: n − 1 → Θ(n); ters sıralıda n(n − 1)/2 → Θ(n²). Alt ve üst sınır farklı fonksiyonlar olduğundan tüm girdiler için tek bir Θ yazılamaz; C'deki çıkarım yanlıştır. Kaydırma olmasa da n − 1 karşılaştırma yapıldığı için B yanlıştır.
Adım Adım Çalıştırma · Böl ve Fethet
Soru 23: İki Sıralı Diziyi Birleştirme
Birleştirme adımı A = [4, 6, 15, 18] ve B = [2, 9, 10, 21] dizilerine uygulanıyor. C hangi sırayla dolar, kaç karşılaştırma yapılır?
İki sıralı dizi: A = [4, 6, 15, 18], B = [2, 9, 10, 21]. Yalnızca iki dizinin önündeki (sarı) öğeler karşılaştırılır; C boş.
A[0] = 4 > B[0] = 2 → C[0] = 2; j ve k ilerler.
A[0] = 4 ≤ B[1] = 9 → C[1] = 4; i ve k ilerler.
A[1] = 6 ≤ B[1] = 9 → C[2] = 6; i ve k ilerler.
A[2] = 15 > B[1] = 9 → C[3] = 9; j ve k ilerler.
A[2] = 15 > B[2] = 10 → C[4] = 10; j ve k ilerler.
A[2] = 15 ≤ B[3] = 21 → C[5] = 15; i ve k ilerler.
A[3] = 18 ≤ B[3] = 21 → C[6] = 18; i ve k ilerler. A bitti; ilk while sona erer.
B'de kalan 21 karşılaştırmasız kopyalanır. Sonuç [2, 4, 6, 9, 10, 15, 18, 21]: 8 yazma, 7 karşılaştırma → Θ(n).
int i = 0, j = 0, k = 0; while (i < A.length && j < B.length) { if (A[i] <= B[j]) C[k++] = A[i++]; else C[k++] = B[j++]; } while (i < A.length) C[k++] = A[i++]; while (j < B.length) C[k++] = B[j++];
Klasik Soru · Böl ve Fethet
Soru 24: Birleştirmede En Az ve En Çok
4'er öğeli iki sıralı dizi birleştirilirken (yukarıdaki kodla) en az ve en çok kaç karşılaştırma yapılır? Her biri için örnek girdi verin. m ve n öğeli diziler için genel sonuç nedir?
Cevabı göster
- En az 4: A = [1, 2, 3, 4], B = [5, 6, 7, 8]. A'nın her öğesi B[0] ile bir kez karşılaştırılır; A biter, B karşılaştırmasız kopyalanır.
- En çok 7: A = [1, 3, 5, 7], B = [2, 4, 6, 8]. Öğeler sırayla iki diziden gelir; son öğeye (8) kadar her yazma bir karşılaştırma ister.
Genel olarak min(m, n) ile m + n − 1 arasındadır. Her durumda m + n yazma yapılır → birleştirme Θ(m + n).
Çıktı Sorusu · Böl ve Fethet
Soru 25: Ortadaki Tahminler
ikiliArama metodunda her turda tahmin değerinin yazdırıldığını düşünün. D = [2, 4, 7, 10, 13, 18, 21, 25, 30] dizisinde önce 21, sonra 5 aranırsa ekrana hangi değerler yazılır ve metot ne döndürür?
int alt = 0, ust = dizi.length - 1; while (alt <= ust) { int orta = (alt + ust) / 2; int tahmin = dizi[orta]; System.out.print(tahmin + " "); if (tahmin == aranan) return orta; else if (tahmin < aranan) alt = orta + 1; else ust = orta - 1; } return -1;
Cevabı göster
21: çıktı 13 21, dönüş 6.
- alt = 0, ust = 8 → orta = 4 (13 < 21) → alt = 5
- orta = (5 + 8)/2 = 6 → 21 bulundu.
5: çıktı 13 4 7, dönüş −1.
- orta = 4 (13 > 5) → ust = 3; orta = 1 (4 < 5) → alt = 2
- orta = 2 (7 > 5) → ust = 1; alt > ust → bulunamadı.
Adım Adım Çalıştırma · Böl ve Fethet
Soru 26: İkili Arama İzleme
ikiliArama(dizi, 24) çağrısında alt, ust ve orta nasıl değişir, metot ne döndürür?
Dizi sıralı, n = 10; aranan 24. Arama aralığı tüm dizi: alt = 0, ust = 9.
orta = (0 + 9) / 2 = 4, tahmin = dizi[4] = 15.
15 < 24 → hedef sağda: alt = 5. Sol taraf elendi.
orta = (5 + 9) / 2 = 7, tahmin = dizi[7] = 27.
27 > 24 → hedef solda: ust = 6. Sağ taraf elendi.
orta = (5 + 6) / 2 = 5, tahmin = dizi[5] = 19.
19 < 24 → hedef sağda: alt = 6. Sol taraf elendi.
orta = (6 + 6) / 2 = 6, tahmin = dizi[6] = 24.
tahmin == aranan → return 6. 10 öğede 4 karşılaştırma turu (en fazla ⌊log₂ 10⌋ + 1 = 4).
int ikiliArama(int[] dizi, int aranan) { int alt = 0, ust = dizi.length - 1; while (alt <= ust) { int orta = (alt + ust) / 2; int tahmin = dizi[orta]; if (tahmin == aranan) return orta; else if (tahmin < aranan) alt = orta + 1; else ust = orta - 1; } return -1; }
Çoktan Seçmeli · Böl ve Fethet
Soru 27: Hangi Bağıntı?
Algoritma ile özyineleme bağıntısı eşleştirmelerinden hangisi doğrudur?
C: us tek bir özyinelemeli çağrı yapar (yarim 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.
Adım Adım Çalıştırma · Böl ve Fethet
Soru 28: Hızlı Üs Alma: us(3, 11)
us(3, 11) çağrısı hangi üsler için özyinelemeli çağrı yapar, toplam kaç çarpma yapılır ve sonuç nedir?
us(3, 11) çağrıldı: n ≠ 0 → satır 3'te önce us(3, 5) çağrılır; çağıran yarim değerini bekler.
us(3, 5) çağrıldı. n ≠ 0 → satır 3'te us(3, 2) çağrılır (5 / 2 = 2).
us(3, 2) çağrıldı. n ≠ 0 → satır 3'te us(3, 1) çağrılır (2 / 2 = 1).
us(3, 1) çağrıldı. n ≠ 0 → satır 3'te us(3, 0) çağrılır (1 / 2 = 0).
us(3, 0): n == 0 → taban durum, 1 döner. Yığında 5 us çerçevesi var: derinlik ⌊log₂ 11⌋ + 2.
us(3, 1): yarim = 1; n tek → a · yarim · yarim = 3 · 1 · 1 = 3 (2 çarpma).
us(3, 2): yarim = 3; n çift → yarim · yarim = 3 · 3 = 9 (1 çarpma).
us(3, 5): yarim = 9; n tek → a · yarim · yarim = 3 · 9 · 9 = 243 (2 çarpma).
us(3, 11): yarim = 243; n tek → a · yarim · yarim = 3 · 243 · 243 = 177147 (2 çarpma). Toplam 7 çarpma; doğal yöntem 10 çarpma yapardı.
long us(long a, int n) { if (n == 0) return 1; long yarim = us(a, n / 2); if (n % 2 == 0) return yarim * yarim; else return a * yarim * yarim; }
Çoktan Seçmeli · Böl ve Fethet
Soru 29: Yarımı İki Kez Hesaplamak
us metodunda yarim değişkeni kullanılmayıp çift n için return us(a, n / 2) * us(a, 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ı.
Adım Adım Çalıştırma · Euclid Algoritması
Soru 30: ebob(1001, 385)
ebob(1001, 385) çağrısında hangi çağrılar yapılır, kaç bölme (mod) işlemi gerekir ve sonuç nedir?
ebob(1001, 385): b ≠ 0. 1001 = 2 · 385 + 231 → ebob(385, 231) çağrılır.
385 = 1 · 231 + 154 → ebob(231, 154).
231 = 1 · 154 + 77 → ebob(154, 77).
154 = 2 · 77 + 0 → ebob(77, 0).
b == 0 → return 77. 77, son sıfırdan farklı kalandır.
77 hiç değişmeden tüm çerçevelerden geri döner (kuyruk özyineleme). 4 bölme yetti: 1001 = 7 · 11 · 13, 385 = 5 · 7 · 11 → EBOB = 77.
int ebob(int a, int b) { if (b == 0) return a; return ebob(b, a % b); }
Çoktan Seçmeli · Euclid Algoritması
Soru 31: Ardışık Fibonacci Sayıları
ebob(89, 55) çağrısı sonuca ulaşana kadar kaç mod (%) işlemi yapar?
A: 89, 55, 34, 21, 13, 8, 5, 3, 2, 1 kalanları sırayla oluşur; (89, 55)'ten (2, 1)'e kadar 9 çağrının her biri bir mod işlemi yapar, ebob(1, 0) taban durumdur. Ardışık Fibonacci sayılarında her bölüm 1 çıkar ve sayılar en yavaş küçülür: en kötü durum (Lamé). ebob(55, 34) ise 8 mod işlemi yapar.
Çoktan Seçmeli · Euclid Algoritması
Soru 32: Döngüyle Euclid
Euclid algoritmasının döngülü sürümünde boşluğa hangisi yazılmalıdır?
int ebob(int a, int b) { while (b != 0) { ________ } return a; }
D: (a, b) çifti (b, a mod b) olur; kalan önce saklanmalıdır. B'de a = b yapıldıktan sonra a % b her zaman 0'dır: ebob(1001, 385) 385 döner. A ve C de (1001, 385) için yanlış sonuç verir (0 ve 385).