210 likes | 307 Vues
Øvingsforelesning 2. Trær og søking i dem, samt litt diverse emner Kristian Veøy veoy@stud.ntnu.no. Øvingsgrupper. 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. Kø og stack. Kø:
E N D
Øvingsforelesning 2 Trær og søking i dem, samt litt diverse emner Kristian Veøy veoy@stud.ntnu.no
Øvingsgrupper • 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
Kø og stack • Kø: • Førstemann inn er førstemann ut • Kassakø • Stack: • Sistemann inn er førstemann ut • Stabel med ark • Begge to har operasjonene pop og push • Pop henter neste element • Push legger på et nytt element
Rekursjon • En funksjon som kaller seg selv • Må ha et grunntilfelle for ikke å kjøre evig
Trær Rot R B og C’s Foreldre-node Kanter Noder H A D Løvnoder B C F G A’s venstre barn A’s høyre barn Søskennoder
Trær • Hver node har 0 eller flere barne-noder • 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
Oppbygging Variant 1: Noden har kjennskap til: • Foreldrenoden • Alle barnenodene Greit når man vet hvor mange barn en node kan ha
Oppbygging 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.
Bredde først søk (bfs) • Søk i tre der man besøker noder med økende avstand fra roten • Implementeres med kø: • Putt rotnoden i kø • Så lenge køen ikke er tom: • Pop node fra køen • Push alle barna på køen
Dybde først søk (dfs) • Søk i tre der man rekursivt besøker neste barnenode • Om noden ikke har noen barn, returner til forelder
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
Preorder, inorder og postorder traversering • 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
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
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.
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
Rotasjon A 13 • 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. 7 30 B C 18 41 50 B 30 A 13 41 7 18 50 C (Røde kanter er endret)
B-trær • Et balansert 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 20 25 7 9 12
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
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 testsett 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)
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
Øvinger • Teoriøving • På sporet av sprengstoff • Redd Ratatosk