1 Enkle datastrukturer Lars Greger Nordland Hagen algdat@idi.ntnu.no Introduksjon til øvingsopplegget og gjennomgang av python
2 I dag Stack Kø (queue) Lenkede lister (linked list) Trær Binære søketrær
3 Stack Implementerer Last-In-First-Out (LIFO) Tenk på som en stabel av ting To hovedoperasjoner: push(x) - legge et element x på toppen pop() - ta ut øverste element Kan også lese øverste element
4 Stack i Python Bruk list til å implementere stack. list.append(x) implementerer push(x) list.pop() implementerer pop() list[-1] leser toppen
5 Kø (queue) Implementerer First-In-First-Out (FIFO) Tenk på som en vanlig kø To hovedoperasjoner: enqueue(x) - legge et element bakerst i køen dequeue() - ta ut det første elementet i køen
6 Kø i Python Kan bruke list til å implementere kø. list.append(x) implementerer enqueue(x) list.pop(0) implementerer dequeue() Denne implementasjonen er treg list.pop(0) må flytte alle elementer
7 Kø i Python Bedre å bruke collections.deque Støtter rask innsetting og fjerning i begge ender deque.append(x) implementerer enqueue(x) deque.popleft() implementerer dequeue()
8 Lenket liste (linked list) Består av noder Noder inneholder: Data, kan være hva som helst Peker til neste node
9 Lenket liste i Python Kan implementeres med egen klasse class node: data = None next = None def init (self, data, next = None): self.data = data self.next = next
10 Lenket liste (linked list) Rask innsetting/sletting midt i lista Man må ha en node tilgjengelig for å få til dette Søk etter en node er tregt Traversering av listen går bare en vei Kan bedres ved å lenke begge veier
11 Dobbelt lenket liste i Python Kan implementeres med egen klasse class node: data = None next = None prev = None def init (self, data, next = None, prev = None): self.data = data self.next = next self.prev = prev
12 Trær Består også av noder Noder består av: Data, kan være hva som helst Pekere til barn (Pekere til søsken)
13 Binære Trær Alle noder har maks to barn Enkel representasjon
14 Traversering av trær Postorder traversering Traverser først over alle barna Så gjør noe med noden Preorder traversering Gjør noe med noden Traverser over alle barna Inorder traversering (kun for binære trær) Gjør noe med venstre barn Gjør noe med denne noden Gjør noe med høyre barn
15 Traversering av binære trær class TreeNode: data = None left = None right = None def init (self, data, left = None, right = None): self.data = data self.left = left self.right = right
16 Postorder def print_post(node): if node.left: print_post(node.left) if node.right: print_post(node.right) print node.data,
17 Preorder def print_pre(node): print node.data, if node.left: print_pre(node.left) if node.right: print_pre(node.right)
18 Inorder def print_in(node) if node.left: print_in(node.left) print node.data, if node.right: print_in(node.right)
19 Binære søketrær Binære trær Treet med venstre barn som rot kaller vi venstre subtre Treet med høyre barn som rot kaller vi høyre subtre Binære søketrær har egenskapene: Data hver node kan sammenlignes med hverandre Alle data i venstre subtre er mindre enn data i rotnoden Alle data i høyre subtre er mindre enn data i rotnoden Treet i kodeeksemplet var et binært søketre
20 Søke i søketrær Vil finne element x i søketreet For hver node: Sammenlign node.data med x Hvis x = node.data Ferdig, finnes! Hvis x < node.data Hvis node.left = None Ferdig, finnes ikke! Ellers Let i node.left Tilsvarende hvis x > node.data
21 Sette inn i søketrær Søk etter elementet i søketreet Hvis det ikke finnes Sett det inn der det burde finnes Hvis det finnes Ferdig, med mindre du vil ha duplikater
22 Slette i søketrær Mer avansert enn innsetting Sletting av løvnoder er enkelt Sletting av interne noder mer komplisert Må opprettholde søketre-egenskapene Vil endre på minst mulig Konkret implementasjon tar vi senere
23 Høyde på subtrær Binære søketrær veldig effektive når høyden er logaritmisk Kan bli lineære i verste fall Finnes ting man kan gjøre for å garantere logaritmisk høyde Det tar vi en annen dag.
24 Øving 1 Skal traversere gjennom lenket liste Holde orden på maks-verdi Spørsmål?