Laste ned presentasjonen
Presentasjon lastes. Vennligst vent
PublisertLisa Johannessen Endret for 9 år siden
1
TDT4120 Algoritmer og datastrukturer Trær og søking i dem, samt litt diverse emner Kristian Veøy veoy@stud.ntnu.no
2
Øvingsgrupper For dem som føler at de trenger hjelp med faget Grupper på 10-15 studenter møter en undass to timer i uken Vil antageligvis bli satt i gang om halvannen uke Påmelding åpner over helgen (Magnus annonserer fremgangsmåten)
3
Trær Består av sammenkoblede noder. Hver node har 0 eller flere barne-noder. Må være asyklisk. Et tre med n noder har n-1 kanter. Et tre med maks m barn kalles et m-tre. Et spesialtilfelle av dette er 2-treet som kalles et binært tre.
4
Oppbygging Variant 1: Noden har kjennskap til: Foreldrenoden Alle barnenodene. Greit når man vet hvor mange barn en node kan ha. Variant 2: Noden har kjennskap til: Foreldrenoden Venstre barnenode. Nærmeste søsken. Greit når man ikke vet hvor mange barn en node kan ha.
5
Bredde først søk (bfs) Søk i tre der man alltid besøker noder med avstand i fra roten, før man besøker noder med avstand i + 1 Implementeres med kø: Putt rotnoden i kø. Så lenge køen ikke er tom: Pop node fra køen. Putt alle barna på køen.
6
Dybde først søk (dfs) Søk i tre der man alltid besøker neste barnenode. Om noden ikke har noen barn, returner til forelder.
7
Preorder, inorder og postorder traversering Tre marginalt forskjellige utgaver av DFS Ofte er man interessert i å gjøre en bestemt operasjon på nodene man støter på i løpet av DFS Pre-, in- og postorder sier noe om hvilken rekkefølge nodene skal behandles i Preoder: Behandle en node første gang du treffer den Inorder (kun binære trær): Når du treffer en node, sender du først søket videre i venstre barnenode, så behandler du selve noden, så sender du søket videre i høyre barnenode Postorder: Send søket videre i barnenodene først, og behandle selve noden til slutt, rett før du forlater noden
8
Preorder, inorder og postorder traversering Hvordan implementerer vi dette? Søk som startes i en bestemt node utføres ved å starte nye søk på barnenodene – dette er en såkalt rekursiv struktur, så da kan vi benytte rekursjon (du utfører en oppgave ved å utføre den samme oppgaven på en mindre mengde data) Merk: alle traverseringsmetodene implementeres med DFS (og man vil uunngåelig oppdage nodene i prefix-rekkefølge – men man kan velge å behandle nodene i en annen rekkefølge)
9
Operatortrær En måte å representere aritmetiske uttrykk på Inorder-traversering vil skrive ut uttrykket slik vi er vant til å lese matematiske uttrykk Postorder-traversering vil skrive ut uttrykket i reverse Polish notation (RPN) RPN ble brukt i kalkulatorer i gamle dager RPN trenger verken parenteser eller presedens Evaluering av et RPN-uttrykk bruker en stack Tall skal pushes på stacken Operatorer popper de to øverste tallene fra stacken og pusher resultatet
10
Dybde først-søk med stack Her er det lett å gå i fellen ved å prøve å ta koden for bredde først-søk og bare bytte ut køen med en stack Det fungerer i og for seg i trær, men gir gale resultater i en graf Vi må etterligne virkemåten til rekursjonen
11
Binære søketrær Hver node kan ikke ha flere enn 2 barn. Verdien i en node er større enn alle verdiene i venstre subtre, og mindre enn alle verdiene i høyre subtre. Veldig lett å søke, finne minimum/maksimum, eller foregående/etterfølgende verdi.
12
AVL-trær Søketær kan fort bli ubalanserte (f.eks. ved innsetting av sorterte data). Da tar søking lang tid. En måte å ordne dette på er å bruke et AVL-tre: I et AVL-tre vil forskjellen i høyden av venstre sub-tre og høyre sub-tre være -1, 0 eller 1 Etter innsetting/sletting kalles en metode på treet som gjør det balansert igjen.
13
Rotasjon Sentralt i balansering av trær. Venstre-rotering: La node A bli B sitt venstre barn. La node C bli A sitt høyre barn. Høyre-rotering: Symmetrisk av venstre-rotering. Reglene for når rotasjoner skal gjøres er ikke pensum. 13 1841 307 50 13 18 41 30 7 50 A B C A B C (Røde kanter er endret)
14
B-trær Et søketre, men hver node har flere verdier og barn. Holder seg balansert ved innsetting og sletting. Når man legger til en verdi i en node som ikke har plass, splittes den, og forandringen dyttes oppover i treet. 10 15 7 912 20 25
15
Noen tips til debugging Hva gjør man hvis programmet krasjer, henger eller skriver ut feil svar? Programmer som henger kan avbrytes med Ctrl-C, så får man en stacktrace Kilden til feilen er som regel ikke der det krasjer/henger Hvis krasjen skyldes at en bestemt variabel har gal verdi: prøv å spore bakover og se hvor den verdien kommer fra
16
Noen tips til debugging Test hver metode for seg Sjekk at metoden får riktige parametre (kan ikke forvente at en metode gir riktig svar hvis den jobber på gale data) Lag egne datasett og test med dem Gå gjennom programmet på papir Sjekk at du faktisk har implementert algoritmen riktig Kan bruke fancy IDE'er med tilhørende debuggere, men en velplassert print er ofte like bra (dessuten går det raskere)
17
Highscorelista Minner om at det ikke er nødvendig å gjøre det som praksisøvingen foreslår at skal gjøres Skal du høyt opp på lista, må du ofte droppe rammeverket og bruke en annen algoritme Hvis du har sittet og knalloptimalisert python- koden din og fremdeles ikke klarer å klatre på listene, er det et tegn på at du trenger en bedre algoritme
18
Øvinger På sporet av sprengstoff Redd Ratatosk
Liknende presentasjoner
© 2024 SlidePlayer.no Inc.
All rights reserved.