Bölüm 1: Giriş

Bölüm 1: Giriş · Çalışma Soruları
Algoritma kavramıAlgoritma analiziKarmaşıklık örnekleriEklemeli sıralamaBöl ve fethetEuclid algoritması
Sercan KÜLCÜ

Ç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ıforan f(4000)/f(1000)tahmini süre
Θ(n)48 ms
Θ(n²)4² = 1632 ms
Θ(n³)4³ = 64128 ms
Θ(log n)log₂ 4000 / log₂ 1000 = 11,97 / 9,972,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.

n = 4000'de süre (ms)8n32n²128n³2.4log n

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.

n3n²2n² + 50n + 400
579.7479.748✗ (1 eksik)
5810.09210.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).

3929117012345911

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

f4

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.

f4f3

fib(3) de taban durum değil → önce fib(2).

f4f3f2

fib(2) → fib(1) çağrısı. Yığın derinliği 4 (main dahil).

f4f3f2f1=1

fib(1): n ≤ 1 → taban durum, 1 döner.

f4f3f2=1f1=1f0=0

fib(2)'nin ikinci çağrısı fib(0) = 0. fib(2) = 1 + 0 = 1 döner.

f4f3=2f2=1f1=1f1=1f0=0

fib(3) ikinci çağrısını yapar: fib(1) = 1. fib(3) = 1 + 1 = 2 döner.

f4f3=2f2f2=1f1=1f1=1f0=0

fib(4), fib(2)'yi çağırır: aynı alt problem ikinci kez baştan çözülür.

f4f3=2f2=1f2=1f1=1f1=1f0=0f1=1f0=0

fib(1) = 1 ve fib(0) = 0 → bu fib(2) de 1 döner.

f4=3f3=2f2=1f2=1f1=1f1=1f0=0f1=1f0=0

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?

573428012345yerleşti

i = 1: anahtar = 7, A[0] = 5 ≤ 7 → while hiç dönmez; 7 yerinde kalır. Dizi değişmeden yazdırılır.

557428012345j+1

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.

357428012345yerleşti

A[0] = 3; A[0..2] sıralı. Satır yazdırılır.

355728012345j+1

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.

345728012345yerleşti

A[1] = 4; A[0..3] sıralı. Satır yazdırılır.

334578012345j+1

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.

234578012345yerleşti

A[0] = 2; A[0..4] sıralı. Satır yazdırılır.

234578012345yerleşti

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?

girdi2541301234
Cevabı göster
ianahtarkarşılaştırılankaydırmasonuç
15202 5 4 1 3
245, 212 4 5 1 3
315, 4, 231 2 4 5 3
435, 4, 221 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?

A461518iB291021jC01234567k

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

A461518iB291021jC201234567k

A[0] = 4 > B[0] = 2 → C[0] = 2; j ve k ilerler.

A461518iB291021jC2401234567k

A[0] = 4 ≤ B[1] = 9 → C[1] = 4; i ve k ilerler.

A461518iB291021jC24601234567k

A[1] = 6 ≤ B[1] = 9 → C[2] = 6; i ve k ilerler.

A461518iB291021jC246901234567k

A[2] = 15 > B[1] = 9 → C[3] = 9; j ve k ilerler.

A461518iB291021jC24691001234567k

A[2] = 15 > B[2] = 10 → C[4] = 10; j ve k ilerler.

A461518iB291021jC2469101501234567k

A[2] = 15 ≤ B[3] = 21 → C[5] = 15; i ve k ilerler.

A461518B291021jC246910151801234567k

A[3] = 18 ≤ B[3] = 21 → C[6] = 18; i ve k ilerler. A bitti; ilk while sona erer.

A461518B291021C24691015182101234567

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

A1357B2468C12345678

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

368111519242731400123456789altust

Dizi sıralı, n = 10; aranan 24. Arama aralığı tüm dizi: alt = 0, ust = 9.

368111519242731400123456789altustorta

orta = (0 + 9) / 2 = 4, tahmin = dizi[4] = 15.

368111519242731400123456789altust

15 < 24 → hedef sağda: alt = 5. Sol taraf elendi.

368111519242731400123456789altustorta

orta = (5 + 9) / 2 = 7, tahmin = dizi[7] = 27.

368111519242731400123456789altust

27 > 24 → hedef solda: ust = 6. Sağ taraf elendi.

368111519242731400123456789alt/ortaust

orta = (5 + 6) / 2 = 5, tahmin = dizi[5] = 19.

368111519242731400123456789alt/ust

19 < 24 → hedef sağda: alt = 6. Sol taraf elendi.

368111519242731400123456789alt/ust/orta

orta = (6 + 6) / 2 = 6, tahmin = dizi[6] = 24.

368111519242731400123456789alt/ust/orta

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?

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0

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.

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0

us(3, 5) çağrıldı. n ≠ 0 → satır 3'te us(3, 2) çağrılır (5 / 2 = 2).

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0

us(3, 2) çağrıldı. n ≠ 0 → satır 3'te us(3, 1) çağrılır (2 / 2 = 1).

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0

us(3, 1) çağrıldı. n ≠ 0 → satır 3'te us(3, 0) çağrılır (1 / 2 = 0).

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=01

us(3, 0): n == 0 → taban durum, 1 döner. Yığında 5 us çerçevesi var: derinlik ⌊log₂ 11⌋ + 2.

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=031

us(3, 1): yarim = 1; n tek → a · yarim · yarim = 3 · 1 · 1 = 3 (2 çarpma).

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0931

us(3, 2): yarim = 3; n çift → yarim · yarim = 3 · 3 = 9 (1 çarpma).

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0243931

us(3, 5): yarim = 9; n tek → a · yarim · yarim = 3 · 9 · 9 = 243 (2 çarpma).

çağrılan üsler ve dönüş değerlerin=11n=5n=2n=1n=0177147243931

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?

çağrı yığını (üst = çalışan)ebob(1001, 385)1001 = 2·385 + 231

ebob(1001, 385): b ≠ 0. 1001 = 2 · 385 + 231 → ebob(385, 231) çağrılır.

çağrı yığını (üst = çalışan)ebob(385, 231)385 = 1·231 + 154ebob(1001, 385)1001 = 2·385 + 231

385 = 1 · 231 + 154 → ebob(231, 154).

çağrı yığını (üst = çalışan)ebob(231, 154)231 = 1·154 + 77ebob(385, 231)385 = 1·231 + 154ebob(1001, 385)1001 = 2·385 + 231

231 = 1 · 154 + 77 → ebob(154, 77).

çağrı yığını (üst = çalışan)ebob(154, 77)154 = 2·77 + 0ebob(231, 154)231 = 1·154 + 77ebob(385, 231)385 = 1·231 + 154ebob(1001, 385)1001 = 2·385 + 231

154 = 2 · 77 + 0 → ebob(77, 0).

çağrı yığını (üst = çalışan)ebob(77, 0)b = 0ebob(154, 77)154 = 2·77 + 0ebob(231, 154)231 = 1·154 + 77ebob(385, 231)385 = 1·231 + 154ebob(1001, 385)1001 = 2·385 + 231

b == 0 → return 77. 77, son sıfırdan farklı kalandır.

çağrı yığını (üst = çalışan)ebob(77, 0)→ 77ebob(154, 77)→ 77ebob(231, 154)→ 77ebob(385, 231)→ 77ebob(1001, 385)→ 77

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

Son

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