Bölüm 1: Giriş ve Algoritma Analizi
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Veri yapısı ve ADT
Veri tipi, veri yapısı ve soyut veri türü arasındaki farkı açıklamak.
Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?
Giriş
Öğrenme Çıktıları
Veri tipi, veri yapısı ve soyut veri türü arasındaki farkı açıklamak.
Girdi, çıktı, sonlanma ve doğruluk koşullarını belirlemek.
Temel işlemleri sayıp Big O sınıfını bulmak.
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.
Programın anlam verdiği öğe: sayı, kayıt, düğüm, kenar...
Dizi, bağlaç, tablo veya ağaç kullanarak bellekte kurulan düzen.
Ekleme, silme, arama, dolaşma, birleştirme ve sıralama.
ADT, işlemin ne yaptığını söyler; gerçekleştirim nasıl yaptığını.
Temel Kavramlar
Kavram Haritası
Gösterim
Bir algoritmayı dört soruyla incele
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);C ile Gerçekleştirim
C'de Bellek ve Sahiplik
Ayrılan belleği hangi yapı veya yordamın bırakacağını baştan belirle.
Yerel değişken adresini fonksiyon dışına taşırma; dinamik belleği gerektiği kadar yaşat.
Boyut, kapasite ve geçerli indisleri her işlemde koru.
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;
}Temel İşlemler
Kodu Okurken
Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?
Her adımda veri nesnesi kuralı korunuyor mu?
Girdi, çıktı, sonlanma ve doğruluk koşullarını belirlemek.
Küçük girdideki ölçümü genellemek
Adım Adım
İşlem sayısını çıkar
en = a[0]. Bir atama yapılır.
i = 1 ... n-1 için her öğe en ile karşılaştırılır.
Daha büyük öğe bulunduğunda en değiştirilir.
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
| İşlem | Zaman | Ek bellek |
|---|---|---|
| Diziye indisle erişim | O(1) | O(1) |
| Doğrusal arama | O(n) | O(1) |
| İkili arama | O(log n) | O(1) |
| Seçmeli sıralama | O(n²) | O(1) |
| Özyineli ikili arama | O(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?
Makineden bağımsız büyüme davranışını gösterir.
Derleyici, önbellek ve gerçek veri etkisini gösterir.
Üst sınır verir; kritik sistemlerde güvenlidir.
Gerçek kullanım dağılımı biliniyorsa daha açıklayıcıdır.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?
- O(n²) bir algoritmada n iki katına çıkarsa yaklaşık ne olur?
- İkili aramanın ön koşulu nedir?
- Özyineli yordamın çağrı yığını hangi maliyeti doğurur?
- Aynı ADT neden farklı veri yapılarıyla gerçekleştirilebilir?
Cevapları göster
- Doğru sonuç üretmek zorunludur; verimlilik aynı doğru sonucu ne kadar kaynakla ürettiğini anlatır.
- Baskın iş yaklaşık dört katına çıkar.
- Veri arama anahtarına göre sıralı olmalıdır.
- Derinlik kadar ek bellek kullanır.
- ADT işlemleri tanımlar; dizi, liste veya ağaç bu işlemler için farklı maliyetler sunar.
Uygulama
Mini Laboratuvar
Bir algoritmanın doğruluğu ile verimliliği neden farklı sorulardır?
İkili aramanın ön koşulu nedir?
Aynı ADT neden farklı veri yapılarıyla gerçekleştirilebilir?
Özet
Bölüm Özeti
Girdi, çıktı ve sınır durumlarını yaz.
İşlemlere uygun veri yapısını seç.
Teorik analizi gerçek deneyle doğrula.
Özet
Kaynaklar ve Devam
- Veri Yapıları ve Algoritmalar 1, PDF s. 3-15
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.