Bölüm 1: Giriş ve Algoritma Analizi

Veri, soyutlama, doğruluk ve maliyet
Veri yapısıADTAlgoritmaBig OÖzyinelemeDeneysel ölçüm
C ile Veri Yapıları · İki ciltlik ders notları temel alınmıştır

Hazırlık

Başlamadan Önce

C ön bilgisi

Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.

İlk kavram

Veri yapısı ve ADT

Bu bölümün hedefi

Veri tipi, veri yapısı ve soyut veri türü arasındaki farkı açıklamak.

Başlangıç sorusu

Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?

Giriş

Öğrenme Çıktıları

Kavramları ayırmak

Veri tipi, veri yapısı ve soyut veri türü arasındaki farkı açıklamak.

Algoritmayı okumak

Girdi, çıktı, sonlanma ve doğruluk koşullarını belirlemek.

Maliyeti hesaplamak

Temel işlemleri sayıp Big O sınıfını bulmak.

Uygun çözümü seçmek

Zaman, bellek ve uygulama kolaylığını birlikte değerlendirmek.

Temel Kavramlar

Veri yapısı yalnızca saklama biçimi değildir

Bir çözüm; verinin bellekteki gösterimi ile o veri üzerinde çalışan algoritmaların birlikte tasarlanmasıdır.

Veri nesnesi

Programın anlam verdiği öğe: sayı, kayıt, düğüm, kenar...

Gösterim

Dizi, bağlaç, tablo veya ağaç kullanarak bellekte kurulan düzen.

İşlemler

Ekleme, silme, arama, dolaşma, birleştirme ve sıralama.

Sözleşme

ADT, işlemin ne yaptığını söyler; gerçekleştirim nasıl yaptığını.

Temel Kavramlar

Kavram Haritası

1Veri yapısı
2ADT
3Algoritma
4Big O
5Özyineleme
6Deneysel ölçüm
Bir çözüm; verinin bellekteki gösterimi ile o veri üzerinde çalışan algoritmaların birlikte tasarlanmasıdır.

Gösterim

Bir algoritmayı dört soruyla incele

1Girdi nedir?
→
2Çıktı nedir?
→
3Neden doğru?
→
4Maliyeti nedir?
Ölçek sorusu: Girdi iki katına çıktığında çalışma miktarı nasıl değişiyor?

C ile Gerçekleştirim

C'de ölçülebilir bir problem

typedef struct {
    int *veri;
    size_t boyut;
} Dizi;

/* Sözleşme: dizi boş değilse en büyük değeri döndürür. */
int en_buyuk(const Dizi *d);
Tür tanımı veri yapısının bellekteki biçimini; yordamlar ise bu yapı üzerindeki davranışı kurar.

C ile Gerçekleştirim

C'de Bellek ve Sahiplik

Sahip kim?

Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.

Yaşam süresi

Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.

Sınırlar

Boyut, kapasite ve geçerli indisleri her işlemde koru.

Boş durum

NULL, boş yapı ve tek öğe durumlarını özellikle sabitleri big o sınıfı sanmak riskiyle birlikte test et.

Temel İşlemler

Doğrusal tarama

int en_buyuk(const Dizi *d) {
    int en = d->veri[0];
    for (size_t i = 1; i < d->boyut; ++i)
        if (d->veri[i] > en) en = d->veri[i];
    return en;
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?

Değişmez

Her adımda veri nesnesi kuralı korunuyor mu?

Son koşul

Girdi, çıktı, sonlanma ve doğruluk koşullarını belirlemek.

Hata yolu

Küçük girdideki ölçümü genellemek

Adım Adım

İşlem sayısını çıkar

Başlat

en = a[0]. Bir atama yapılır.

Tara

i = 1 ... n-1 için her öğe en ile karşılaştırılır.

Güncelle

Daha büyük öğe bulunduğunda en değiştirilir.

Sonuç

n-1 karşılaştırma vardır; baskın terim n olduğu için O(n).

Sınıf Notu

Dersten Sesler

“Kodlamayı ne kadar geciktirirsen, arka planda o kadar iyi bir metot yakalayabilirsin.”
“Bir arkadaş soruyu O(n)'de çözmüş, sonuna m kez dönen boş bir döngü koymuş. O(n+m) istendi ya! Gerek yok; daha iyisini yapabiliyorsan ne âlâ!”

Notlardaki sınıf içi anlatımdan, yazım ve uzunluk bakımından sunuma uyarlanmıştır.

Analiz

Karmaşıklık Özeti

İşlemZamanEk bellek
Diziye indisle erişimO(1)O(1)
Doğrusal aramaO(n)O(1)
İkili aramaO(log n)O(1)
Seçmeli sıralamaO(n²)O(1)
Özyineli ikili aramaO(log n)O(log n)

n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı

Tasarım Kararı

Hangi Durumda Hangisi?

Teorik analiz

Makineden bağımsız büyüme davranışını gösterir.

Deneysel ölçüm

Derleyici, önbellek ve gerçek veri etkisini gösterir.

En kötü durum

Üst sınır verir; kritik sistemlerde güvenlidir.

Ortalama durum

Gerçek kullanım dağılımı biliniyorsa daha açıklayıcıdır.

Dikkat

Sık Yapılan Hatalar

1Sabitleri Big O sınıfı sanmak
2Küçük girdideki ölçümü genellemek
3Bellek maliyetini yok saymak
4Özyineli çözümde taban durumunu unutmak

Alıştırmalar

Kendini Sına

  1. Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?
  2. O(n²) bir algoritmada n iki katına çıkarsa yaklaşık ne olur?
  3. İkili aramanın ön koşulu nedir?
  4. Özyineli yordamın çağrı yığını hangi maliyeti doğurur?
  5. Aynı ADT neden farklı veri yapılarıyla gerçekleştirilebilir?
Cevapları göster
  1. Doğru sonuç üretmek zorunludur; verimlilik aynı doğru sonucu ne kadar kaynakla ürettiğini anlatır.
  2. Baskın iş yaklaşık dört katına çıkar.
  3. Veri arama anahtarına göre sıralı olmalıdır.
  4. Derinlik kadar ek bellek kullanır.
  5. ADT işlemleri tanımlar; dizi, liste veya ağaç bu işlemler için farklı maliyetler sunar.

Uygulama

Mini Laboratuvar

1 · Çiz

Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?

2 · Kodla

İkili aramanın ön koşulu nedir?

3 · Ölç

Aynı ADT neden farklı veri yapılarıyla gerçekleştirilebilir?

Teslim: küçük bir C modülü, üç uç test ve zaman/bellek karmaşıklığı tablosu.

Özet

Bölüm Özeti

Önce sözleşme

Girdi, çıktı ve sınır durumlarını yaz.

Sonra gösterim

İşlemlere uygun veri yapısını seç.

En son ölç

Teorik analizi gerçek deneyle doğrula.

Özet

Kaynaklar ve Devam

Son

Bölüm 1: Giriş ve Algoritma Analizi
Ders planına dön
1 / 1 C ile Veri Yapıları

← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt