Algoritmiek. 15 februari Grafen en bomen

Vergelijkbare documenten
Tweede college algoritmiek. 12 februari Grafen en bomen

Datastructuren: stapels, rijen en binaire bomen

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

Eerste college algoritmiek. 5 februari Introductie

Algoritmiek. 2 februari Introductie

Datastructuren: stapels, rijen en binaire bomen

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen. deel 2. Tiende college

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify

Bomen. 8.8 ongerichte bomen 9.4 gerichte bomen ch 10. binaire bomen. deel 1. Negende college

Twaalfde college algoritmiek. 23 mei Branch & Bound, Heapsort

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

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

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Zevende college Algoritmiek. 6 april Verdeel en Heers

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Zevende college algoritmiek. 24 maart Verdeel en Heers

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Elfde college algoritmiek. 10 mei Algoritme van Dijkstra, Gretige Algoritmen

V = {a, b, c, d, e} Computernetwerken: de knopen zijn machines in het netwerk, de kanten zijn communicatiekanalen.

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Tiende college algoritmiek. 13/21 april Gretige Algoritmen Algoritme van Dijkstra

ALGORITMIEK: antwoorden werkcollege 5

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.

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

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

Doorzoeken van grafen. Algoritmiek

definities recursieve datastructuren college 13 plaatjes soorten Graph = ( V, E ) V vertices, nodes, objecten, knopen, punten

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

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Datastructuren en algoritmen voor CKI

Achtste college complexiteit. 2 april Polynoomevaluatie Matrixvermenigvuldiging Euler- en Hamiltonkringen

8C080 deel BioModeling en bioinformatica

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep.

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Derde college algoritmiek. 18 februari Toestand-actie-ruimte

Vijfde college algoritmiek. 17 maart Exhaustive search Graafwandelingen Backtracking

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

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

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Derde college algoritmiek. 23 februari Toestand-actie-ruimte

Grafen en netwerken I Datastructuren en doorzoeken. Algoritmiek

Datastructuren Uitwerking jan

Elementary Data Structures 3

Derde college algoritmiek. 23 februari Complexiteit Toestand-actie-ruimte

Derde college algoritmiek. 22 februari Complexiteit Toestand-actie-ruimte

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

2WO12: Optimalisering in Netwerken

Vierde college algoritmiek. 23/24 februari Complexiteit en Brute Force

Vijfde college algoritmiek. 9 maart Brute Force. Exhaustive search

Java Programma structuur

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

Het omzetten van reguliere expressies naar eindige automaten, zie de vakken Fundamentele Informatica 1 en 2.

Vierde college complexiteit. 14 februari Beslissingsbomen

TW2020 Optimalisering

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

8C080 deel BioModeling en bioinformatica

Tentamen Programmeren in C (EE1400)

Zesde college algoritmiek. 22 maart Backtracking

Tiende college algoritmiek. 26 april Gretige algoritmen

De volgende opgave gaat over de B-bomen van het college, waar sleutels zowel in de bladeren als ook in de interne knopen opgeslagen worden.

TW2020 Optimalisering

Algoritmen, Datastructuren en Complexiteit ( en ) Uitwerkingen

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

Over binaire beslissingsdiagrammen naar Donald E. Knuth s The Art of Computer Programming, Volume 4

Datastructuren; (Zoek)bomen

Grafen deel 1. Zesde college

Datastructuren Uitwerking jan

Tentamen Programmeren in C (EE1400)

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

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

5.4.2 a. Neen: dit lukt alléén met 1, 3, 7 enzovoort. b. Ja: dit lukt met elk aantal knopen! Bijvoorbeeld de volgende boom: 1

Zesde college algoritmiek. 23 maart Backtracking. Verdeel en Heers

Vierde college algoritmiek. 1 maart Toestand-actie-ruimte Brute Force

Algoritmen, Datastructuren en Complexiteit (214020/5)

Zevende college complexiteit. 7 maart Mergesort, Ondergrens sorteren (Quicksort)

Zesde college algoritmiek. 9/10 maart Backtracking. Verdeel en Heers

Derde college algoritmiek. 16/17 februari Toestand-actie-ruimte

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Schriftelijk tentamen Datastructuren Woe 5 jan uur Met uitwerkingen

Modelleren en Programmeren

Grafen deel 2 8/9. Zesde college

software constructie recursieve datastructuren college 15 5 stappen plan ontwerpen de software bestaat uiteindelijk uit datatypen functies

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

2 Recurrente betrekkingen

Tiende college algoritmiek. 14 april Gretige algoritmen

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

DATASTRUCTUREN. najaar leesboek. R. van Vliet. H.J. Hoogeboom. Opleiding Informatica. Universiteit Leiden

De symmetrische min-max heap

Elfde college algoritmiek. 16 mei Dijkstra, Gretige algoritmen en Branch & Bound

Hoofdstuk 2. Week 4: Datastructuren. 2.1 Leesopdracht. 2.2 Bomen. 2.3 Definitie

public boolean egualdates() post: returns true i f f there i f the l i s t contains at least two BirthDay objects with the same daynumber

Transcriptie:

Algoritmiek 15 februari 2019 Grafen en bomen 1

Grafen (herhaling) Een graaf G wordt gedefinieerd als een paar (V,E), waarbij V een eindige verzameling is van knopen (vertices) en E een verzameling van paren van knopen: de takken/pijlen (edges). Een tak/pijl (u, v) verbindt de knopen u en v met elkaar. Terminologie: - ongerichte/gerichte graaf - gewogen graaf - paden en cykels/kringen - samenhangend - acyclisch 2

Voorbeelden 0 1 2 5 4 3 1. V = {0,1,2,3,4,5}; E = {(0,1),(1,2),(2,3),(3,4),(4,5),(5,0),(4,1)} 0 1 2 5 4 3 2. V = {0,1,2,3,4,5}; E = {(0,1),(2,1),(2,3),(4,3),(5,4),(5,0),(4,1),(1,4)} 0 5 1 7 1 4 3 2 2 3. V = {0,1,2,3}; E = {(0,1),(1,2),(2,3),(0,3),(1,3)} 3

Paden en kringen en... Een pad van u naar v is een rij knopen waarvoor geldt dat tussen elk tweetal opeenvolgende knopen uit die rij een tak zit (resp. een pijl loopt van de ene naar de volgende knoop; dan: gericht pad). Lengte van een pad = aantal takken op dat pad = aantal knopen - 1. Als alle knopen verschillend zijn heet het pad enkelvoudig. Een kring in een ongerichte graaf is een pad met minstens 3 knopen, dat begint en eindigt in dezelfde knoop en dat geen enkele tak meer dan één keer bevat. Analoog gerichte graaf. Een ongerichte graaf heet samenhangend als er tussen elk tweetal knopen u en v een pad loopt. Een graaf die geen kringen bevat heet acyclisch. 4

Graafproblemen Twee zeer bekende graafproblemen: Koningsberger bruggen probleem Vierkleurenprobleem Hoezo graafproblemen? 5

Eulerkring Definitie: een wandeling (pad) in een ongerichte graaf die terugkeert in zijn beginpunt en die alle takken precies één keer doorloopt heet een Eulerkring. Analoog: Eulerpad. Probleem. Gegeven een ongerichte graaf G. Heeft G een Eulerkring? Voorbeeld: 2 6 3 5 1 7 4 Voor deze graaf is 1 2 3 4 5 3 7 5 6 7 2 6 1 een Eulerkring. Een kring is een pad met minstens 3 knopen dat begint en eindigt in dezelfde knoop en dat geen enkele tak meer dan één keer doorloopt. 6

Vierkleurenprobleem Kleur de landkaart met maximaal vier kleuren onder de restrictie dat buurlanden een verschillende kleur hebben: 7

Vierkleurenprobleem Kleuring van de landkaart met maximaal vier kleuren onder de restrictie dat buurlanden een verschillende kleur hebben: 8

Representaties Adjacency matrix: de gerichte graaf wordt gerepresenteerd door een tweedimensionaal array int graaf[n][n] (n het aantal knopen), waarbij graaf[i][j] aangeeft of er een pijl van i naar j gaat. Adjacency list: de gerichte graaf wordt gerepresenteerd door een eendimensionaal array buur* graaf[n] (n het aantal knopen), waarbij graaf[i] de ingang is tot een lijst van knopen waarvoor er een pijl is van i naar die knoop. De buurlijst bevat dus alle uitgaande pijlen uit i. Adjacency list representatie in C ++ : class buur { public: int knoopnummer; buur* volgende; }; // buur buur* graaf[n]; 9

Gericht Adjacency matrix en adjacency list voor voorbeeldgraaf 2: 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 adjacency matrix 0 1 2 5 4 3 0 1 2 3 4 5 Λ 1 4 1 1 0 Λ Λ 3 3 4 Λ Λ Λ adjacency list 10

Opgave 9. Geef een algoritme dat de pijl (i,j) in een gegeven gerichte graaf omdraait. // het array graaf (buur* graaf[n]) bevat de gerichte graaf buur* hulp = graaf[i]; buur* vorige = NULL; while ( hulp->knoopnummer!= j ) { vorige = hulp; hulp = hulp->volgende; } // knoop j zoeken if ( vorige == NULL ) { // j is eerste buur van i graaf[i] = hulp->volgende; } else { // j is niet eerste buur van i vorige->volgende = hulp->volgende; // haal buur j uit lijst } delete hulp; // gooi buur j weg hulp = new buur; hulp->knoopnummer = i; hulp->volgende = graaf[j]; graaf[j] = hulp; // voeg nu i vooraan in de buurlijst // van j toe 11

Bomen Definitie: een boom is een samenhangende (= uit één stuk bestaande) ongerichte graaf zonder cykels (= kringen). Wijs een speciale knoop aan, de wortel. Teken de wortel bovenaan en alle paden vanuit de wortel naar beneden: dit geeft een hiërarchische structuur die lijkt op een stamboom. Dit heet ook wel een georiënteerde boom. Meestal spreken we gewoon van een boom. Stamboomterminologie: kind ouder, afstammeling voorouder. In een georiënteerde boom hebben we dus ouder-kind relaties tussen knopen. 12

Voorbeeldboom Terminologie: takken, knopen, nivo, hoogte, wortel, bladeren interne knopen wortel A S D F G H J K L Z X C V B N M bladeren De wortel (hier A) is de enige ingang tot de boom. 13

Meer bomen Een acyclische graaf die niet samenhangend is heet een bos. Het is namelijk een collectie bomen. Voor bomen geldt: aantal takken = aantal knopen - 1. Een geordende boom is een boom waarin van elke knoop de kinderen geordend zijn: oudste kind, een na oudste kind,..., jongste kind. Onderstaande bomen zijn als georiënteerde bomen wel gelijk, maar als geordende georiënteerde bomen niet: 14

Binaire bomen Een binaire boom is een boom waarin elke knoop ofwel nul, ofwel één ofwel twee kinderen heeft; als een knoop twee kinderen heeft dan is het ene kind het linkerkind, het andere het rechterkind; als een knoop één kind heeft, dan is dit ofwel een linkerkind, ofwel een rechterkind.. linkerkind rechterkind. één kind: rechterkind 15

Binaire bomen: recursief Recursieve definitie: een binaire boom is een eindige verzameling knopen die ofwel leeg is, ofwel bestaat uit een speciale knoop (de wortel) en twee disjuncte verzamelingen knopen die samen de rest van alle knopen vormen. Die knoopverzamelingen vormen beide ook weer een binaire boom: de linkersubboom en de rechtersubboom. wortel linkersubboom rechtersubboom 16

Implementatie class knoop { // een struct mag ook public: knoop ( ) { // constructor info = 0; links = NULL; rechts = NULL; } int info; knoop* links; knoop* rechts; }; // knoop De binaire boom wordt gerepresenteerd door middel van een pointer naar de wortel: knoop* wortel; // de ingang tot de binaire boom Netter om een klasse te gebruiken: zie Programmeermethoden 17

Wandelingen -1- WLR (preorde): bezoek wortel doorloop linkersubboom WLR doorloop rechtersubboom WLR LWR (symmetrisch): doorloop linkersubboom LWR bezoek wortel doorloop rechtersubboom LWR 1 2 3 5 4 7 6 9 8 LRW (postorde): analoog 18

Wandelingen -2- void preorde (knoop* root) { if ( root!= NULL ) { cout << root->info << endl; preorde (root->links); preorde (root->rechts); } // if } // preorde void symmetrisch (knoop* root) { if ( root!= NULL ) { symmetrisch (root->links); cout << root->info << endl; symmetrisch (root->rechts); } // if } // symmetrisch 19

Werking recursie 1. void preorde (knoop* root) { 2. if ( root!= NULL ) { 3. cout << root->info << endl; 4. preorde (root->links); 5. preorde (root->rechts); 6. } // if 7. } // preorde 20

Knopen tellen We tellen recursief het aantal knopen van een binaire boom met ingang wortel. Aanroep: int tellen = aantal (wortel); int aantal (knoop* root) { if ( root == NULL ) // lege boom return 0; else return ( 1 + aantal (root->links) + aantal (root->rechts) ); } // aantal Merk op dat hier eigenlijk een preorde-wandeling wordt gedaan. 21

Afbreken We breken de binaire boom met ingang wortel helemaal af: hiertoe wordt eerst de linkersubboom (recursief) weggegooid, daarna de rechtersubboom en ten slotte de wortel zelf. Aanroep: breekaf (wortel); void breekaf (knoop* & root) { if ( root!= NULL ) { breekaf (root->links); breekaf (root->rechts); delete root; root = NULL; } // if } // breekaf L R W 22

Meer binaire bomen Voor de hoogte h van een binaire boom met n knopen geldt: log 2 n = log 2 (n+1) 1 h n 1 Een complete binaire boom is een binaire boom waarbij alle nivo s geheel vol zitten, behalve eventueel het onderste. Op het onderste nivo mogen alleen de meest rechter knopen missen. Een binaire zoekboom is een binaire boom waarbij voor elke knoop geldt dat de waarde in die knoop groter is dan alle waarden in zijn linkersubboom, en kleiner dan alle waarden in zijn rechtersubboom. 23

Voorbeelden Complete binaire boom: 9 7 3 8 4 5 7 9 3 8 4 5 Binaire zoekboom: LWR 1 2 3 4 5 6 7 8 9 1 5 7 2 3 4 6 9 8 24

BZboom: zoeken 60 20 80 10 40 70 100 1 15 30 75 5 25 35 25

BZboom: verwijderen 60 20 80 10 40 70 100 1 15 30 75 5 25 35 100 verwijderen = 60 20 80 10 40 70 1 15 30 75 5 25 35 verwijderen van een blad 26

BZboom: verwijderen 60 20 80 10 40 70 1 15 30 75 5 25 35 80 verwijderen = 60 20 70 10 40 75 1 15 30 5 25 35 verwijderen van een knoop met 1 kind 27

BZboom: verwijderen 60 20 70 10 40 75 1 15 30 5 25 35 60 verwijderen = 40 20 70 10 30 75 1 15 5 25 35 verwijderen van een knoop met 2 kinderen verwissel met de grootste kleinere of kleinste grotere 28

Werkcollege Lezen/leren bij dit college: Paragraaf 1.4 (vanaf/na graafrepresentaties) Paragraaf 4.5 (subparagraaf Searching and Insertion in a Binary Search Tree ) Werkcollege: Vanmiddag, 13.30 15.15, bomenpracticum in computerzalen 302-304, 303, 306-308, 307, 309 Opgaven: zie http://www.liacs.leidenuniv.nl/~vlietrvan1/algoritmiek/ Volgend college: 22 februari 2019, 11.00 12.45, De Sitterzaal Eerste programmeeropdracht... 29

MyGalileoApp 30