Bölüm 13: Özyineleme, İkili Arama ve Geri İzleme

Çağrı çerçevesi, böl-ve-yönet ve çözüm uzayı
Taban durumÇağrı yığınıİkili aramaHanoiGeri izlemeSAT
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

Taban durum ve Çağrı yığını

Bu bölümün hedefi

Özyineli çağrının sonlanacağı en küçük problemi tanımlamak.

Başlangıç sorusu

Özyineli yordam neden sonlanır?

Giriş

Öğrenme Çıktıları

Taban durumu kurmak

Özyineli çağrının sonlanacağı en küçük problemi tanımlamak.

Çerçeveyi izlemek

Parametre, yerel değişken ve dönüş adresinin yığında tutulmasını açıklamak.

Aralığı küçültmek

İkili aramada her adımda arama uzayını yarıya indirmek.

Geri izlemek

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.

Taban durum

Yeni çağrı yapmadan sonuç üretir.

İlerleme

Her çağrı girdiyi küçültür.

Çağrı çerçevesi

Her düzey kendi yerel durumunu saklar.

Geri dönüş

Alt problemin sonucu üst çağrıya aktarılır.

Temel Kavramlar

Kavram Haritası

1Taban durum
2Çağrı yığını
3İkili arama
4Hanoi
5Geri izleme
6SAT
Her çağrı daha küçük bir girdiyle ilerlemeli ve sonunda taban duruma ulaşmalıdır.

Gösterim

İkili arama aralığı yarıya indirir

04113218324433540
33 aranırken orta 18: sağ yarı; orta 33: bulundu. İki karşılaştırma.

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;
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 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);
}
Kod örnekleri C99/C11 uyumlu olacak biçimde küçük ve tek sorumluluklu tutulmuştur.

Temel İşlemler

Kodu Okurken

Ön koşul

Özyineli yordam neden sonlanır?

Değişmez

Her adımda taban durum kuralı korunuyor mu?

Son koşul

Parametre, yerel değişken ve dönüş adresinin yığında tutulmasını açıklamak.

Hata yolu

Girdiyi küçültmeden yeniden çağırmak

Adım Adım

Geri izlemenin dört hareketi

Seç

Geçerli görünen bir adayı çözüme ekle.

İlerle

Kalan problem için özyineli çağrı yap.

Sına

Kısıt bozulduysa bu dalın çözüm üretmeyeceğini gör.

Geri al

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

İşlemZamanEk bellek
İkili aramaO(log n)O(log n)
FaktöriyelO(n)O(n)
HanoiO(2ⁿ)O(n)
n değişkenli SAT, kaba kuvvetO(2ⁿ)O(n)
Çağrı sayısını izlemeprobleme 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?

Özyineleme

Problem doğal olarak alt problemlere ayrılıyorsa.

Döngü

Durum az ve açıkça taşınabiliyorsa.

Geri izleme

Kısıtlı aday uzayında çözümler aranıyorsa.

Dinamik programlama

Aynı alt problemler tekrar tekrar çözülüyorsa.

Dikkat

Sık Yapılan Hatalar

1Taban durumunu unutmak
2Girdiyi küçültmeden yeniden çağırmak
3İkili aramayı sırasız dizide kullanmak
4Geri izlerken yapılan değişikliği geri almamak

Alıştırmalar

Kendini Sına

  1. Özyineli yordam neden sonlanır?
  2. İkili aramanın ön koşulu nedir?
  3. Hanoi için T(n) bağıntısı nedir?
  4. Geri izleme ile kaba kuvvet arasındaki fark nedir?
  5. Çağrı yığınının yüksekliği neye bağlıdır?
Cevapları göster
  1. Her çağrı girdiyi küçültüp taban duruma ulaştığı için.
  2. Dizi anahtara göre sıralı olmalıdır.
  3. T(n)=2T(n-1)+1.
  4. Geri izleme geçersiz kısmi çözümleri erken budar.
  5. En derin çağrı zincirine.

Uygulama

Mini Laboratuvar

1 · Çiz

Özyineli yordam neden sonlanır?

2 · Kodla

Hanoi için T(n) bağıntısı nedir?

3 · Ölç

Çağrı yığınının yüksekliği neye bağlıdır?

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

Özet

Bölüm Özeti

Sonlanma ispatı

Taban durum ve küçülen ölçü birlikte gerekir.

Yarıya böl

İkili arama logaritmik derinlik sağlar.

Seç ve geri al

Geri izleme çözüm uzayını sistemli dolaşır.

Özet

Kaynaklar ve Devam

Son

Bölüm 13: Özyineleme, İkili Arama ve Geri İzleme
Ders planına dön
1 / 1 C ile Veri Yapıları