DATASTRUCTUREN VOOR GESORTEERDE DATA

Vergelijkbare documenten
Datastructuren Uitwerking jan

Algoritmiek. 15 februari Grafen en bomen

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011

Datastructuren; (Zoek)bomen

Doorzoeken van grafen. Algoritmiek

Elementary Data Structures 3

Tweede college algoritmiek. 12 februari Grafen en bomen

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen

Datastructuren en Algoritmen voor CKI

Inleiding Programmeren 2

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Datastructuren en algoritmen voor CKI

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Java Programma structuur

Vierde college complexiteit. 14 februari Beslissingsbomen

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

Inleiding Programmeren 2

Datastructuren: stapels, rijen en binaire bomen

Datastructuren en algoritmen voor CKI

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Datastructuren en Algoritmen

Zevende college algoritmiek. 24 maart Verdeel en Heers

Datastructuren en algoritmen voor CKI

Een gelinkte lijst in C#

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms

Programmeren in C++ Efficiënte zoekfunctie in een boek

OPDRACHT Opdracht 2.1 Beschrijf in eigen woorden wat het bovenstaande PSD doet.

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

Grafen en netwerken I Datastructuren en doorzoeken. Algoritmiek

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Derde college complexiteit. 7 februari Zoeken

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Datastructuren. Analyse van algoritmen. José Lagerberg. FNWI, UvA. José Lagerberg (FNWI, UvA) Datastructuren 1 / 46

O(1) ZOEKMETHODEN: HASH TECHNIEKEN. Dr. D.P. Huijsmans 24 okt 2012 Universiteit Leiden LIACS

Examen Datastructuren en Algoritmen II

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Examen Datastructuren en Algoritmen II

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep.

Minimum Opspannende Bomen. Algoritmiek

Examen Algoritmen en Datastructuren III

Datastructuren: stapels, rijen en binaire bomen

Lineaire data structuren. Doorlopen van een lijst

Tiende college algoritmiek. 26 april Gretige algoritmen

Opgaven Binair Zoeken en Invarianten Datastructuren, 4 mei 2016, Werkgroep.

Examen Datastructuren en Algoritmen II

Stacks and queues. Hoofdstuk 6

Tentamen Programmeren in C (EE1400)

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Tentamen Programmeren in C (EE1400)

Algoritmen, Datastructuren en Complexiteit ( en ) Uitwerkingen

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ.

DATASTRUCTUREN BACHELOR INFORMATICA

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Recapitulatie: Ongeïnformeerd zoeken. Zoekalgoritmen ( ) College 2: Ongeïnformeerd zoeken. Dynamische breadth-first search

Transcriptie:

15 DATASTRUCTUREN VR GESRTEERDE DATA 11 20 2 3 13 18 25 60 7 12 14 23 1 Dr. D.P. Huijsmans 18 sept 2013 Universiteit Leiden, LIACS

NDERWERPEN 18 SEPT - Tot nu toe rijen/lijsten met beperkte toegang - stack: bovenaan (LIF) - cyclisch array of lijst: vooraan/achteraan (FIF) - linked list implementatie DCLL (zie ADT uitwerkingen) - geheugengebruik beperken: array -> verbonden lijst - geordende lijsten: tussenin - nadeel sortering bij verbonden lijst: (n) zoeken - binary search voordeel sortering -> BST: (logn) 2

MAGNEETBAND ANALGN VR RECRDS (VASTE F VARIABELE LENGTE) In plaats van een serie bytes kan een magneetband ook gedacht worden als een sequentie van records: - van vaste lengte (steeds m bytes/record lezen/schrijven) - van variabele lengte (steeds zoveel bytes lezen totdat ER byte code bereikt is) eor eor eor eor eor - (N) toegang (serieel voor/achteruit) 3

VERGANG MAGNEETBAND NAAR HARDE SCHIJF Magneetband: toegang serieel Harde schijf: opgedeeld in sectoren (typisch veelvoud van 512 bytes elk) die random-access toegankelijk zijn vergang jaren (19)70 4

ADT_SINGLELINKEDRECRDSFILE RANDMACCESS SCHIJFGEHEUGEN In plaats van byte voor byte gaat de I/ met vaste of variabele lengte records (ER) die op het eind een pointer hebben naar het volgende record (NR); Laatste record in de rij bevat als next pointer een NR=EF I/ functie die als bij een byte stream file met als uitwisseleenheid het record (i.p.v. de byte) en beperking tot alleen m records voorwaarts kunnen spoelen record 1 456 2 3 Bloknr nextrec 3 2299 4 16 5 EF 5

ADT_RANDMACCESSFILE RANDMACCESSSCHIJFGEHEUGEN Vaste en ook variabele lengte records kunnen sneller benaderd worden bij een opzet waarin naast de afzonderlijke records een array met record-keys wordt bijgehouden; vanuit dit array kan elk record direkt benaderd worden via de pointer die bij de sleutel(key) opgeslagen wordt. Array van sleutels kan gesorteerd gehouden worden voor snel opzoeken bepaalde key. key 1e blok record 3 4050 7 13 12 20134 18 5 76 6789 6

UITBUITEN VRDELEN GESRTEERDE LIJST DRZEKEN pgeslagen data elementen oplopend op waarde gesorteerd (geindexeerd) Maakt snel zoeken naar aanwezigheid en positie gezochte waarde mogelijk in array Methode binary search (herhaalde tweedeling): Bekijk middelste waarde en vergelijk met gezochte Als gelijk -> klaar return index Als waarde< gezochte bekijk middelste linkerdeel Als waarde > gezochte bekijk middelste rechterdeel Randvoorwaarden: Rij even/oneven aantal midden? stopcriterium 7

BINAIR ZEKEN NAAR GEZCHTE WAARDE IN GESRTEERD ARRAY A[1..N] BS Algoritme: Initieel: Stap=N; index=0; Dir=+1; Herhaal zolang Stap>1; anders return(0): Halveren Stap(grootte) en aanpassen Index: Functie half(stap): Test = : Stap even-> Stap/2, anders (Stap+1)/2 Index=Index+Dir*Stap; Als A[index]= gezochte waarde -> return(index) Richting volgende aanpassing index als nog niet gevonden: Dir=-1; als A[Index]< gezochte waarde Dir=+1 8

GESRTEERD ARRAY ZEK VRBEELD Zoeken naar A[index]= i a b c d e f g h i j k 6 9 i? init ronde1 ronde2 Stap 11 6 3 Index 0 6 9 Test < = Dir 1 1 Return 0 0 9 9

GESRTEERD ARRAY ZEK VRBEELD Zoeken naar A[index]= h a b c d e f g h i j k 6 9 7 8 h? init ronde1 ronde2 ronde3 ronde4 Stap 11 6 3 2 1 Index 0 6 9 7 8 Test < > < = Dir 1 1-1 1 Return 0 0 0 0 8 10

VERBRGEN VERNDERSTELLING BINARY SEARCH P GESRTEERD ARRAY Wat gebeurt er als waardes meermalen voorkomen? Hoe zou je de datastructuur aanpassen zodat alle voorkomens van een bepaalde waarde gerapporteerd kunnen worden? 11

BINAIR ZEKALGRITME P GESRTEERD ARRAY SLUITEND? Zelfs bij veronderstelling dat elke waarde in het array maar 1 maal voorkomt Zelf uitzoeken komende 5 minute (met BS algoritme op volgende slide): Ga na hoe algoritme uitpakt voor gesorteerde array s die maar 1,2 of 3 lang zijn; Kun je in die gevallen waar het mis loopt, het algoritme zo aanpassen dat het in alle gevallen correct werkt? 12

BINAIR ZEKEN NAAR BEPAALDE WAARDE IN GESRTEERD ARRAY A[1..N] BS Algoritme met tekortkomingen: Initieel: Stap=N; index=0; Dir=+1; Herhaal zolang Stap>1; anders return(0): Halveren Stap(grootte) en aanpassen Index: Functie half(stap): Test = : Stap even-> Stap/2, anders (Stap+1)/2 Index=Index+Dir*Stap; Als A[index]= bepaalde waarde -> return(index) Richting volgende aanpassing index als nog niet gevonden: Dir=-1; als A[Index]< bepaalde waarde Dir=+1 13

GESRTEERD ARRAY N=3 VRBEELD a b c 2 1 3? init ronde1 ronde2 ronde2 ronde3 Stap 3 2 1 1 stop Index 0 2 1 of 3 1 of 3 Test <> = <> Dir 1 -+1 -+1 Return 0 0 a of c 0 14

GESRTEERD ARRAY N=2 VRBEELD b 1 c a? init ronde1 ronde2 Stap 2 1 stop Index 0 1 Test < Dir 1-1 Return 0 0 0 c? init ronde1 ronde2 Stap 2 1 stop Index 0 1 Test > Dir 1 1 Return 0 0 0 Element 2 kan niet bezocht worden 15

GESRTEERD ARRAY N=1 VRBEELD b b? init ronde1 Stap 1 stop Index 0 Test Dir 1 Return 0 0 Stopcriterium stap>1 faalt bij n=1 of 2 Voor N=1 kan stap initieel minstens 2 zaak oplossen, Maar voor N=2 blijft 2e element buiten bereik Vooraf test of A[N] voldoet zou dit oplossen, maar duur gezien Extra stap Element niet gevonden! 16

CRRECT BINARY SEARCH ALGRITME VR ELKE N In programming pearls staat een betere aanpak: A[N] gesorteerd array N=[1..Max] Gezocht index van A[i]=target Initieel: low=1,high=max Zolang low<=high (in C++: 0 en Max-1) mid=(low+high)/2 (naar beneden afgerond) Als A[mid]=target return(mid) Anders Als A[mid]<target low=mid+1 Else high=mid-1 Return(0) 17

LAAT NTDEKTE BUG IN BINARY SEARCH ALGRITME Pas laat is nog een mogelijke tekortkoming in dit voorbeeld algoritme ontdekt: De regel: mid=(low+high)/2 kan als mid een 16 of 32 bit Integer mogelijk leiden tot overflow bij de bewerking low+high; plossing: een echt voor alle gevallen correct algoritme zou mid als volgt kunnen bepalen: f mid=low/2+high/2 of f mid=low + (high-low)/2 (nog efficienter) 18

CRRECT BINARY SEARCH ALGRITME VR ALLE N [1..MAX] VRBEELD a b c d e f g h i j k l m n o m? initieel ronde1 ronde2 ronde3 ronde4 Mid 8 12 14 13 Test < < > = Low 1 9 13 13 High 15 15 15 13 return 0 0 0 0 13 8 12 13 14 19 PAUZE

BINARY SEARCH ZEKEN BIJ EEN GESCHIKTE VERBNDEN STRUCTUUR Nadeel enkel- of dubbel-verbonden lijsten met gesorteerde rij elementen Geen binary search mogelijk Alternatieve opzet voor met pointers verbonden gesorteerde elementen Een twee-deel element met pointers 20

BINAIRE ZEK BM (KNP STRUCTUUR) uder knoop met maximaal 1 voorouder en maximaal 2 kinder knopen Als eenzijdig verbonden structuur: Kind-links pointer Als tweezijdig verbonden structuur: Kind-links pointer uder waarde Kind-van pointer uder waarde Leeg knoop element Kind-rechts pointer Kind-rechts pointer root-element Verbinding: edge link arc uder waarde: key:datarecord nil pointer nil pointer nil pointer nil waarde nil pointer Kindlinks pointer key Kindrechts pointer 21

BINARY SEARCH TREE UDER KNP MET 2 KINDER KNPEN (L&R) V EN 1 VRUDERKNP Dit is eigenlijk de informatie nodig in 1 knoop nil L R Door samen delen van gerichte pointers kan een ongerichte binaire boom structuur worden opgebouwd die zowel van boven naar beneden, van beneden naar boven en langs een willekeurig pad doorlopen kan worden 22

VEREENVUDIGDE GRAFISCHE VRSTELLING KNP IN BST Voorouder pointer niet apart nodig als adres voorouder op stack gezet wordt L R L Pointer naar root geeft start boomstructuur aan W R L R Bouwstenen zonder weergave nil pointers; voorouder pointer en richting pointer 23

PADEN IN EEN BM Knoop zonder voorouder is root (wortel) Knoop met als kinderen nil pointers is leaf (blad) Geordende Boom: kindknopen in bepaalde volgorde (van L naar R b.v.) Simpel pad: verbinding tussen root en leaf waarbij een verbinding maar 1 maal gebruikt wordt Lengte van het pad: Aantal knopen langs pad Hoogte (height) van een Tree: Aantal knopen in langste simpel pad Niveau (level) van een Tree: Knopen op zelfde simpel pad afstand van wortel 24

HANDIGE AFLPVLGRDES BST BMEN Paden waarin elke knoop precies 1 maal opgenomen wordt ook al wordt hij vaker gepasseerd: uders gaan voor; niveau voor niveau geordend (breadth first): m.b.v. FIF lijst Kinderen gaan voor (depth first) m.b.v. stack: Preorder: LR Inorder:LR voor gesorteerde lijst in BST Postorder:LR 1 2 3 L R L R L R 25 2 3 1 3 1 2

BST TEVEGEN KNP MET WAARDE KEY Mogelijke beginsituaties na zoeken invoegpositie (currentknoop): Lege boom: creëer een (root)knoop met waarde key; pointers naar kinderen nil, rootpointer van nil -> (root)knoop. Moet in linker subtree van current knoop: creëer nieuwe knoop waarvan key de waarde wordt; linkerpointer currentknoop -> nieuwe knoop; nieuwe knoop met overname van linkerpointer current knoop en nil pointer rechter; currentknoop-> nieuwe knoop Moet in rechter subtree van currentknoop: analoog aan linker toevoeging 26

BST: RT F LEAF LINKS INVEGEN BIJ CURRENT KNP Voor: Na: L R L R 27

BST: NIET RT/LEAF INVEGING LINKS INVEGEN MET LEGE RECHTER L? L? L??? L? 28

BST: RECHTS INVEGEN BIJ CURRENT KNP Voor: Na: R L L R 29

BST: WEGHALEN WAARDE AAN BEGIN/EIND Weglaten van een waarde in een BST zou kunnen gebeuren door de opgeslagen waarde in een knoop op nil te zetten Als we ook een knoop weg willen halen uit de BST dan moeten we de volgende gevallen onderscheiden: BST is leeg -> niets doen BST alleen een root knoop, delete root knoop, zet BST pointer naar nil, size -> 0 Knoop is leaf (nil pointers als kinderen): knoop daarboven die hier naar toe wees-> nil 30

BST WEGHALEN WAARDE NDERWEG Delete is alleen makkelijk als de weg te halen waarde in een knoop zit met alleen een linker of een rechter subtree: Voor: Na: L? L?? L? L?? 31??

BST: DELETE KNP MET 2 SUBTREES Als er onder een weg te halen knoop twee subtrees hangen kan maar 1 ervan makkelijk 1 nivo naar boven opschuiven; wat te doen met de elementen in de overblijvende subtree? plossing1: verhuis waardes binnen boom plossing 2: loop de resterende subtree af en voeg elk van z n knoopwaardes 1 voor 1 aan de BST toe plossing 3: merge de 2 resterende bomen 32

BST: DELETE RT KNP W Net zo lastig en vergelijkbaar is de situatie in een goed gevulde gebalanceerde boom waarin we de root knoop willen weghalen. plossing: kopieer meest rechtse element in linker subtree naar root en delete de knoop waarin mre oorspronkelijk stond? L? mre? L 33?

MGELIJKE BINAIRE BM PSLAG VRBEELD UITWERKEN a b c d e f g h i j k Hoe ziet de BST eruit bij de volgende Invoegvolgorde: f,c,i,b,d,h,j,a,e,g,k? 34

MGELIJKE BINAIRE BM PSLAG VRBEELD a b c d e f g h i j k f c i b d h j a e g k Gebalanceerde BST: Invoegvolgorde: f,c,i,b,d,h,j,a,e,g,k Zoeken hierin bijna (logn) 35

MGELIJKE BINAIRE BM PSLAG VRBEELD UITWERKEN a b c d e f g h i j k Hoe ziet de BST eruit bij de volgende Invoegvolgorde: a,b,c,d,e,f,g,h,i,j,k? 36

NGEBALANCEERDE PSLAG IN BST VERGELIJKBAAR MET GESRTEERDE ENKEL VERBNDEN LIJST a b c d e f g h i j k a b c d e f g Dit resultaat heet ook wel backbone structuur (komt terug!) 37 Invoegvolgorde: a,b,c,d,e,f,g,h,i,j,k Zoeken hierin (N) h i j k

AANTAL TWEEDELINGEN EN AANTAL KNPEN IN VLLE BST Wortel (root): n=1 knoop (niveau h=1) 1 tweedeling: n=3 knopen (niveau h=2): 1+2 2 tweedelingen: n=7 knopen (niveau h=3): 1+2+4.. h-1 tweedelingen: n=2 h -1 knopen (niveau h=log 2 (n+1)) 38

GESRTEERD EN GEBALANCEERD HUDEN Zaak is algoritmes voor BST zo te ontwerpen dat: Afloopvolgorde en sortering samenvallen De boom zo gebalanceerd mogelijk blijft: Bij opbouw van de BST Bij wijzigingen op de BST 39

BST PBUWEN VANUIT GESRTEERD ARRAY Een goed gebalanceerde BST kan makkelijk worden opgebouwd als de waardes vooraf bekend zijn Zet de waardes in een array Sorteer het array Voeg elementen aan de BST toe door het gesorteerde array recursief met binair zoekadressering te doorlopen a b c d e f g h i j k l m n o 1 2 9 3 6 10 13 4 5 7 8 11 12 14 15 40

DRZDEK VER BST Binary Search Tree H6.1, H6.2, H6.3 41