Minimum ágat egy bináris fa?

szavazat
1

A bináris fa lehet kódolva két funkciót l, és r olyan, hogy egy node n, l(n)így a bal gyermeke n, r(n) így a jobb gyermeke n.

Egy ág egy fa egy útvonal a gyökér a levél, a hossza egy ágat, hogy egy adott levél a ívek száma az utat a gyökértől, hogy levél.

Hagyja MinBranch(l,r,x), hogy egy egyszerű rekurzív algoritmus vesz egy bináris fa által kódolt l és r funkciók együtt a gyökér csomópont x bináris fa, és visszatér a hossza a legrövidebb ágon a bináris fa.

Adja meg a pszeudokódját erre algoritmus.

OK, így tulajdonképpen ez az, amit kitaláltunk eddig:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Nyilvánvaló, hogy ez nem jó vagy tökéletes. Hálás lennék, ha az emberek segíteni, hogy ezt a tökéletes és működik - minden segítséget fogják értékelni.

A kérdést 28/08/2009 05:07
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
3

Kétlem, hogy bárki meg fogja oldani a házi feladatot az Ön számára egyenesen felfelé. A kulcs: a visszatérési értéke bizonyára magasabbak, mint a fa egyre nagyobb lesz, igaz? Azonban én nem látok semmilyen numerikus literálok a funkciót, kivéve a 0 értéket, nem lesz további szereplők sem. Hogyan fogja valaha is visszatér nagyobb számban?

Tovább szög ugyanebben a témában: bármikor írsz egy rekurzív függvény, segít felsorolni „mik a feltételek, ahol abba kell hagyni a hívó magam? Amit én visszatér minden körülmény?”

Válaszolt 28/08/2009 05:15
a forrás felhasználó

szavazat
2

Maga a helyes megközelítés, de te nem egészen ott; A rekurzív algoritmus mindig vissza 0. (a logika szinte jobb, bár ...)

megjegyezni, hogy a hossza a alágazatok eggyel kevesebb, mint a hossza az ág; így left_oneés right_onelegyen 1 + MinBranch....

Steping keresztül az algoritmus néhány mintát fák segít feltárni off-by-one hiba, mint ez ...

Válaszolt 28/08/2009 05:16
a forrás felhasználó

szavazat
0

Amit létre lehet úgy, mint egy mélységi keresést. Tekintettel azonban arra, amit után (legrövidebb ág), ez nem lehet a leginkább hatékonnyá megközelítés. Gondolj bele, hogy az algoritmus teljesítene egy fára, hogy nagyon nehéz volt a bal oldalon (a gyökér csomópont), de csak egy csomópont a jobb oldalon.

Tipp: fontolja meg egy szélességi keresés.

Válaszolt 28/08/2009 05:19
a forrás felhasználó

szavazat
0

Mi van ott olyan, mint egy mélységi keresés algoritmusa amelynek meg kell keresni az egész fát, mielőtt felér egy megoldást. amire szükség van, az szélességi első keresési algoritmus, amely képes visszatérni, amint megtalálja a megoldást anélkül, hogy a teljes keresési

Válaszolt 28/08/2009 05:19
a forrás felhasználó

szavazat
1

Úgy tűnik, hogy szinte már rá, de úgy ezt a példát:

      4

   3     5

Ha nyoma keresztül MinBranch, látni fogod, hogy a MinBranch(l,r,4)hívás:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

Ennek van értelme, elvégre 3 levélcsomópont, így természetesen a távolság a legközelebbi levélcsomóponthoz 0. Ugyanez történik right_one.

De majd a szél ide:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

de ez nyilvánvalóan rossz, mert ez a csomópont (4) nem levél csomópont. A kód elfelejtettem számolni a jelenlegi csomópont (hoppá!). Biztos vagyok benne, akkor sikerül javítani.


Most tényleg, hogy így csinálod ezt nem a leggyorsabb, de nem vagyok benne biztos, hogy megfelelő erre a feladatra. Tekintsük ezt a fát:

         4
       3   5
     2
   1

Az algoritmus számolja ki a bal oldali ága rekurzívan, habár tudta, feltételezzük, kisegíteni, ha először számolni a megfelelő ágat, és megjegyezte, hogy 3-nak a bal, ezért egyértelműen hosszabb, mint 5 (ami egy levél). De, persze, számítva a jobb oldali ág első nem mindig működik!

Ehelyett bonyolultabb kódot, és valószínűleg egy kompromisszum nagyobb memória használat, akkor megtekintéséhez csomópontokat balról-jobbra, fentről-lefelé (mint angol olvasási sorrendben), és megáll az első levél, amit talál.

Válaszolt 28/08/2009 05:20
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more