Bölüm 2: Algoritma Analizi

Bölüm 2: Algoritma Analizi · Çalışma Soruları
Deneysel analiz ve işlem saymaO, Ω, Θ ve büyüme hızlarıEn iyi ve en kötü durumDöngülerden karmaşıklığaİkili aramaAlan karmaşıklığı
Sercan KÜLCÜ

Klasik Soru · Algoritmalar ve Ölçüm

Soru 1: Katlama Deneyi

Bir algoritma için aynı bilgisayarda yapılan katlama deneyinde tablodaki süreler ölçülmüş olsun. T(n) hangi büyüme sınıfındadır ve n = 32.000 için süre yaklaşık ne olur?

n2.0004.0008.00016.000
süre (ms)3241901.530
Cevabı göster

Oranlar: 24/3 = 8, 190/24 ≈ 7,9, 1530/190 ≈ 8,1 → T(2n)/T(n) ≈ 8 = 2³ → T(n) ≈ c·n³, kübik.

Tahmin: T(32.000) ≈ 8 · 1.530 ≈ 12.240 ms ≈ 12 s.

Bu sonuç donanıma, JVM'e ve yüke bağlıdır; yalnızca denenen girdileri kapsar ve algoritmanın tamamen kodlanmasını gerektirir. Bu sınırlar yüzünden ilkel işlemleri sayarak yapılan analiz tercih edilir: donanımdan bağımsızdır, tüm girdiler için geçerlidir ve kod çalıştırılmadan yapılır.

Klasik Soru · Algoritmalar ve Ölçüm

Soru 2: İlkel İşlemleri Saymak

n öğeli dizide negatifSay en iyi ve en kötü durumda kaç ilkel işlem yapar ve hangi girdiler bu durumlara yol açar? Satır satır sayınız.

int negatifSay(int[] a) {
  int s = 0;
  for (int i = 0; i < a.length; i++)
    if (a[i] < 0)
      s++;
  return s;
}
Cevabı göster
İfadeKaç kez?
s = 0, i = 01 + 1
i < a.lengthn + 1
a[i] < 0n
s++0 … n
i++n
return1

En iyi: 3n + 4 (hiç negatif yok). En kötü: 4n + 4 (tüm öğeler negatif). İki durumda da Θ(n); sabitler donanıma bağlı olduğundan atılır.

Çoktan Seçmeli · Asimptotik Gösterim

Soru 3: Büyüme Hızları

Büyük n için fonksiyonların yavaştan hızlıya doğru büyüme sıralaması hangisidir?

n = 1.000 için: log₂n ≈ 10, n = 1.000, n log₂n ≈ 9.966, n² = 10⁶, 2ⁿ ≈ 10³⁰¹. B çekicidir çünkü n = 2, 3, 4 gibi küçük değerlerde 2ⁿ ≤ n² olabilir; ama büyük n'de 2ⁿ her polinomu geçer (n = 100'de 2ⁿ adım ~4·10¹³ yıl sürer).

Çoktan Seçmeli · Asimptotik Gösterim

Soru 4: Asimptotik Gösterim Yanılgıları

Aşağıdaki ifadelerden hangisi doğrudur?

O, Ω, Θ sınır gösterimleridir; en iyi/ortalama/en kötü durum ayrı kavramdır ve her duruma uygulanabilir (B yanlış). log₂ n = log₁₀ n / log₁₀ 2: yalnız sabit çarpan farkı → ikisi de O(log n). O(1) sabiti büyük olabilir; küçük n'de 1000 adımlık sabit iş, n adımlık işten yavaştır.

Çoktan Seçmeli · Asimptotik Gösterim

Soru 5: Amortize Analiz

Büyüyen bir dizide (ör. ArrayList) sona ekleme çoğunlukla tek adımdır; dizi dolunca tüm öğeler iki kat büyük yeni bir diziye kopyalanır (O(n)). Bu işlem için en doğru ifade hangisidir?

Kopyalamalar 1 + 2 + 4 + … < 2n öğe tutar; uzun bir dizinin toplam maliyeti işlem sayısına bölünür → ekleme başına sabit. Tek bir ekleme yine O(n) olabilir, bu yüzden C yanlıştır; amortize analiz olasılık varsaymaz (D yanlış).

Çoktan Seçmeli · Asimptotik Gösterim

Soru 6: En Kötü Durum Girdisi

Tüm öğe çiftlerini karşılaştırıp ilk eşit çifti bulduğunda true döndüren tekrarVar(a) için en kötü durumu hangi girdi oluşturur?

Tekrar yoksa erken dönüş hiç olmaz; n(n − 1)/2 çiftin hepsi karşılaştırılır → Θ(n²). A ve B ilk karşılaştırmada true döner (en iyi durum, Θ(1)). Sıralı olmak tek başına sonucu değiştirmez; D'de tekrar bulunduğu anda metot biter.

Klasik Soru · Koddan Karmaşıklığa

Soru 7: Döngülerden Karmaşıklığa

n = 16 için kod bittiğinde s kaçtır ve kodun Büyük O karmaşıklığı nedir?

int s = 0;
for (int i = 0; i < n; i++)
    for (int j = 1; j < n; j *= 2)
        s++;
for (int k = 0; k < 100; k++)
    s++;
Cevabı göster

s = 164.

  • İç döngü j = 1, 2, 4, 8 → ⌈log₂16⌉ = 4 tur; dış döngü 16 tur → iç içe olduğundan çarpılır: 16 · 4 = 64 → O(n log n).
  • İkinci döngü n'den bağımsız 100 tur → O(1).

Ardışık bloklarda maliyetler toplanır, en büyüğü kalır: O(n log n) + O(1) = O(n log n). “İç içe döngü = n²” kuralı burada geçerli değildir.

Klasik Soru · Koddan Karmaşıklığa

Soru 8: Üç Döngü Kalıbı

Her parçanın sonunda s yaklaşık kaçtır ve Büyük O karmaşıklığı nedir?

// (1)
for (int i = n; i > 0; i /= 2) s++;
// (2)
for (int i = 0; i < n; i++)
  for (int j = 0; j < i; j++) s++;
// (3)
for (int i = 0; i < n; i += 2)
  for (int j = 0; j < 10; j++) s++;
Cevabı göster

(1) i her turda yarıya iner: ⌊log₂ n⌋ + 1 tur → O(log n).

(2) İç döngü i kez döner: 0 + 1 + … + (n − 1) = n(n − 1)/2 → O(n²). İç döngünün dış değişkene bağlı olması sınıfı değiştirmez.

(3) Dış döngü n/2 tur, iç döngü sabit 10 tur: 5n → O(n). İç içe döngü her zaman n² demek değildir.

Adım Adım Çalıştırma · Koddan Karmaşıklığa

Soru 9: İkili Arama İzleme

a = {3, 7, 11, 15, 19, 24, 30, 36} dizisinde ikiliArama(a, 8) kaç tur döner, lo ve hi nasıl değişir ve ne döndürür?

Arama aralığı tüm dizi: lo = 0, hi = 7.

1. tur: mid = (0 + 7) / 2 = 3, a[3] = 15.

15 > 8 → hedef sol yarıda: hi = 2. Sağ yarı elendi.

2. tur: mid = (0 + 2) / 2 = 1, a[1] = 7.

7 < 8 → hedef sağda: lo = 2.

3. tur: mid = (2 + 2) / 2 = 2, a[2] = 11.

11 > 8 → hi = 1.

2 ≤ 1 yanlış → aralık boş, döngü biter.

return −1, 3 tur. n = 8'de en kötü ⌊log₂8⌋ + 1 = 4 tur; n = 10⁶'da 20 → O(log n).

int ikiliArama(int[] a, int hedef) {
  int lo = 0, hi = a.length - 1;
  while (lo <= hi) {
    int mid = (lo + hi) / 2;
    if (a[mid] == hedef) return mid;
    if (a[mid] < hedef) lo = mid + 1;
    else hi = mid - 1;
  }
  return -1;
}

Çoktan Seçmeli · Koddan Karmaşıklığa

Soru 10: Orta İndis Taşması

Çok büyük bir dizide ikili arama yapılırken aşağıdaki satırlar çalışıyor. Çıktı nedir?

int lo = 1_500_000_000;
int hi = 2_000_000_000;
int m1 = (lo + hi) / 2;
int m2 = lo + (hi - lo) / 2;
System.out.println(m1 + " " + m2);

lo + hi = 3,5·10⁹, int sınırını (≈ 2,1·10⁹) aşar ve sessizce negatife sarar; Java tam sayı taşmasında hata fırlatmaz (D yanlış). lo + (hi - lo) / 2 hiçbir ara adımda sınırı aşmaz, güvenlidir.

Çoktan Seçmeli · Alan ve Doğruluk

Soru 11: Ek Bellek

Aşağıdaki metotlardan hangisinin ek alan karmaşıklığı O(n)'dir? (Girdi dizisinin kendisi sayılmaz.)

C, sonucu tutmak için n hücrelik yeni bir dizi ayırır → O(n) ek bellek. A, B ve D yalnızca birkaç değişken (en büyük, iki indis, lo / hi / mid) kullanır → O(1).

Son

Bölüm 2: Algoritma Analizi: Çalışma Soruları
Konu anlatımı: Algoritma Analizi sunumu
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.