Bölüm 1.2: Algoritma Karmaşıklığı

Bölüm 1.2: Algoritma Karmaşıklığı · Çalışma Soruları
Zaman ve bellekEn iyi / en kötü / ortalamaO, Ω ve ΘDöngü analiziYineleme bağıntılarıAna teoremf1–f6Amortize analiz
Sercan KÜLCÜ · Giresun Üniversitesi · Bilgisayar Mühendisliği

Çı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 = 011
i < a.length4n + 1 = 11
a[i] == hedef4n = 10
i++3n = 10
return11
Toplam1333 = 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.

n3n²f(n)
7147150✗
8192187✓

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.

n = 100: i değerleri1248163264

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?

iç döngü turları (i²)0i=00i=10i=20i=3

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ç döngü turları (i²)0i=00i=10i=20i=3

i = 0: j < 0 hemen yanlış → iç döngü 0 kez döner; x = 0.

iç döngü turları (i²)0i=01i=10i=20i=3

i = 1: iç döngü i · i = 1 kez döner → x = 1.

iç döngü turları (i²)0i=01i=14i=20i=3

i = 2: iç döngü i · i = 4 kez döner → x = 5.

iç döngü turları (i²)0i=01i=14i=29i=3

i = 3: iç döngü i · i = 9 kez döner → x = 14.

iç döngü turları (i²)0i=01i=14i=29i=3

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?

iç döngü turları (= i)0i=10i=20i=40i=8

n = 10, sayac = 0. Dış döngü i'yi her turda ikiye katlar: 1, 2, 4, 8, …

iç döngü turları (= i)1i=10i=20i=40i=8

i = 1 < 10 → iç döngü 1 kez döner; sayac = 1.

iç döngü turları (= i)1i=12i=20i=40i=8

i = 2 < 10 → iç döngü 2 kez döner; sayac = 3.

iç döngü turları (= i)1i=12i=24i=40i=8

i = 4 < 10 → iç döngü 4 kez döner; sayac = 7.

iç döngü turları (= i)1i=12i=24i=48i=8

i = 8 < 10 → iç döngü 8 kez döner; sayac = 15.

iç döngü turları (= i)1i=12i=24i=48i=8

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, blog_b acDurumSonuç
(a)3, 3112Θ(n log n)
(b)9, 3211Θ(n²)
(c)1, 2013Θ(n)
(d)4, 2222Θ(n² log n)
(e)2, 211 (· 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)

f4(4): 4 > 1 → satır 5'te önce soldaki f4(4 / 2) = f4(2) çağrılır.

f4(2)f4(4)

f4(2): 2 > 1 → f4(1) çağrılır.

f4(2)f4(1)=1f4(4)

f4(1): taban durum, 1 döner.

f4(2)=2f4(1)=1f4(1)=1f4(4)

İkinci f4(1) de 1 döner → f4(2) = 1 + 1 = 2.

f4(4)f4(2)=2f4(1)=1f4(1)=1f4(2)

f4(4) sağdaki f4(2)'yi çağırır: aynı alt ağaç ikinci kez açılır.

f4(1)=1f4(1)=1f4(4)f4(2)=2f4(1)=1f4(1)=1f4(2)=2

İki f4(1) daha → bu f4(2) de 2 döner.

f4(1)=1f4(1)=1f4(4)=4f4(2)=2f4(1)=1f4(1)=1f4(2)=2

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?

kapasite 1e1

1. ekleme: kapasite 1, dizi boş → 1 yazma. Maliyet = yazma + kopyalanan öğe sayısı.

kapasite 2e1e2

2. ekleme: dizi doluydu → kapasite 1 → 2, 1 kopya + 1 yazma = 2.

kapasite 4e1e2e3

3. ekleme: dizi doluydu → kapasite 2 → 4, 2 kopya + 1 yazma = 3.

kapasite 4e1e2e3e4

4. ekleme: yer var → yalnızca 1 yazma.

kapasite 8e1e2e3e4e5

5. ekleme: dizi doluydu → kapasite 4 → 8, 4 kopya + 1 yazma = 5.

kapasite 8e1e2e3e4e5e6

6. ekleme: yer var → yalnızca 1 yazma.

kapasite 8e1e2e3e4e5e6e7

7. ekleme: yer var → yalnızca 1 yazma.

kapasite 8e1e2e3e4e5e6e7e8

8. ekleme: yer var → yalnızca 1 yazma.

kapasite 16e1e2e3e4e5e6e7e8e9

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.

Son

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