Avatar billede hjalten5 Nybegynder
10. juni 2003 - 13:52 Der er 9 kommentarer og
1 løsning

Søgning i struktur: rekursion

Jeg har fået placeret en masse ord (String) i et binært træ ved rekursivt at kalde en indsaet(nytOrd).
Så langt så godt.
Nu sidder jeg og skal finde (i samme træ) med en metode find(soegPaa), allt de ord i træet der begynder med soegPaa.
Eksempel: rod -> midte, venstre node -> midt, højre node -> midten.
Der skal metoden find("mid") give alle tre noder (muligvis også undernoder).

Jeg har lavet en metode, men den når ikke længere end til roden. Mangler jeg noget, eller kan det slet ikke lade sig gøre med et binært træ?
Avatar billede arne_v Ekspert
10. juni 2003 - 14:04 #1
Det bør godt kunne laves med rekursion.

Pseudo kode:

find-alle(node, start-af-ord, liste) {
    if match list.add(ord)
    if lchild find-alle(lchild, start-af-ord, liste)
    if rchild find-alle(rchild, start-af-ord, liste)
}

find-alle(rod)

men det er jo reelt en sekventiel scan, hvilket næppe var hensigten
med et binært træ.

Jeg spekulerer lidt på en forbedring.
Avatar billede hjalten5 Nybegynder
10. juni 2003 - 14:07 #2
Jeg prøver, og hvis jeg kommer nærmere får du point.
Det var i teorien meningen at søgningen skulle forløbe hurtigst muligt (altså ikke liste, men hvis alt andet fejler...)
Avatar billede arne_v Ekspert
10. juni 2003 - 14:07 #3
Hvad med:

find-alle(node, start-af-ord, liste) {
    if match list.add(ord)
    if lchild and start-af-ord < node find-alle(lchild, start-af-ord, liste)
    if rchild and start-af-ord + "ZZZ" > node find-alle(rchild, start-af-ord, liste)
}

find-alle(rod)
Avatar billede arne_v Ekspert
10. juni 2003 - 14:11 #4
Reelt set skal vi finde alle ord i træet i intervallet
  start-af-ord ... start-af-ord + "ZZZ"

Med dit eksempel:
  mid ... midzzz

Hvis ikke:
  mid < current node
så er der ikke nogle relevante node nede af venstre grenen

Hvis ikke:
  midzzz > current node
så er der ikke nogle relevante node noder nede af højre grenen

Det burde give en tilpas hurtog søgning.
Avatar billede hjalten5 Nybegynder
10. juni 2003 - 14:12 #5
jeg har ikke helt grejet din match list, men du får point alligevel, da det ser brugbart ud
Avatar billede arne_v Ekspert
10. juni 2003 - 14:18 #6
if match list.add(ord)

betyder bare:

if start-af-ord matcher current node then add ord to list

(jeg forstiller mig at alle matchene addes til en ArrayList eller ligende)
Avatar billede hjalten5 Nybegynder
10. juni 2003 - 14:19 #7
det er planen med et arraylist. roger, tak for hjælpen
Avatar billede hjalten5 Nybegynder
10. juni 2003 - 16:09 #8
dine kommentarer 1 og 2 er de forskellige eller underbygger de hinanden?
Avatar billede arne_v Ekspert
10. juni 2003 - 16:15 #9
14:07:48 og 14:11:44 er samme ide - det ene er bare pseudo kode - det
andet er en mere verbal forklaring.
Avatar billede hjalten5 Nybegynder
10. juni 2003 - 17:33 #10
Jeg har sendt dig en mail med metoden som jeg har lavet den. Den virker kun halvt. Kan du se hvad jeg mangler at referere til?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester