Bölüm 13: Özyineleme, İkili Arama ve Geri İzleme
Hazırlık
Başlamadan Önce
Dizi, gösterge, struct, fonksiyon ve dinamik bellek temellerini hatırla.
Taban durum ve Çağrı yığını
Özyineli çağrının sonlanacağı en küçük problemi tanımlamak.
Özyineli yordam neden sonlanır?
Giriş
Öğrenme Çıktıları
Özyineli çağrının sonlanacağı en küçük problemi tanımlamak.
Parametre, yerel değişken ve dönüş adresinin yığında tutulmasını açıklamak.
İkili aramada her adımda arama uzayını yarıya indirmek.
Aday seç, dene, başarısızsa geri al düzenini uygulamak.
Temel Kavramlar
Özyineleme problemi kendi küçük örneğine dönüştürür
Her çağrı daha küçük bir girdiyle ilerlemeli ve sonunda taban duruma ulaşmalıdır.
Yeni çağrı yapmadan sonuç üretir.
Her çağrı girdiyi küçültür.
Her düzey kendi yerel durumunu saklar.
Alt problemin sonucu üst çağrıya aktarılır.
Temel Kavramlar
Kavram Haritası
Gösterim
İkili arama aralığı yarıya indirir
C ile Gerçekleştirim
Aralık ile ikili arama
int ikili_ara(const int a[], int sol, int sag, int x);
typedef struct {
int satir, sutun;
} Aday;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 taban durumunu unutmak riskiyle birlikte test et.
Temel İşlemler
Özyineli ikili arama
int ikili_ara(const int a[], int sol, int sag, int x) {
if (sol > sag) return -1;
int orta = sol + (sag - sol) / 2;
if (a[orta] == x) return orta;
if (x < a[orta]) return ikili_ara(a, sol, orta - 1, x);
return ikili_ara(a, orta + 1, sag, x);
}Temel İşlemler
Kodu Okurken
Özyineli yordam neden sonlanır?
Her adımda taban durum kuralı korunuyor mu?
Parametre, yerel değişken ve dönüş adresinin yığında tutulmasını açıklamak.
Girdiyi küçültmeden yeniden çağırmak
Adım Adım
Geri izlemenin dört hareketi
Geçerli görünen bir adayı çözüme ekle.
Kalan problem için özyineli çağrı yap.
Kısıt bozulduysa bu dalın çözüm üretmeyeceğini gör.
Son seçimi kaldır ve sıradaki adayı dene.
Sınıf Notu
Dersten Sesler
“Önce kodu yazmayı öğrenin; bellek itirazını karmaşıklığı hesaplayınca yaparsınız.”
“Bir halterciyi yüz kere seyretmek yetmez. 'Bu nasıl yazıldı?' sorusuna yoğunlaşın.”
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 |
|---|---|---|
| İkili arama | O(log n) | O(log n) |
| Faktöriyel | O(n) | O(n) |
| Hanoi | O(2ⁿ) | O(n) |
| n değişkenli SAT, kaba kuvvet | O(2ⁿ) | O(n) |
| Çağrı sayısını izleme | probleme bağlı | O(derinlik) |
n: öğe sayısı · h: yükseklik · V: düğüm sayısı · E: kenar sayısı
Tasarım Kararı
Hangi Durumda Hangisi?
Problem doğal olarak alt problemlere ayrılıyorsa.
Durum az ve açıkça taşınabiliyorsa.
Kısıtlı aday uzayında çözümler aranıyorsa.
Aynı alt problemler tekrar tekrar çözülüyorsa.
Dikkat
Sık Yapılan Hatalar
Alıştırmalar
Kendini Sına
- Özyineli yordam neden sonlanır?
- İkili aramanın ön koşulu nedir?
- Hanoi için T(n) bağıntısı nedir?
- Geri izleme ile kaba kuvvet arasındaki fark nedir?
- Çağrı yığınının yüksekliği neye bağlıdır?
Cevapları göster
- Her çağrı girdiyi küçültüp taban duruma ulaştığı için.
- Dizi anahtara göre sıralı olmalıdır.
- T(n)=2T(n-1)+1.
- Geri izleme geçersiz kısmi çözümleri erken budar.
- En derin çağrı zincirine.
Uygulama
Mini Laboratuvar
Özyineli yordam neden sonlanır?
Hanoi için T(n) bağıntısı nedir?
Çağrı yığınının yüksekliği neye bağlıdır?
Özet
Bölüm Özeti
Taban durum ve küçülen ölçü birlikte gerekir.
İkili arama logaritmik derinlik sağlar.
Geri izleme çözüm uzayını sistemli dolaşır.
Özet
Kaynaklar ve Devam
- VYA1 özyineleme ve ikili arama; VYA2 satisfiability bölümleri
- Horowitz, Sahni ve Anderson-Freed, Fundamentals of Data Structures in C.
- Kernighan ve Ritchie, The C Programming Language.
Son
← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt