Bölüm 13: Geri İzleme Algoritmaları
Ç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] = falseveremoveile 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?
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.
ara(1, 3): a[0] = 3 alındı → toplam 3. Önce a[1] = 5 alınmayı deneyecek.
ara(2, 8): a[1] = 5 alındı → toplam 8. Önce a[2] = 6 alınmayı deneyecek.
ara(3, 14): a[2] = 6 alındı → toplam 14. Önce a[3] = 7 alınmayı deneyecek.
ara(4, 21): 21 > 15 → budandı, false. Bu düğümün altı hiç üretilmez.
ara(4, 14): öğe kalmadı (i == n) ve toplam 15 değil → false; geri dön.
ara(3, 8): a[2] = 6 alınmadı → toplam 8. Önce a[3] = 7 alınmayı deneyecek.
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.
Satır 0: sütun 0 güvenli → t[0][0] = 1, coz(t, 1).
Satır 1: sütun 0, 1 tehdit altında; sütun 2 güvenli → t[1][2] = 1, coz(t, 2).
Satır 2: sütun 0, 1, 2, 3 tehdit altında; sütun 4 güvenli → t[2][4] = 1, coz(t, 3).
Satır 3: sütun 0 tehdit altında; sütun 1 güvenli → t[3][1] = 1, coz(t, 4).
Satır 4: sütun 0, 1, 2 tehdit altında; sütun 3 güvenli → t[4][3] = 1, coz(t, 5).
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
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?
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?
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.
(0, 2): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.
(1, 2): 1, 2, 3 geçersiz; 4 geçerli → yazıldı, coz(t) yeniden çağrılır.
(1, 3): 1 geçerli → yazıldı, coz(t) yeniden çağrılır.
(2, 1): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.
(2, 3): satırda, sütunda ya da kutuda 1–4'ün hepsi var → hiçbir rakam geçerli değil, return false (çıkmaz).
Geri dönüş: (2, 1)'deki 3 silinir (t = 0); aynı hücrede sıradaki rakam denenir.
(2, 1): 1, 2 geçersiz; 4 geçerli → yazıldı, coz(t) yeniden çağrılır.
(2, 3): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.
(3, 0): 1 geçersiz; 2 geçerli → yazıldı, coz(t) yeniden çağrılır.
(3, 1): 1, 2 geçersiz; 3 geçerli → yazıldı, coz(t) yeniden çağrılır.
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?
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.
Düğüm 0: renk 1 uygun → atanır, boya(1).
Düğüm 1: renk 1 komşuda var; renk 2 uygun → atanır, boya(2).
Düğüm 2: renk 1 uygun → atanır, boya(3).
Düğüm 3: renk 1, 2 komşuda var; renk 3 uygun → atanır, boya(4).
Düğüm 4: denenecek renk kalmadı → return false (çıkmaz).
Geri al: düğüm 3'nin rengi (3) silinir; aynı düğümde sıradaki renk denenecek.
Düğüm 3: denenecek renk kalmadı → return false (çıkmaz).
Geri al: düğüm 2'nin rengi (1) silinir; aynı düğümde sıradaki renk denenecek.
Düğüm 2: renk 2 komşuda var; renk 3 uygun → atanır, boya(3).
Düğüm 3: renk 1 uygun → atanır, boya(4).
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?
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.
Konum 1: düğüm 1 uygun → yol[1] = 1.
Konum 2: düğüm 2 uygun → yol[2] = 2.
Düğüm 2'den devam edilemedi → geri al: yol[2] = −1.
Konum 2: düğüm 4 uygun → yol[2] = 4.
Konum 3: düğüm 3 uygun → yol[3] = 3.
Düğüm 3'den devam edilemedi → geri al: yol[3] = −1.
Düğüm 4'den devam edilemedi → geri al: yol[2] = −1.
Düğüm 1'den devam edilemedi → geri al: yol[1] = −1.
Konum 1: düğüm 2 uygun → yol[1] = 2.
Konum 2: düğüm 1 uygun → yol[2] = 1.
Konum 3: düğüm 4 uygun → yol[3] = 4.
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})
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ğ.
(1, 0) = 'S' kelimenin 0. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.
(0, 0) = 'A' kelimenin 1. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.
(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.
(2, 0) = 'A' kelimenin 1. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.
(2, 1) = 'D' kelimenin 2. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.
(2, 2) = 'E' kelimenin 3. harfiyle eşleşti → ziyaret edildi işaretlenir, 4 komşu denenir.
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?
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.