De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

1 Datastructuren Zoekbomen Deel 1 Bomen Doorlopen Eenvoudiger operaties.

Verwante presentaties


Presentatie over: "1 Datastructuren Zoekbomen Deel 1 Bomen Doorlopen Eenvoudiger operaties."— Transcript van de presentatie:

1 1 Datastructuren Zoekbomen Deel 1 Bomen Doorlopen Eenvoudiger operaties

2 2 Dit onderwerp  Bomen: terminologie  Bomen: datastructuur voor bomen  Zoekbomen: hoe zoek ik in bomen  Volgende keer: hoe voeg ik knopen toe en haal ik knopen weg uit zoekbomen (efficient)

3 3 Terminologie I  Gewortelde boom (rooted tree)  Knopen van boom: node  Wortel (root)  Voorouder (ancestor)  Knoop op pad van x (inclusief) naar wortel  Afstammeling (descendant)  Proper ancestor; proper descendant  Voorouder of afstammeling maar niet x zelf  Ouder (parent)  Kind (child)

4 4 Terminologie II  Sibling: knopen met dezelfde ouder (broers)  Blad (leaf)  Interne knoop (internal node) a b d f e c g Vb van siblings

5 5 Terminologie III: graad  De graad van een knoop is het aantal kinderen  NB: Anders dan in grafen!!  Vb. hiernaast  Knoop is blad, desd als graad

6 6 Terminologie IV: hoogte en diepte  Diepte (depth): lengte van pad van x naar de wortel  Hoogte (height): maximum lengte van pad van knoop naar een blad onder de knoop dieptes hoogtes

7 7 Terminologie V: Geordende boom  Gewortelde boom met voor elke knoop een volgorde van zijn kinderen vastgelegd

8 8 Terminologie VI: Deelboom geworteld bij x  De deelboom geworteld bij x (subtree rooted at x) x

9 9 Binaire bomen  Een boom is een binaire boom, als  De boom leeg is (0 knopen heeft), OF  Een wortel en een linkerdeelboom en rechter- deelboom heeft Die linker- en rechter-deelboom zijn weer binair Ze mogen dus ook leeg zijn Verschillende binaire bomen!

10 10 Twee manieren om binaire bomen te tekenen

11 11 Datastructuren voor gewortelde bomen  Nu bespreken we:  Datastructuur voor binaire bomen  Datastructuren voor gewortelde bomen met willekeurige graad  We zagen al eerder een andere: heap  Heeft speciale eigenschappen die maken dat we ‘m makkelijk in een array kunnen stoppen  (Max- of Min-)Heap-eigenschap

12 12 Gewortelde bomen  Elke knoop x heeft drie pointers:  Naar de ouder Notatie: p[x], of p.x of parent.x of …  Naar de linkerdeelboom (eventueel leeg) left-child  Naar de rechterdeelboom (eventueel leeg) right-child  Implementatie van leeg (hangt af van programmeertaal en wat je handig vindt): NIL  En we hebben een verwijzing naar de wortel van de boom  root[T] of wortel.T of root.T of … root[T] p leftright

13 13 Datastructuur voor bomen met willekeurig aantal kinderen  Elke knoop heeft:  Pointer voor de wortel  Gelinkte lijst per kind (boek: enkelvoudig gelinkt. Soms nuttig om dubbelgelinkte lijst te maken)  Pointer naar eerste kind  Namen: p (parent, ouder) left-child right-sibling (rechterbroer / rechterzus)

14 14 Dynamische verzamelingen: Zoekbomen  Zoekboom: Datastructuur voor Dynamische verzamelingen (bijv. Dictionaries)  Operaties die we kunnen doen op verzameling elementen:  Search (zoek element op key-waarde, en geef opgeslagen extra informatie)  Minimum (wat is de kleinste key-waarde)  Maximum (…)  Predecessor (Voorganger: gegeven x, wat is de grootste yx die opgeslagen is)  Delete (laat een key (met de extra informatie erbij) weg)  Insert (voeg een key (en extra informatie) toe)

15 15 Verschillende implementaties  Als we “Predecessor” en “Successor” niet belangrijk vinden, is een Hash-tabel een heel goede, en heel veel gebruikte datastructuur  Vandaag bekijken we de binaire zoekboom  Wordt ook veel gebruikt

16 16 Binaire zoekboom  Wortel bevat een key (met pointer naar bijbehorend object met extra gegevens …)  Linker deelboom bevat alleen kleinere () keys  Rechter deelboom bevat alleen grotere () keys  Soms sta je toe dat een key vaker voorkomt, soms niet

17 17 Binaire zoekboom  Je kan ook de NIL’s tekenen

18 18 Binairy search-tree property  Als x een knoop is in een binaire zoekboom, en y is een knoop in de linkerdeelboom van x, dan is key[y]  key[x].  Als x een knoop is in een binaire zoekboom, en y is een knoop in de rechterdeelboom van x, dan is key[x]  key[y]

19 19 Doorlopen van binaire boom  Drie manieren om een binaire boom te doorlopen:  Inorder Som eerst de linkerboom op (recursief) Dan de wortel Dan de rechterboom (recursief)  Preorder Som eerst de wortel op Dan de linkerboom (recursief) Dan de rechterboom (recursief)  Postorder Som eerst de linkerboom (recursief) Dan de rechterboom (recursief) En tot slot de wortel op

20 20 Inorder-Tree-Walk(x)  if (x != NIL)  then  Inorder-Tree-Walk( left(x))  Print (key(x))  Inorder-Tree-Walk( right(x))

21 21 Preorder-Tree-Walk(x)  if (x != NIL)  then  Print (key(x))  Preorder-Tree-Walk( left(x))  Preorder-Tree-Walk( right(x))

22 22 Postorder-Tree-Walk(x)  if (x != NIL)  then  Postorder-Tree-Walk( left(x))  Postorder-Tree-Walk( right(x))  Print (key(x))

23 23 Eigenschappen Inorder-Tree-Walk  Somt van een binaire zoekboom de knopen op in niet-dalende volgorde  Gebruikt (n) tijd op als we n knopen hebben  Stel dat we k knopen in de linkerboom hebben  Dan n-k-1 in de rechterboom  T(n) = T(k) + T(n-k-1) + d voor constante d  Geeft: T(n) = (c+d)n+c met c=T(0) (inductie)

24 24 Expressies en notatie  Gebruikelijke notatie voor expressies:  (1+2)*(3*(4/5))  Infix-notatie * + * /

25 25 Expressies en notatie II  Infix:  (1+2)*(3*(4/5))  Reverse Polish Notation  Postfix-notatie:  / * *  Geen haakjes nodig  Uitgevonden door Poolse wiskundige Lukasiewicz  Stack om e.e.a. uit te rekenen * + * /

26 26 Zoeken in binaire boom  Als de key in de wortel zit: klaar  Anders: kijk of je in de linker- of rechter- deelboom moet zijn en ga in die boom in recursie Tree-Search(x,k) {Zoek naar key k in een boom met wortel x}  if (x == NIL or k == key(x))  then return x  if ( k < key(x))  then return Tree-Search(left(x),k)  else return Tree-Search(right(x),k)

27 27 Zoeken in binaire boom Tree-Search(x,k) {Zoek naar key k in een boom met wortel x}  if (x == NIL or k == key(x))  then return x  if ( k < key(x))  then return Tree-Search(left(x),k)  else return Tree-Search(right(x),k)

28 28 Niet-recursieve (uitgerolde) versie Iterative-Tree-Search(x,k)  while ( x != NIL and k != key(x)) do  if ( k < key(x))  then x = left(x)  else x = right(x)  return x; Doet hetzelfde, maar zonder recursie Meestal efficienter (in constante in O)

29 29 Tijd van Tree-Search  Zowel recursieve als iteratieve versie gebruiken O(h) tijd, met h de hoogte van de boom  Later: manieren om h = O(log n) te krijgen

30 30 Zoeken van Minimum  Het minimum is altijd de “meest linkse” knoop  Sorry, geen grapjes over politiek hier Tree-Minimum(x)  {Zoek het minimum in de boom met wortel x}  while (left(x) != NIL) do  x = left(x);  return x;

31 31 Zoeken van Minimum Tree-Minimum(x)  {Zoek het minimum in de boom met wortel x}  while (left(x) != NIL) do  x = left(x);  return x; Tijd: O(h) – h hoogte van de boom

32 32 Zoeken van Maximum Tree-Maximum(x)  {Zoek het minimum in de boom met wortel x}  while (right(x) != NIL) do  x = right(x);  return x; Maximum is meest rechtse knoop Tijd: O(h) met h hoogte van de boom Maximum is meest rechtse knoop Tijd: O(h) met h hoogte van de boom

33 33 Opvolger  Opvolger van key x:  Kleinste van alle andere keys die groter is dan x  Twee gevallen:  De opvolger zit “onder” x  De opvolger zit niet onder x

34 34 Opvolger  Opvolger van key x:  Kleinste van alle andere keys die groter is dan x  Twee gevallen:  De opvolger zit “onder” x Als de rechterdeelboom van x niet leeg is!  De opvolger zit niet onder x Als de rechterdeelboom van x wel leeg is…

35 35 Opvolgers en voorgangers I  Opvolger van knoop x: 1. Als de rechter- deelboom van x niet leeg is, dan is de opvolger van x het minimum van die rechter-deelboom 2. Als die wel leeg is dan zit die opvolger NIET onder x … Tree-Successor(x)  if (right(x) != NIL)  then return Tree- Minimum(right(x))  y = parent(x);  ???

36 36 Opvolger die niet onder x zit  Stel x heeft lege rechter-deelboom  Ga omhoog de boom in, zolang je in rechterdeelbomen zit  Dus je gaat “links- omhoog”  Daarna ga je nog 1 keer een stap omhoog Tree-Successor(x)  if (right(x) != NIL)  then return Tree- Minimum(right(x))  y = parent(x);  while (y != NIL and x == right(y)) do  x = y;  y = parent(y);  return y;

37 37 Tree-successor Tree-Successor(x)  if (right(x) != NIL)  then return Tree- Minimum(right(x))  y = parent(x);  while (y != NIL and x == right(y)) do  x = y;  y = parent(y);  return y; Zoek bijv opvolger 29

38 38 Voorgangers  Vinden van voorganger (Tree-predecessor) gaat net zo (“gespiegeld”)

39 39 Conclusies  Alle operaties: Search, Minimum, Maximum, Successor, Predecessor kunnen in O(h) met h de hoogte van de boom  Er bestaan zoekbomen met hoogte O(lg n), bijvoorbeeld neem een complete (of bijna complete) binaire boom

40 40 Samenvatting  Terminologie  Zoekbomen  Operaties op zoekbomen  Volgende keren: hoe voeg je knopen toe, en laat je knopen weg uit zoekbomen?  En hoe zorg je dat een zoekboom lage diepte blijft houden?


Download ppt "1 Datastructuren Zoekbomen Deel 1 Bomen Doorlopen Eenvoudiger operaties."

Verwante presentaties


Ads door Google