Bölüm 1: Giriş
Klasik Soru · Giriş
Soru 1: Karmaşıklık Hesabı
Her döngü bloğunun (a, b, c) kaç kez s++ çalıştırdığını ve Big O karşılığını bulunuz. Kodun tamamının karmaşıklığı nedir?
int s = 0; for (int i = 0; i < n; i++) // (a) for (int j = i; j < n; j++) s++; for (int k = n; k > 1; k /= 2) // (b) s++; for (int i = 0; i < n; i++) // (c) for (int j = 1; j < n; j *= 2) s++;
Cevabı göster
- (a) n + (n−1) + … + 1 = n(n+1)/2 → O(n²)
- (b) k her adımda yarıya iner: ≈ log₂n kez → O(log n)
- (c) dış döngü n, iç döngü ≈ log₂n → O(n log n)
Toplam: O(n²) + O(log n) + O(n log n) = O(n²); en hızlı büyüyen terim belirleyicidir, sabitler ve küçük terimler atılır.
Klasik Soru · Giriş
Soru 2: Özyineleme İzleme
f(7) değeri ve yaz(13) çağrısının çıktısı nedir? f(n) için çağrı yığınında en fazla kaç çerçeve bulunur?
static int f(int n) { if (n <= 1) return 1; return n * f(n - 2); } static void yaz(int n) { if (n == 0) return; yaz(n / 2); System.out.print(n % 2); }
Cevabı göster
f(7) = 7 · f(5) = 7 · 5 · f(3) = 7 · 5 · 3 · f(1) = 105
yaz(13) → yaz(6) → yaz(3) → yaz(1) → yaz(0). Yazdırma dönüşte yapılır: 1, 1, 0, 1 → 1101 (13'ün ikili gösterimi).
f(7) için yığında f(7), f(5), f(3), f(1): 4 çerçeve. Genel olarak ≈ n/2 çerçeve → bellek O(n), zaman O(n).
Klasik Soru · Giriş
Soru 3: Değer ve Referans
Programın çıktısı nedir? Her satırda yığın (stack) ve heap belleğinde ne olduğunu açıklayınız.
int a = 5; int b = a; b++; int[] x = {1, 2, 3}; int[] y = x; y[0] = 9; String s = "ab"; String t = s; t = t + "c"; System.out.println(a + " " + x[0] + " " + s);
Cevabı göster
Çıktı: 5 9 ab
intilkel tiptir;b = adeğeri kopyalar,b++a'yı etkilemez.xveyheap'teki aynı dizi nesnesini gösterir;y[0] = 9x üzerinden de görülür.Stringdeğişmezdir (immutable):t + "c"yeni bir nesne üretir ve t'ye atanır; s hâlâ "ab" nesnesini gösterir.
Klasik Soru · Giriş
Soru 4: Doğru Veri Yapısını Seçmek
Aşağıdaki her senaryo için en uygun veri yapısını seçiniz ve gerekçesini tek cümleyle yazınız.
- Metin düzenleyicide "geri al" (undo)
- Yazıcıya gönderilen belgelerin sırası
- Öğrenci numarasıyla kayda anında erişim
- Klasör / dosya hiyerarşisi
- Şehirler arası yol haritasında en kısa yol
- Acil serviste aciliyete göre hasta çağırma
Cevabı göster
| Yapı | Gerekçe | |
|---|---|---|
| 1 | Yığın | Son yapılan işlem ilk geri alınır (LIFO). |
| 2 | Kuyruk | İlk gelen belge ilk basılır (FIFO). |
| 3 | Hash tablosu | Anahtarla ortalama O(1) arama. |
| 4 | Ağaç | Her öğenin tek ebeveyni, çok çocuğu var. |
| 5 | Ağırlıklı çizge | Şehir = düğüm, yol = kenar; Dijkstra. |
| 6 | Öncelikli kuyruk (heap) | En öncelikli hasta O(log n) ile çıkarılır. |
Çoktan Seçmeli · Giriş
Test 1
Aşağıdaki döngünün karmaşıklığı nedir?
for (int i = 1; i < n; i *= 3) sayac++;
i her adımda 3 ile çarpılır: 3k ≥ n olunca durur → k ≈ log₃n = O(log n).
f(n) = 3n² + 100·n·log n + 5000 fonksiyonunun Big O karşılığı nedir?
Büyük n için en hızlı büyüyen terim 3n²'dir; katsayı ve küçük terimler atılır.
Çoktan Seçmeli · Giriş
Test 2
Soyut veri tipi (ADT) için hangisi doğrudur?
ADT "ne" yapılacağını söyler (ör. Stack: push, pop, peek), "nasıl" yapılacağını değil. Java'da genellikle arayüz (interface) ile ifade edilir.
Kodun çıktısı nedir?
int[] a = new int[3]; int[] b = a; b = new int[]{7}; System.out.print(a[0]);
b önce a ile aynı diziyi gösterir, sonra yeni bir diziye bağlanır. a'nın dizisi değişmez: a[0] = 0.
Adım Adım Çalıştırma · Giriş
Özyinelemeli Üs Alma
us(2, 5) çağrısında çağrı yığınını izleyin. Sonuç nedir, kaç çağrı yapılır?
Önce kendiniz tahmin edin, sonra › ile ilerleyin.
main, us(2, 5) çağırır.
n ≠ 0: temel durum değil.
us(2,5) satır 3'te bekler; us(2, 2) başlar.
n / 2 = 1: us(2, 1) çağrılır.
Temel durum: 1 döner.
n tek: 2 · 1 · 1 = 2 döner.
n çift: 2 · 2 = 4 döner.
n tek: 2 · 4 · 4 = 32 döner.
Sonuç 32. n her çağrıda yarıya iner: 4 çağrı, O(log n). Basit döngü n çarpma yapardı.
static int us(int a, int n) { if (n == 0) return 1; int y = us(a, n / 2); if (n % 2 == 0) return y * y; return a * y * y; } // main: System.out.println(us(2, 5));
Ucu Açık Soru · Giriş
Hızlı Algoritma Hangisi?
- Bir arkadaşınız "O(n) bir algoritma her zaman O(n²) bir algoritmadan daha hızlı çalışır" diyor. Katılıyor musunuz? Sayısal bir örnekle tartışın.
- Algoritma analizinde neden çoğunlukla en kötü durum incelenir? Ortalama durumun daha anlamlı olduğu bir örnek veriniz.
Örnek cevap ve değerlendirme ölçütleri
1. Katılmıyoruz. Big O yalnızca büyüme hızını gösterir, sabitleri gizler. Örneğin A: 1000·n adım, B: n² adım. n = 100 için A 100 000, B 10 000 adım yapar; B daha hızlıdır. n > 1000 olunca A öne geçer. Küçük girdilerde sabitler, bellek erişimi ve önbellek belirleyici olabilir (ör. küçük dizilerde ekleme sıralaması, hızlı sıralamadan hızlıdır).
2. En kötü durum bir garanti verir: gerçek zamanlı, güvenlik açısından kritik sistemlerde (fren, uçuş yazılımı) yanıt süresi asla aşılmamalıdır. Ortalama durum ise tipik performansı yansıtır: hash tablosunda arama en kötü O(n), ortalama O(1); hızlı sıralama en kötü O(n²), ortalama O(n log n). Pratikte bu yapılar ortalama davranışları nedeniyle tercih edilir.
Değerlendirme: karşı örnek veya sayısal kıyas · sabitlerin/girdi boyutunun rolü · garanti ile tipik performans ayrımı · somut örnek.