Bölüm 1: Giriş

Bölüm 1: Giriş · Çalışma Soruları
Big OÖzyinelemeJava bellek modeliVeri yapısı seçimi
Klasik · çoktan seçmeli · adım adım çalıştırmalı · ucu açık sorular. Önce kendiniz çözün, sonra cevabı açın. · Sercan KÜLCÜ

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

  • int ilkel tiptir; b = a değeri kopyalar, b++ a'yı etkilemez.
  • x ve y heap'teki aynı dizi nesnesini gösterir; y[0] = 9 x üzerinden de görülür.
  • String değ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.

  1. Metin düzenleyicide "geri al" (undo)
  2. Yazıcıya gönderilen belgelerin sırası
  3. Öğrenci numarasıyla kayda anında erişim
  4. Klasör / dosya hiyerarşisi
  5. Şehirler arası yol haritasında en kısa yol
  6. Acil serviste aciliyete göre hasta çağırma
Cevabı göster
YapıGerekçe
1YığınSon yapılan işlem ilk geri alınır (LIFO).
2Kuyrukİlk gelen belge ilk basılır (FIFO).
3Hash tablosuAnahtarla ortalama O(1) arama.
4AğaçHer öğenin tek ebeveyni, çok çocuğu var.
5Ağı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?

  1. 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.
  2. 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.

Son

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