Korteste filial i et binært tre?

stemmer
1

En binærtreet kan kodes ved hjelp av to funksjoner l, og r slik at for en node n, l(n)gi venstre barn av n, r(n) gi rett barn n.

En gren av et tre er en bane fra roten til et blad, lengden av en gren til en bestemt blad er antallet buer på banen fra roten til det blad.

La MinBranch(l,r,x)være et enkelt rekursiv algoritme for å ta et binært tre kodet av L- og R-funksjoner sammen med rotnoden x for den binære treet og gir lengden av den korteste gren av det binære treet.

Gi pseudo for denne algoritmen.

OK, så i utgangspunktet dette er hva jeg har kommet opp med så langt:

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)}
}

Selvfølgelig er dette ikke bra eller perfekt. Jeg ville være takknemlig hvis folk kan hjelpe meg med å få dette perfekt og arbeids - hjelp vil bli verdsatt.

Publisert på 28/08/2009 klokken 04:07
kilden bruker
På andre språk...                            


5 svar

stemmer
3

Jeg tviler på noen vil løse leksene for deg rett opp. En ledetråd: returverdien må sikkert vokse høyere som treet blir større, ikke sant? Men jeg ser ikke noen numeriske konstanter i din funksjon bortsett fra 0, og ingen tillegg operatører heller. Hvordan vil du noen gang kommer tilbake større tall?

En annen vinkel på det samme problemet: når du skriver en rekursiv funksjon, hjelper det å nummerere "Hva er alle de forhold hvor jeg bør slutte å kalle meg selv hva jeg kommer tilbake i hver omstendighet?"

Svarte 28/08/2009 kl. 04:15
kilden bruker

stemmer
2

Du er på riktig tilnærming, men du er ikke helt der; din rekursiv algoritme vil alltid returnere 0. (logikken er nesten rett, men ...)

merke til at lengden av undergrenene er ett mindre enn lengden av grenen; så left_oneog right_onebør være 1 + MinBranch....

Steping gjennom algoritmen med noen eksempler på trær vil bidra til å avdekke off-for-en feil som dette ...

Svarte 28/08/2009 kl. 04:16
kilden bruker

stemmer
0

Hva du har laget kan betraktes som en dybde-først-søk. Men gitt det du leter etter (korteste gren), kan dette ikke være den mest effektiv tilnærming. Tenk på hvordan algoritmen ville utføre på et tre som var veldig tungt på venstre side (for rotnoden), men hadde bare en node på høyre side.

Hint: vurdere en bredde-først-søk tilnærming.

Svarte 28/08/2009 kl. 04:19
kilden bruker

stemmer
0

Det du har der ser ut som en dybde først søk algoritmen som vil måtte søke hele treet før du kommer opp med en løsning. det du trenger er bredde-først-søk algoritme som kan gå tilbake så snart den finner løsningen uten å gjøre en fullstendig søk

Svarte 28/08/2009 kl. 04:19
kilden bruker

stemmer
1

Det ser ut som du nesten har det, men tenk på dette eksempelet:

      4

   3     5

Når du sporer gjennom MinBranch, vil du se at i MinBranch(l,r,4)samtalen:

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

Det er fornuftig, tross alt, er tre en bladnode, så selvfølgelig avstanden til nærmeste bladnoden er 0. Det samme skjer for right_one.

Men du da ender opp her:

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

men det er helt klart feil, fordi dette node (4) er ikke en bladnode. Din kode glemte å telle gjeldende node (oops!). Jeg er sikker på at du klarer å fikse det.


Nå, faktisk, de måten du gjør dette er ikke den raskeste, men jeg er ikke sikker på om det er relevant for denne øvelsen. Tenk på dette treet:

         4
       3   5
     2
   1

Din algoritme vil telle opp venstre grenen rekursivt, selv om det kan, hypotetisk, kausjon ut hvis du først regnet riktig gren og bemerket at tre har en venstre, så det er klart lengre enn fem (som er et blad). Men, selvfølgelig, telle riktig gren første fungerer ikke alltid!

I stedet, med mer komplisert kode, og sannsynligvis en avveining av større minnebruk, kan du sjekke noder venstre mot høyre, fra topp til bunn (akkurat som engelsk lesing rekkefølge) og stopper på første blad du finner.

Svarte 28/08/2009 kl. 04:20
kilden bruker

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