Informatika gyűjtemény

Egy szinttel feljebb 1. óra

2004050607080910

NézetNyomtat

1. óra

(Erben Péter, 2006.09.18.)

Bemelegítés

Első alkalommal a "nyers erő" (brute force) módszerét elevenítjük fel / tanuljuk meg. A módszer lényege, hogy ha nincs jobb ötletünk, akkor megpróbáljuk (szisztematikusan) végigpróbálni az összes lehetséges esetet. Ez általában exponenciális algoritmushoz vezet (ami nem jó), de néha nincs jobb.
Az összes eset végigpróbálásának egyik gyakori módja a visszalépéses keresés (backtrack). Ennek egy rekurzív és egy nem rekurzív változatát is megadjuk.

Visszalépéses keresés rekurzióval

A következő algoritmus váz abban az esetben használható, ha tudjuk, hogy van legalább egy megoldás, és elég az első megoldást megtalálnunk. Szépséghibája, hogy a megoldás megtalálásakor a rekurzió "legmélyén" vagyunk, és ekkor meg kell szakítanunk a rekurzió futását, hogy a megtalált megoldást ne "bontsák le" a visszalépések.
rek_backtrack:
Ha nincs kész 
akkor
    Ciklus a lehetséges lépéseken
        megcsinál( lehetségesLépés )
        rek_backtrack
        visszacsinál( lehetséges lépés) 
    Ciklus vége 
különben
    megoldás feldolgozása
    keresés vége
Elágazás vége

Visszalépéses keresés ciklussal

A rekurzió kiküszöbölhető, ha a valamilyen adatszerkezetben tároljuk eddigi döntéseinket. A döntés[i] tömbeleme azt tárolja, hogy az i. lépésben "merre mentünk". A vanjóeset() függvény egyesével végigpróbálja a lehetséges döntéseket, és ha igaz értékkel tér vissza, akkor be is állítja a döntés[i] értéket.
cikl_backtrack:
döntés[1..n] := 0; i := 1
Ciklus amíg i > 0 és i < N + 1
    Ha vanjóeset(i)
    akkor 
        i := i + 1
    különben
        visszacsinál( i )
        i := i - 1
    Elágazás vége
Ciklus vége 
VAN := (> N)

Feladat