Bölüm 1.2: Algoritma Karmaşıklığı
Çıktı Sorusu · Karmaşıklık Kavramı
Soru 1: Adım Sayma
Her temel işlem 1 birim sayılırsa (atama, karşılaştırma, artırma, return), n = 10 öğeli a = {7, 1, 9, 4, 2, 8, 6, 3, 5, 0} dizisinde (a) hedef = 4 ve (b) dizide olmayan bir hedef için kaç işlem yapılır?
for (int i = 0; i < a.length; i++) { if (a[i] == hedef) return i; } return -1;
Cevabı göster
| İşlem | (a) hedef = 4 | (b) yok |
|---|---|---|
| i = 0 | 1 | 1 |
| i < a.length | 4 | n + 1 = 11 |
| a[i] == hedef | 4 | n = 10 |
| i++ | 3 | n = 10 |
| return | 1 | 1 |
| Toplam | 13 | 33 = 3n + 3 |
4, indis 3'te bulunur: dört tur karşılaştırma, üç artırma. Hedef k indisindeyse 3k + 4 işlem yapılır. En kötü durum 3n + 3 = Θ(n).
Çoktan Seçmeli · Karmaşıklık Kavramı
Soru 2: Ortalama Karşılaştırma
9 öğeli bir dizide doğrusal arama yapılıyor. Hedef her zaman dizidedir ve her konumda olma olasılığı eşittir. Ortalama kaç karşılaştırma (a[i] == hedef) yapılır?
B: k. konumdaki hedef k karşılaştırmayla bulunur: (1 + 2 + … + 9)/9 = 45/9 = (n + 1)/2 = 5. 4,5 = n/2 sık yapılan bir hatadır (karşılaştırmalar 0'dan değil 1'den sayılır); 9 başarısız aramanın (en kötü durum) sayısıdır. Ortalama da Θ(n)'dir.
Çoktan Seçmeli · Karmaşıklık Kavramı
Soru 3: f3'ün Belleği
f3(n) için zaman ve ek bellek (çağrı yığını dahil) karmaşıklığı hangisidir?
public long f3(int n) { if (n <= 1) { return 1; } return f3(n - 1) + f3(n - 1); }
D: 2ⁿ − 1 çağrı yapılır, ama çağrılar sırayla biter: ilk f3(n − 1) tamamen bitip çerçeveleri kalkmadan ikinci başlamaz. Yığında aynı anda en çok n çerçeve bulunur (f3(n), f3(n − 1), …, f3(1)). Zaman ve bellek farklı büyüyebilir.
Çoktan Seçmeli · Asimptotik Gösterim
Soru 4: Hangisi Yanlış?
f(n) = 3n² + 5n + 2 için aşağıdakilerden hangisi yanlıştır?
C: Θ hem alt hem üst sınır ister; f(n) ≥ c · n³ hiçbir c > 0 için büyük n'lerde sağlanmaz (f(n)/n³ → 0). n³ gevşek bir üst sınırdır (A doğru), n gevşek bir alt sınırdır (B doğru); sıkı sınır yalnızca n²'dir.
Çıktı Sorusu · Asimptotik Gösterim
Soru 5: En Küçük n₀
f(n) = 2n² + 7n + 3 için c = 3 seçiliyor. f(n) ≤ 3n² eşitsizliğinin her n ≥ n₀ için sağlandığı en küçük n₀ kaçtır? c = 4 seçilirse n₀ ne olur?
Cevabı göster
c = 3: 2n² + 7n + 3 ≤ 3n² ⇔ n² − 7n − 3 ≥ 0 ⇔ n ≥ (7 + √61)/2 = 7,41 → n₀ = 8.
| n | 3n² | f(n) | |
|---|---|---|---|
| 7 | 147 | 150 | ✗ |
| 8 | 192 | 187 | ✓ |
c = 4: 2n² − 7n − 3 ≥ 0 ⇔ n ≥ (7 + √73)/4 = 3,89 → n₀ = 4 (n = 3: 36 < 42 ✗; n = 4: 64 ≥ 63 ✓). c büyüdükçe n₀ küçülür.
Çıktı Sorusu · Döngü Analizi
Soru 6: İkiye Katlanan Sayaç
foo(8) ve foo(100) çağrıları kaç kez "Merhaba" yazdırır? Zaman karmaşıklığı nedir?
public void foo(int n) { for (int i = 1; i <= n; i = i * 2) { System.out.println("Merhaba"); } }
Cevabı göster
- n = 8: i = 1, 2, 4, 8 → 4 kez (log₂ 8 + 1).
- n = 100: i = 1, 2, 4, 8, 16, 32, 64 → 7 kez (⌊log₂ 100⌋ + 1); 128 > 100.
k turdan sonra i = 2ᵏ olur; döngü 2ᵏ ≤ n iken sürer → ⌊log₂ n⌋ + 1 tur → O(log n). Koşul i < n olsaydı n = 8 için 3 tur dönerdi.
Adım Adım Çalıştırma · Döngü Analizi
Soru 7: f2(4) İzleme
f2(4) çağrısında iç döngü her dış turda kaç kez döner, metot ne döndürür?
x = 0. Dış döngü i = 0'dan 3'e kadar dönecek; iç döngü sınırı her turda i · i'dir.
i = 0: j < 0 hemen yanlış → iç döngü 0 kez döner; x = 0.
i = 1: iç döngü i · i = 1 kez döner → x = 1.
i = 2: iç döngü i · i = 4 kez döner → x = 5.
i = 3: iç döngü i · i = 9 kez döner → x = 14.
i = 4 < 4 yanlış → döngü biter; return 14 = 0 + 1 + 4 + 9 = (n − 1)n(2n − 1)/6 = 3 · 4 · 7 / 6. Toplam ≈ n³/3 → Θ(n³).
public int f2(int n) { int x = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < i * i; j++) { x++; } } return x; }
Adım Adım Çalıştırma · Döngü Analizi
Soru 8: Geometrik Toplam
fonksiyon(10) ne yazdırır? İç döngünün toplam tur sayısı hangi sınıftadır?
n = 10, sayac = 0. Dış döngü i'yi her turda ikiye katlar: 1, 2, 4, 8, …
i = 1 < 10 → iç döngü 1 kez döner; sayac = 1.
i = 2 < 10 → iç döngü 2 kez döner; sayac = 3.
i = 4 < 10 → iç döngü 4 kez döner; sayac = 7.
i = 8 < 10 → iç döngü 8 kez döner; sayac = 15.
i = 16 < 10 yanlış → döngü biter; 15 yazılır. 1 + 2 + 4 + 8 = 2⁴ − 1 < 2n: dış döngü log n kez dönse de toplam Θ(n).
void fonksiyon(int n) { int sayac = 0; for (int i = 1; i < n; i *= 2) { for (int j = 0; j < i; j++) { sayac++; } } System.out.println(sayac); }
Çoktan Seçmeli · Döngü Analizi
Soru 9: İkiye Katlanan Dış Döngü
Aşağıdaki fonksiyonun zaman karmaşıklığı nedir?
public void foo(int n) { for (int i = 1; i < n; i = i * 2) { for (int j = 0; j < n; j++) { System.out.println(i + " " + j); } } }
D: Dış döngü i = 1, 2, 4, … ile ⌈log₂ n⌉ tur döner; iç döngünün sınırı i'ye değil n'ye bağlıdır, her turda n kez döner. n = 16 için 4 · 16 = 64 satır yazılır. İç döngü j < i olsaydı toplam 1 + 2 + 4 + … < 2n, yani Θ(n) olurdu.
Çoktan Seçmeli · Döngü Analizi
Soru 10: f6'nın Sıkı Sınırı
for (int i = 0; i < n; i = 1 << i) döngüsüyle yazılan f6 için hangisi doğrudur (taşma yok sayılırsa)?
D: i ← 2ⁱ güncellemesi i'yi kuvvet kulesi gibi büyütür: 0, 1, 2, 4, 16, 65536. Tur sayısı yinelenmiş logaritma (log* n) kadardır. A, i = 2 · i döngüsü için doğru olurdu; f6'da i'nin kendisi üs olur.
Çıktı Sorusu · Özyinelemeli Analiz
Soru 11: İki Çağrı ve Tek Çağrı
f3(5) ne döndürür ve toplam kaç çağrı yapılır (ilk çağrı dahil)? Son satır return 2 * f3(n - 1); olarak değiştirilirse dönüş değeri ve çağrı sayısı ne olur?
public long f3(int n) { if (n <= 1) { return 1; } return f3(n - 1) + f3(n - 1); }
Cevabı göster
- f3(5) = 16 (= 2ⁿ⁻¹), 31 çağrı (= 2ⁿ − 1): her çağrı iki çağrı doğurur.
- 2 * f3(n − 1) ile: değer yine 16, ama yalnızca 5 çağrı: f3(5), f3(4), …, f3(1).
Bağıntı 2T(n − 1) + c'den T(n − 1) + c'ye iner: Θ(2ⁿ) → Θ(n). Aynı alt problemin iki kez çözülmesi gereksizdir; sonucu bir kez hesaplayıp kullanmak yeter.
Çoktan Seçmeli · Özyinelemeli Analiz
Soru 12: Bağıntıyı Açma
T(n) = 2T(n − 1) + c, T(1) = c bağıntısı açma yöntemiyle çözülürse kapalı biçim hangisidir?
B: T(n) = 2T(n − 1) + c = 4T(n − 2) + 3c = 8T(n − 3) + 7c = … = 2ᵏ T(n − k) + (2ᵏ − 1)c. k = n − 1'de T(1) = c: 2ⁿ⁻¹c + (2ⁿ⁻¹ − 1)c = (2ⁿ − 1)c → Θ(2ⁿ). Çıkarmalı bağıntı olduğu için ana teorem uygulanamaz.
Klasik Soru · Özyinelemeli Analiz
Soru 13: T(n) = T(n − 1) + n
T(n) = T(n − 1) + n, T(1) = 1 bağıntısını açma yöntemiyle çözün. Neden ana teorem uygulanamaz? Bu bağıntı hangi algoritmanın en kötü durumunda ortaya çıkar?
Cevabı göster
T(n) = n + T(n − 1) = n + (n − 1) + T(n − 2) = … = n + (n − 1) + … + 2 + T(1) = n(n + 1)/2 → Θ(n²).
Ana teorem T(n) = aT(n/b) + f(n) biçimini ister; burada alt problem n/b değil n − 1'dir (çıkarmalı bağıntı).
Pivotun hep en küçük ya da en büyük öğe olduğu hızlı sıralamada her bölümleme Θ(n) sürer ve yalnızca pivotu ayırır: T(n) = T(n − 1) + Θ(n). Eklemeli sıralamanın ters sıralı girdisi de aynı toplamı verir.
Klasik Soru · Ana Teorem
Soru 14: Beş Bağıntı
Ana teoremle çözün; her biri için a, b, log_b a, f(n)'nin derecesi c ve durumu yazın: (a) T(n) = 3T(n/3) + n, (b) T(n) = 9T(n/3) + n, (c) T(n) = T(n/2) + n, (d) T(n) = 4T(n/2) + n², (e) T(n) = 2T(n/2) + n log n.
Cevabı göster
| a, b | log_b a | c | Durum | Sonuç | |
|---|---|---|---|---|---|
| (a) | 3, 3 | 1 | 1 | 2 | Θ(n log n) |
| (b) | 9, 3 | 2 | 1 | 1 | Θ(n²) |
| (c) | 1, 2 | 0 | 1 | 3 | Θ(n) |
| (d) | 4, 2 | 2 | 2 | 2 | Θ(n² log n) |
| (e) | 2, 2 | 1 | 1 (· log n) | genişleme | Θ(n log² n) |
(c) Durum 3'te düzenlilik: a · f(n/b) = n/2 ≤ ½ · n, k = ½ < 1 ✓. (d)'de her düzey n² iş yapar ve log₂ n düzey vardır. (e) temel üç duruma girmez; f(n) = Θ(n^log_b a · logᵏ n) ise T(n) = Θ(n^log_b a · logᵏ⁺¹ n).
Çoktan Seçmeli · Ana Teorem
Soru 15: Sekiz Alt Problem
T(n) = 8T(n/2) + n² bağıntısının çözümü nedir?
A: log₂ 8 = 3 > c = 2 → Durum 1 (yapraklar baskın): Θ(n^log₂ 8) = Θ(n³). Bu, matrisleri dörde bölüp 8 çarpım yapan böl ve fethet matris çarpımıdır; klasik üç döngüden daha iyi değildir. 7 çarpım yapan Strassen Θ(n^2,807) elde eder.
Çoktan Seçmeli · Ana Teorem
Soru 16: Uygulanamayan Bağıntı
Aşağıdaki bağıntılardan hangisine ana teoremin (temel biçimiyle) üç durumundan hiçbiri uygulanamaz?
C: n^log₂ 2 = n ile f(n) = n / log n karşılaştırılır: f(n) n'den küçüktür ama yalnızca log çarpanı kadar, polinom (n^ε) kadar değil; ne Durum 1 ne Durum 2'ye uyar. A: Durum 1 → Θ(n²); B: Durum 3 → Θ(n²); D: log₄ 16 = 2 = c → Durum 2 → Θ(n² log n).
Adım Adım Çalıştırma · Uygulama: f4 ve f5
Soru 17: f4(4) Özyineleme Ağacı
f4(4) çağrısında özyineleme ağacı hangi sırayla oluşur, kaç çağrı yapılır ve sonuç nedir?
f4(4): 4 > 1 → satır 5'te önce soldaki f4(4 / 2) = f4(2) çağrılır.
f4(2): 2 > 1 → f4(1) çağrılır.
f4(1): taban durum, 1 döner.
İkinci f4(1) de 1 döner → f4(2) = 1 + 1 = 2.
f4(4) sağdaki f4(2)'yi çağırır: aynı alt ağaç ikinci kez açılır.
İki f4(1) daha → bu f4(2) de 2 döner.
f4(4) = 2 + 2 = 4. Toplam 7 = 2n − 1 çağrı; düzey işleri c, 2c, 4c: yapraklar baskın → Θ(n). Yığın derinliği yalnızca log₂ n + 1 = 3.
public int f4(int n) { if (n <= 1) { return 1; } return f4(n / 2) + f4(n / 2); }
Çıktı Sorusu · Uygulama: f4 ve f5
Soru 18: f5 Değerleri
f5(4) ve f5(32) ne döndürür? (f1(n), n döndürür.) Sonucu n log₂ n + n ile karşılaştırın.
public int f5(int n) { if (n <= 1) { return 1; } return f1(n) + f5(n / 2) + f5(n / 2); }
Cevabı göster
- f5(1) = 1, f5(2) = 2 + 1 + 1 = 4
- f5(4) = 4 + 4 + 4 = 12 = 4 · 2 + 4
- f5(8) = 32, f5(16) = 80 → f5(32) = 32 + 80 + 80 = 192 = 32 · 5 + 32
n = 2ᵏ için f5(n) = n log₂ n + n: log₂ n düzeyin her biri n iş yapar, yapraklar da n. T(n) = 2T(n/2) + Θ(n) → Durum 2 → Θ(n log n).
Adım Adım Çalıştırma · Amortize Analiz
Soru 19: Dinamik Dizi: 9 Ekleme
Kapasitesi 1 olan ve dolunca iki katına büyüyen boş diziye 9 öğe ekleniyor. Her eklemenin maliyeti (yazma + kopya) ve toplam maliyet nedir?
1. ekleme: kapasite 1, dizi boş → 1 yazma. Maliyet = yazma + kopyalanan öğe sayısı.
2. ekleme: dizi doluydu → kapasite 1 → 2, 1 kopya + 1 yazma = 2.
3. ekleme: dizi doluydu → kapasite 2 → 4, 2 kopya + 1 yazma = 3.
4. ekleme: yer var → yalnızca 1 yazma.
5. ekleme: dizi doluydu → kapasite 4 → 8, 4 kopya + 1 yazma = 5.
6. ekleme: yer var → yalnızca 1 yazma.
7. ekleme: yer var → yalnızca 1 yazma.
8. ekleme: yer var → yalnızca 1 yazma.
9. ekleme: dizi doluydu → kapasite 8 → 16, 8 kopya + 1 yazma = 9. Toplam 24 < 3 · 9 = 27 → ekleme başına amortize Θ(1).
void ekle(int x) { if (boyut == veri.length) { int[] yeni = new int[2 * veri.length]; for (int i = 0; i < boyut; i++) yeni[i] = veri[i]; // kopya veri = yeni; } veri[boyut++] = x; // yazma }
Çoktan Seçmeli · Amortize Analiz
Soru 20: Amortize ve Ortalama
Amortize analiz ile ortalama durum analizi arasındaki fark hangisidir?
A: Amortize maliyet, en kötü durumdaki bir işlem dizisinin toplamı / işlem sayısıdır; girdi dağılımı varsayımı yoktur. Ortalama durum ise girdilerin bir olasılık dağılımı üzerinden beklenen süredir (D bu yüzden yanlıştır). Dinamik dizide tek ekleme Θ(n) olabilir, amortize maliyet ise Θ(1)'dir.