Bölüm 13: Geri İzleme Algoritmaları

Bölüm 13: Geri İzleme Algoritmaları · Çalışma Soruları
Seç · keşfet · geri alDurum uzayı ve budamaAlt küme ve permütasyonN vezirEn az çakışmaSudokuÇizge boyama ve Hamilton yoluKelime arama
Sercan KÜLCÜ

Çoktan Seçmeli · Temel Fikir

Soru 1: Kaba Kuvvetten Farkı

Geri izlemeyi (backtracking) kaba kuvvetten ayıran temel özellik hangisidir?

A: Çözüm adım adım kısmi çözüm olarak kurulur; bir adım kısıtı bozunca o dal terk edilir ve altındaki alt ağaç hiç üretilmez. B kaba kuvvettir (8 vezirde 8⁸ ≈ 16,7 milyon tam yerleşim), C açgözlü yaklaşım, D dinamik programlamadır.

Çoktan Seçmeli · Temel Fikir

Soru 2: Geri Almayı Unutmak

Genel şablondaki cikar(kismi, a) (geri al) satırı silinirse ne olur?

B: Kısmi çözüm (tahta, yol, ziyaret dizisi) paylaşılan bir yapıdır; çağrıdan dönünce eski hâline getirilmezse sıradaki aday, önceki denemenin kalıntılarıyla birlikte sınanır. N vezirde t[s][k] = 0, kelime aramada ziyaret = false yapılmazsa geçerli dallar yanlışlıkla budanır ya da geçersiz "çözümler" üretilir. Yalnızca parametre olarak geçirilen ilkel değerler (ör. toplam) otomatik geri yüklenir.

Çoktan Seçmeli · Temel Fikir

Soru 3: Budama Nerede?

Şablonda budama (pruning) nerede gerçekleşir ve neyi kazandırır?

C: gecerliMi false dönerse o aday için özyinelemeli çağrı yapılmaz; böylece adayın altındaki tüm alt ağaç atlanır. Budama en kötü durumu çoğu zaman değiştirmez ama pratikte ağacın çok küçük bir kısmı gezilir (8 vezirde tüm çözümler için 2056 yerleştirme).

Çıktı Sorusu · Alt Küme ve Permütasyon

Soru 4: Permütasyon Üretimi

Aşağıdaki kod uret(new ArrayList<>(), 3) ile çağrılıyor (kul 4 hücreli boolean dizi). Ne yazar? Durum uzayı ağacında kök dahil kaç düğüm vardır?

static boolean[] kul = new boolean[4];
static void uret(List<Integer> yol, int n) {
  if (yol.size() == n) {
    for (int x : yol) System.out.print(x);
    System.out.print(" ");
    return;
  }
  for (int v = 1; v <= n; v++) {
    if (!kul[v]) {
      kul[v] = true; yol.add(v);        // seç
      uret(yol, n);                     // keşfet
      yol.remove(yol.size() - 1); // geri al
      kul[v] = false;
    }
  }
}
Cevabı göster

Çıktı: 123 132 213 231 312 321

  • Adaylar 1, 2, 3 sırasıyla denendiği için permütasyonlar sözlüksel sırada çıkar.
  • Ağaç: kök 1 + 1. düzey 3 + 2. düzey 3·2 = 6 + 3. düzey 6 = 16 düğüm (uret çağrısı); 6 yaprak = 3!.
  • kul[v] = false ve remove ile geri alma yapılmasaydı yalnızca 123 yazılırdı. n öğe için O(n · n!).

Adım Adım Çalıştırma · Alt Küme ve Permütasyon

Soru 5: Alt Küme Toplamı İzleme

a = {3, 5, 6, 7} ve HEDEF = 15 için ara(0, 0) durum uzayı ağacını nasıl gezer? Bulunan ilk alt küme hangisidir?

0

a = {3, 5, 6, 7}, HEDEF = 15. Her düzeyde bir öğe için iki dal: önce "al" (+a[i]), sonra "alma" (−). Kökte toplam 0.

+303

ara(1, 3): a[0] = 3 alındı → toplam 3. Önce a[1] = 5 alınmayı deneyecek.

+3+5038

ara(2, 8): a[1] = 5 alındı → toplam 8. Önce a[2] = 6 alınmayı deneyecek.

+3+5+603814

ara(3, 14): a[2] = 6 alındı → toplam 14. Önce a[3] = 7 alınmayı deneyecek.

+3+5+6+70381421

ara(4, 21): 21 > 15 → budandı, false. Bu düğümün altı hiç üretilmez.

+3+5+6+7−038142114

ara(4, 14): öğe kalmadı (i == n) ve toplam 15 değil → false; geri dön.

+3+5+6+7−−0381421148

ara(3, 8): a[2] = 6 alınmadı → toplam 8. Önce a[3] = 7 alınmayı deneyecek.

+3+5+6+7−−+7038142114815

ara(4, 15): toplam == HEDEF → true; true tüm çağrılar boyunca yukarı taşınır. Çözüm {3, 5, 7}.

boolean ara(int i, int toplam) {
  if (toplam == HEDEF) return true;
  if (i == n || toplam > HEDEF) return false;
  secildi[i] = true;              // al
  if (ara(i + 1, toplam + a[i])) return true;
  secildi[i] = false;             // alma
  return ara(i + 1, toplam);
}

Klasik Soru · Alt Küme ve Permütasyon

Soru 6: Kalan Toplam Budaması

Alt küme toplamı aramasına "kalan öğeler hedefe yetmiyorsa kes" budamasını ekleyin. a = {3, 5, 6, 7}, HEDEF = 25 için bu budama işi nasıl kısaltır?

Cevabı göster

kalan[i] = a[i] + a[i+1] + … + a[n−1] (sonek toplamı) önceden hesaplanır ve şablona tek satır eklenir:

if (toplam + kalan[i] < HEDEF)
  return false;   // yetmez, kes
  • a = {3, 5, 6, 7} için kalan = [21, 18, 13, 7]. HEDEF = 25 iken kökte 0 + 21 < 25 → arama tek çağrıda "çözüm yok" der; budamasız sürüm tüm 2⁴ yaprağı gezerdi.
  • Budama geçerlidir: kalan öğelerin hepsi alınsa bile hedefe ulaşılamıyorsa o dalda çözüm yoktur.
  • Aynı fikir dal sınır yönteminin temelidir: bir dalın en iyi olasılığı yetersizse dala hiç girilmez (Bölüm 14).

Çoktan Seçmeli · Alt Küme ve Permütasyon

Soru 7: Permütasyon Ağacı

{1, 2, 3, 4} kümesinin tüm permütasyonlarını geri dönüşle üreten aramanın durum uzayı ağacında kök dahil kaç düğüm vardır?

C: Düzeyler: kök 1, sonra 4, 4·3 = 12, 4·3·2 = 24, 24 → 1 + 4 + 12 + 24 + 24 = 65. 24 yalnızca yaprak (4!) sayısıdır; 256 = 4⁴, aynı öğenin tekrar seçilmesine izin veren (budamasız) ağacın yaprak sayısıdır.

Adım Adım Çalıştırma · N Vezir

Soru 8: 5 Vezir İzleme

n = 5 için coz(t, 0) ilk çözümü nasıl bulur? Kırmızımsı hücreler, o satırda önceki vezirlerin tehdit ettiği sütunlardır.

n = 5, boş tahta. coz(t, 0): satırlar yukarıdan aşağı doldurulur; her satırda sütun 0, 1, 2, … sırayla denenir.

V

Satır 0: sütun 0 güvenli → t[0][0] = 1, coz(t, 1).

VV

Satır 1: sütun 0, 1 tehdit altında; sütun 2 güvenli → t[1][2] = 1, coz(t, 2).

VVV

Satır 2: sütun 0, 1, 2, 3 tehdit altında; sütun 4 güvenli → t[2][4] = 1, coz(t, 3).

VVVV

Satır 3: sütun 0 tehdit altında; sütun 1 güvenli → t[3][1] = 1, coz(t, 4).

VVVVV

Satır 4: sütun 0, 1, 2 tehdit altında; sütun 3 güvenli → t[4][3] = 1, coz(t, 5).

VVVVV

satir == n → true; true yığın boyunca yukarı taşınır. Çözüm [0, 2, 4, 1, 3]: 5 yerleştirme, hiç geri dönüş yok (4 vezirde 8 yerleştirme, 4 geri dönüş gerekmişti).

boolean coz(int[][] t, int satir) {
  if (satir == n) return true;
  for (int sutun = 0; sutun < n; sutun++) {
    if (guvenliMi(t, satir, sutun)) {
      t[satir][sutun] = 1;
      if (coz(t, satir + 1)) return true;
      t[satir][sutun] = 0;   // geri al
    }
  }
  return false;
}

Çoktan Seçmeli · N Vezir

Soru 9: Arama Uzayı

8 vezir probleminde "her satıra tam bir vezir" gözlemi kullanılmadan (64 kareden 8'ini seçerek) ve kullanılarak (her satır için 8 sütun) üretilebilecek tam yerleşim sayıları sırasıyla nedir?

C: 64 kareden 8'ini seçmek C(64, 8) ≈ 4,4 milyar yerleşimdir; satır kısıtı yapıya gömülünce her satır için 8 sütun → 8⁸ ≈ 16,7 milyon. Sütunların da farklı olması istenirse 8! = 40 320 permütasyon kalır. Geri izleme tüm çözümler için yalnızca 2056 güvenli yerleştirme yapar.

Çıktı Sorusu · N Vezir

Soru 10: 6 Vezir: İlk Çözüm

Dersteki coz metoduna her yerleştirmede artan bir yer sayacı eklendi. n = 6 için program ne yazar (sütunlar satır sırasıyla)?

static int yer = 0;
static boolean coz(int[][] t, int satir) {
  if (satir == n) return true;
  for (int s = 0; s < n; s++) {
    if (guvenliMi(t, satir, s)) {
      t[satir][s] = 1; yer++;
      if (coz(t, satir + 1)) return true;
      t[satir][s] = 0;
    }
  }
  return false;
}
// main (n = 6): coz(t, 0); sonra her satırdaki
// vezirin sütunu bir diziye yazılır:
System.out.println(
    Arrays.toString(sut) + " " + yer);
Cevabı göster

Çıktı: [1, 3, 5, 0, 2, 4] 31

  • Sütunlar küçükten büyüğe denendiği için sözlüksel sıradaki ilk çözüm bulunur: satır 0'da sütun 0 ile başlayan tüm dallar çıkmaza girer; çözüm sütun 1 ile başlar.
  • İlk çözüme kadar 31 vezir yerleştirilir (n = 5'te 5, n = 7'de yalnızca 9): iş n ile düzgün artmaz.
  • n = 6'nın yalnızca 4 çözümü vardır; tüm çözümleri bulmak için 152 yerleştirme gerekir.

Çoktan Seçmeli · N Vezir

Soru 11: Neden Üç Yön?

guvenliMi(t, s, k) yalnızca yukarıdaki sütunu ve iki üst çaprazı denetler. Aynı satırın ve alt satırların denetlenmemesinin nedeni nedir?

D: coz satır satır ilerler ve bir satıra yalnızca bir vezir koyar (sonraki satıra geçer ya da geri alır). s. satıra vezir konurken altındaki satırlar daima boştur; bu yüzden üç yön yeter ve test O(n) olur. Satır kısıtı algoritmanın yapısına gömülmüştür.

Çıktı Sorusu · N Vezir

Soru 12: O(1) Güvenlik Testi

n = 8 için bayrak dizileriyle çalışan sürümde (2, 5) karesine bir vezir konuyor. Hangi sut, k1 ve k2 hücreleri true olur? Ardından (4, 3) ve (5, 2) kareleri güvenli midir?

boolean[] sut = new boolean[n];
boolean[] k1 = new boolean[2*n-1]; // r+c
boolean[] k2 = new boolean[2*n-1]; // r-c+n-1
// (r, c) güvenli mi?
int a = r + c, b = r - c + n - 1;
if (sut[c] || k1[a] || k2[b]) continue;
sut[c] = k1[a] = k2[b] = true;     // yerleştir
??V
Cevabı göster
  • sut[5], k1[2 + 5] = k1[7], k2[2 − 5 + 7] = k2[4] true olur.
  • (4, 3): k1[4 + 3] = k1[7] zaten true → aynı ters köşegende (2,5)–(3,4)–(4,3): güvenli değil.
  • (5, 2): sut[2] false, k1[7] → 5 + 2 = 7 true → yine ters köşegende: güvenli değil. (5, 1) ise k1[6], k2[11], sut[1] hepsi false: güvenli.

Aynı ters köşegende r + c, aynı köşegende r − c sabittir; + n − 1 indisin 0'dan başlamasını sağlar. Test O(n) yerine O(1) olur.

Çoktan Seçmeli · N Vezir

Soru 13: Tüm Çözümleri Saymak

İlk çözümde duran coz metodunu tüm çözümleri sayacak biçimde değiştirmenin doğru yolu hangisidir?

A: false döndürmek aramayı sürdürür: üst çağrı tahtayı geri alır ve sıradaki sütunu dener. true döndürülürse ilk çözümde durulur. Bu değişiklikle n = 6 için 4, n = 8 için 92 çözüm sayılır; yerleştirme sayısı sırasıyla 152 ve 2056'dır.

Çıktı Sorusu · En Az Çakışma

Soru 14: Çakışma Sayıları

4 × 4 tahtada her sütunda bir vezir var; sütun 0, 1, 2, 3'teki vezirlerin satırları [2, 0, 3, 2]. Onarım için sütun 3'teki vezir seçildi. Bu vezir sütunu içinde her satıra taşınsa diğer vezirlerden kaçıyla çakışır? En az çakışma onu nereye taşır?

101VVV
Cevabı göster

Sütun 3 için çakışma sayıları (satır 0–3): 1, 0, 3, 1.

  • satır 0: 1 ((0,1) aynı satır) · satır 1: 0 · satır 2: 3 ((2,0) aynı satır, (0,1) çapraz, (3,2) çapraz) · satır 3: 1 ((3,2) aynı satır). Satır kaydı (r, s) = (satır, sütun).
  • Şu anki satır 2 en kötüsüdür (3). En küçük değer 0, yalnızca satır 1'de → vezir oraya taşınır.
  • Yeni yerleşim [2, 0, 3, 1]: hiçbir çakışma kalmaz, tek onarım adımıyla 4 vezir çözümü bulundu. Eşitlik olsaydı rastgele seçilirdi.

Çoktan Seçmeli · En Az Çakışma

Soru 15: En Az Çakışmanın Sınırı

En az çakışma sezgiseli ile geri izleme karşılaştırıldığında aşağıdakilerden hangisi doğrudur?

D: En az çakışma tam yerleşimle başlayıp yerel onarım yapan bir yerel aramadır: platolarda dolaşabilir ve tam değildir; adım sınırına ulaşmak "çözüm yok" demek değildir. Buna karşılık n = 1 000 000 için bile ortalama birkaç onlu adımda çözüm bulur. Geri izleme tamdır ve tüm çözümleri (8'de 92) sayabilir ama n büyüdükçe hızla yavaşlar.

Adım Adım Çalıştırma · Sudoku

Soru 16: 4 × 4 Sudoku İzleme

Dersteki Sudoku çözücüsünün 4 × 4 sürümü (rakamlar 1–4, kutular 2 × 2) bu bulmacayı nasıl çözer?

412321214

4 × 4 Sudoku: her satır, sütun ve 2 × 2 kutuda 1–4 birer kez. Siyah rakamlar ipucu; 7 boş hücre satır satır, soldan sağa doldurulacak.

4132321214

(0, 2): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.

41323241214

(1, 2): 1, 2, 3 geçersiz; 4 geçerli → yazıldı, coz(t) yeniden çağrılır.

413232411214

(1, 3): 1 geçerli → yazıldı, coz(t) yeniden çağrılır.

4132324113214

(2, 1): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.

4132324113214

(2, 3): satırda, sütunda ya da kutuda 1–4'ün hepsi var → hiçbir rakam geçerli değil, return false (çıkmaz).

413232411214

Geri dönüş: (2, 1)'deki 3 silinir (t = 0); aynı hücrede sıradaki rakam denenir.

4132324114214

(2, 1): 1, 2 geçersiz; 4 geçerli → yazıldı, coz(t) yeniden çağrılır.

41323241142314

(2, 3): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.

413232411423214

(3, 0): 1 geçersiz; 2 geçerli → yazıldı, coz(t) yeniden çağrılır.

4132324114232314

(3, 1): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.

4132324114232314

Boş hücre kalmadı → true. 8 yerleştirme, 1 geri alma. Erken (2, 1)'e yazılan 3, ancak (2, 3) çıkmaza girince yanlış anlaşıldı.

boolean coz(int[][] t) {
  for (int s = 0; s < 4; s++)
    for (int k = 0; k < 4; k++)
      if (t[s][k] == 0) {
        for (int r = 1; r <= 4; r++)
          if (gecerliMi(t, s, k, r)) {
            t[s][k] = r;
            if (coz(t)) return true;
            t[s][k] = 0;           // geri al
          }
        return false; // rakam yok
      }
  return true; // boş hücre yok
}

Çıktı Sorusu · Sudoku

Soru 17: Kutunun Köşesi

9 × 9 Sudoku'nun gecerliMi metodundaki kutu hesabı aşağıda. Kod ne yazar? (7, 4) hücresinin kutusu hangi satır ve sütunları kapsar?

int[][] h = {{7, 4}, {2, 8}, {5, 5}};
for (int[] x : h) {
  int bs = x[0] / 3 * 3;
  int bk = x[1] / 3 * 3;
  System.out.print(bs + " " + bk + " ");
}
Cevabı göster

Çıktı: 6 3 0 6 3 3

  • Tam sayı bölmesi: 7 / 3 = 2 → 2·3 = 6; 4 / 3 = 1 → 3. (7, 4)'ün kutusu satır 6–8, sütun 3–5'tir.
  • (2, 8) → (0, 6); (5, 5) → (3, 3). s / 3 * 3, s'yi 3'ün katına aşağı yuvarlar; çarpma unutulursa (yalnızca s / 3) kutu numarası (0–2) elde edilir, indis değil.
  • Kutu denetimi unutulursa satır ve sütunu doğru ama kutuları geçersiz "çözümler" üretilir.

Çoktan Seçmeli · Sudoku

Soru 18: MRV Sezgiseli

Sudoku çözücüsünde MRV (minimum remaining values) sezgiseli neyi değiştirir?

D: MRV değişken sıralamasıdır: satır satır ilk boş hücre yerine en az adaylı hücre doldurulur. Tek adaylı hücreler önce dolar ve çelişkiler erkenden ortaya çıkar; dersteki bulmacada geri alma sayısı 4157'den 0'a iner. C ayrı bir iyileştirmedir (bit maskeleri).

Adım Adım Çalıştırma · Çizge Boyama ve Hamilton Yolu

Soru 19: Çizge Boyama İzleme

Kenarlar 0–1, 0–4, 1–2, 1–3, 1–4, 2–3, 3–4; m = 3. boya(0) renkleri nasıl atar, nerede geri döner?

01234

5 düğüm, m = 3 renk (r1, r2, r3). Düğümler 0, 1, 2, … sırayla boyanır; her düğümde renk 1, 2, 3 sırayla denenir.

01234r1

Düğüm 0: renk 1 uygun → atanır, boya(1).

01234r1r2

Düğüm 1: renk 1 komşuda var; renk 2 uygun → atanır, boya(2).

01234r1r2r1

Düğüm 2: renk 1 uygun → atanır, boya(3).

01234r1r2r1r3

Düğüm 3: renk 1, 2 komşuda var; renk 3 uygun → atanır, boya(4).

01234r1r2r1r3

Düğüm 4: denenecek renk kalmadı → return false (çıkmaz).

01234r1r2r1

Geri al: düğüm 3'nin rengi (3) silinir; aynı düğümde sıradaki renk denenecek.

01234r1r2r1

Düğüm 3: denenecek renk kalmadı → return false (çıkmaz).

01234r1r2

Geri al: düğüm 2'nin rengi (1) silinir; aynı düğümde sıradaki renk denenecek.

01234r1r2r3

Düğüm 2: renk 2 komşuda var; renk 3 uygun → atanır, boya(3).

01234r1r2r3r1

Düğüm 3: renk 1 uygun → atanır, boya(4).

01234r1r2r3r1r3

Düğüm 4: renk 1, 2 komşuda var; renk 3 uygun → atanır, boya(5). Beş düğüm de boyandı: geçerli 3-boyama [1, 2, 3, 1, 3].

boolean boya(int v) {
  if (v == n) return true;
  for (int c = 1; c <= m; c++) {
    if (uygunMu(v, c)) { // komşularda c yok
      renk[v] = c;
      if (boya(v + 1)) return true;
      renk[v] = 0;              // geri al
    }
  }
  return false;
}

Klasik Soru · Çizge Boyama ve Hamilton Yolu

Soru 20: Tek Uzunluklu Döngü

5 düğümlü döngü çizgesi C₅ (0–1–2–3–4–0), boya(0) ile m = 2 renkle boyanmaya çalışılıyor. Arama ne döndürür ve neden? En az kaç renk gerekir?

Cevabı göster
  • Düğüm 0: renk 1 → düğüm 1: 1 komşuda var, renk 2 → düğüm 2: renk 1 → düğüm 3: renk 2 → düğüm 4: 1 (0'da) ve 2 (3'te) komşuda → çıkmaz.
  • Geri dönüşler sonucu değiştirmez: 2 renkte renkler zorunlu olarak dönüşümlü gider (1, 2, 1, 2, …) ve düğüm 4 her iki renge de komşudur. Arama tüm ağacı gezip false döner; bu, çözüm olmadığının kanıtıdır (arama tamdır).
  • Tek uzunluklu döngüler 3 renk ister: 1, 2, 1, 2, 3. Çift uzunluklu döngüler (iki parçalı çizgeler) 2 renkle boyanabilir.

Adım Adım Çalıştırma · Çizge Boyama ve Hamilton Yolu

Soru 21: Hamilton Yolu İzleme

Kenarlar 0–1, 0–2, 0–4, 1–2, 1–4, 3–4. uygunMu yeni düğümün son düğüme komşu ve yolda olmadığını denetler. bul(graf, yol, 1) hangi yolu bulur?

01234

yol[0] = 0; bul(graf, yol, 1). Her konumda düğümler 0, 1, 2, … sırayla denenir: son düğüme komşu ve yolda olmayan düğüm eklenebilir.

01234

Konum 1: düğüm 1 uygun → yol[1] = 1.

01234

Konum 2: düğüm 2 uygun → yol[2] = 2.

01234

Düğüm 2'den devam edilemedi → geri al: yol[2] = −1.

01234

Konum 2: düğüm 4 uygun → yol[2] = 4.

01234

Konum 3: düğüm 3 uygun → yol[3] = 3.

01234

Düğüm 3'den devam edilemedi → geri al: yol[3] = −1.

01234

Düğüm 4'den devam edilemedi → geri al: yol[2] = −1.

01234

Düğüm 1'den devam edilemedi → geri al: yol[1] = −1.

01234

Konum 1: düğüm 2 uygun → yol[1] = 2.

01234

Konum 2: düğüm 1 uygun → yol[2] = 1.

01234

Konum 3: düğüm 4 uygun → yol[3] = 4.

01234

Konum 4: düğüm 3 uygun → yol[4] = 3. konum == 5: Hamilton yolu 0 → 2 → 1 → 4 → 3.

boolean bul(int[][] graf, int[] yol,
            int konum) {
  if (konum == graf.length) return true;
  for (int v = 0; v < graf.length; v++) {
    if (uygunMu(v, graf, yol, konum)) {
      yol[konum] = v;
      if (bul(graf, yol, konum + 1))
        return true;
      yol[konum] = -1;          // geri al
    }
  }
  return false;
}

Adım Adım Çalıştırma · Kelime Arama

Soru 22: Kelime Arama İzleme

Izgara ABCE / SFCS / ADEE. (1, 0)'dan başlayan ara çağrısı "SADE" kelimesini nasıl bulur? (ds = {−1, 1, 0, 0}, dk = {0, 0, −1, 1})

ABCESFCSADEE

Izgara ABCE / SFCS / ADEE, kelime "SADE". ara(iz, "SADE", 0, 1, 0, ziyaret): (1, 0)'daki S'den başlanır. Yön sırası: yukarı, aşağı, sol, sağ.

ABCESFCSADEE

(1, 0) = 'S' kelimenin 0. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.

ABCESFCSADEE

(0, 0) = 'A' kelimenin 1. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.

ABCESFCSADEE

(0, 0)'den hiçbir komşu 'D' ile sürmüyor (B, sınır ya da ziyaretli) → işaret kaldırılır, false.

ABCESFCSADEE

(2, 0) = 'A' kelimenin 1. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.

ABCESFCSADEE

(2, 1) = 'D' kelimenin 2. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.

ABCESFCSADEE

(2, 2) = 'E' kelimenin 3. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.

ABCESFCSADEE

i == 4 == kelime uzunluğu → true. Yol: (1,0) S → (2,0) A → (2,1) D → (2,2) E.

boolean ara(char[][] iz, String kelime,
            int i, int s, int k,
            boolean[][] ziyaret) {
  if (i == kelime.length()) return true;
  if (s < 0 || s >= iz.length || k < 0
      || k >= iz[0].length || ziyaret[s][k]
      || iz[s][k] != kelime.charAt(i))
    return false;
  ziyaret[s][k] = true;
  for (int d = 0; d < 4; d++)
    if (ara(iz, kelime, i + 1, s + ds[d],
            k + dk[d], ziyaret))
      return true;
  ziyaret[s][k] = false;      // geri al
  return false;
}

Çoktan Seçmeli · Kelime Arama

Soru 23: Ziyaret İşaretini Kaldırmamak

Kelime aramada ziyaret[s][k] = false satırı unutulursa ne olur?

B: İşaret kalırsa, başarısız bir denemede geçilen hücreler sonraki denemelerde "kullanılmış" görünür; var olan bir kelime bulunamayabilir. Bir yolda aynı hücreyi iki kez kullanma (A) ise işaretin kendisiyle zaten engellenir. Önce işaretle, sonra keşfet, en sonda işareti kaldır: seç → keşfet → geri al.

Çıktı Sorusu · Kelime Arama

Soru 24: Bulunamayan Kelime

Aynı ızgarada (ABCE / SFCS / ADEE) "ABCCED", "SEE" ve "ABCB" kelimeleri için arama sonucu nedir? "ABCB" neden bulunamaz?

ABCESFCSADEE
Cevabı göster
  • ABCCED: var → (0,0) A → (0,1) B → (0,2) C → (1,2) C → (2,2) E → (2,1) D.
  • SEE: var → (1,3) S → (2,3) E → (2,2) E (ilk deneme (0,3) E'den sonra komşu E olmadığı için geri dönülür).
  • ABCB: yok → A → B → C'den sonra B gerekir; C'nin tek B komşusu (0,1) zaten bu yolda kullanıldı. Bir hücre aynı yolda iki kez kullanılamaz.

En kötü durum O(R · C · 3L): her başlangıç hücresinden, ilk harften sonra en fazla 3 yeni yön (geldiğimiz hücre ziyaretli).

Çoktan Seçmeli · Analiz

Soru 25: Karmaşıklık

Geri izlemede en kötü durum karmaşıklıkları için hangi eşleştirme doğrudur?

A: Sudoku'da m boş hücrenin her biri 9 aday alır: 9ᵐ. m-boyamada n düğümün her biri m renk alır, denetim düğüm başına O(n): O(n · mⁿ). N vezir O(n!), Hamilton yolu O(n · n!), kelime arama O(R · C · 3ᴸ); alt kümeler O(2ⁿ), permütasyonlar O(n · n!). Bellek ise yalnızca O(derinlik)'tir.

Çoktan Seçmeli · Analiz

Soru 26: Paradigma Seçimi

Aşağıdaki problemlerden hangisi için geri izleme en uygun yaklaşımdır?

C: Geri izleme kısıt sağlama ve "tüm çözümler" problemlerine uygundur: durum uzayı ağacını DFS ile gezer, geçersiz dalları budar. A ve B doğrusal ya da logaritmik zamanda çözülür; MST açgözlü (Kruskal, Prim) ile O(E log V)'de bulunur.

Son

Bölüm 13: Geri İzleme Algoritmaları: Çalışma Soruları
Konu anlatımı: Geri izleme algoritmaları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.