Hoofdstuk 6. Geordende binaire bomen

Maat: px
Weergave met pagina beginnen:

Download "Hoofdstuk 6. Geordende binaire bomen"

Transcriptie

1 Hoofdstuk 6 Geordende binaire bomen Eerder bespraken we hoe gelinkte lijsten een zeer flexibele structuur geven. Het zoeken in een gelinkte lijst was echter niet optimaal, aangezien je enkel de lijst van links naar rechts kunt doorlopen en alle elementen moet passeren. We zagen ook dat binair zoeken het snelste was in een geördende lijst: je kijkt halverwege of je element links of rechts zit en gaat verder met dat deel. Aldus kun je telkens de helft van de elementen elimineren. De zoektijd wordt dan log 2 n. Merk op dat hetzelfde idee van halveren terug te vinden is bij de snelle sorteeralgoritmen. Een binaire boom is gebaseerd op beide principes, het combineert de flexibiliteit van een gelinkte lijst met binaire zoeksnelheid. Een toepassing is dus een woordenboek of elke lijst die je gesorteerd wilt bijhouden. Boomstructuren zullen we nog tegenkomen in hoofdstuk 9. Daar zal het niet gaan om gesorteerde data, maar om de structuur van de gegevens zelf die zal vragen om een boom. 6.1 Definitie Left subtree ROOT Leaves Right subtree De basiselementen van een binaire boom zijn weergegeven in de figuur. Het centrale element langs waar men toegang krijgt tot de boom, noemt men de root (wortel). De twee bomen waarnaar de twee pointers van de wortel wijzen, noemt men respectievelijk "linker-subboom" en "rechtersubboom". De subbomen zijn uiteraard zelf ook gewone bomen met dezelfde eigenschappen als de boom waarvan ze deel uitmaken. Elementen helemaal onderaan in een subboom die geen subboom bevatten, noemt men "bladeren" (leaves). Deze plantkundige definities kunnen eigenaardig lijken; de verbeeldingrijke lezer mag eruit afleiden dat informatici ondersteboven leven. b d f h j l n Men spreekt van een geordende binaire boom wanneer alle elementen een "sleutelveld" bevatten voor welke een orderelatie kan worden gedefinieerd en wanneer elk element de wortel is van een boom met kleinere elementen in de linkersubboom en grotere elementen in de rechtersubboom. De figuur toont een a c e g i k m o 1

2 dergelijke boom waarin de sleutels letters van het alfabet zijn. Geordende binaire bomen worden veel aangewend voor het opbouwen en bijhouden van gegevens die men veelvuldig en snel wilt raadplegen (woordenboeken), want de zoektijd in een dergelijke boom is logaritmisch voor een gebalanceerde boom, zoals we later zullen zien. Dit is het gevolg van het halveren van de overblijvende zoekruimte bij het bezoeken van elk element. Het kan dus een traditioneel woordenboek zijn maar ook de lijst van de studenten van een universiteit of de catalogus van een winkel. 6.2 Het bouwen van een geordende binaire boom De basisbouwsteen is de node. class Node<T>{ T data; Node<T> left, right; Node(T data){ this.data = data; this.left = null; this.right = null; Met behulp van deze generieke node kunnen we een binaire boom bouwen die elementen van het type T opslaat. Het parameteriseren van een datatype (generics in Java) bespraken we reeds onder ArrayList en FifoQueue. De boom moet enkel de root kennen. Vanuit de root heeft ze toegang tot alle andere nodes. public class BinaryTree<T> { Node<T> root; Comparator<T> comparator; public BinaryTree(Comparator<T> comparator){ this.comparator = comparator; root = null; We verwachten van de gebruiker ook een Comparator. Deze zal ons vertellen hoe de elementen te ordenen. Het comparator-object zal gebruikt worden om twee objecten te vergelijken. Comparator is een interface met twee methodes gedefinieerd voor een type T: java.util Interface Comparator<T> 2

3 Method Summary int compare(t o1, T o2) Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. boolean equals(object obj) Indicates whether some other object is "equal to" this comparator. De compare-methode vergelijkt twee objecten en geeft een negatieve waarde als het eerste object kleiner is dan het tweede, 0 als ze gelijk zijn en een positieve waarde als het tweede object kleiner is. De equals-methode mag je negeren. We komen hier nog op terug in het volgend hoofdstuk. Een object van de klasse construeren kunnen we als volgt doen: BinaryTree<Integer> tree = new BinaryTree<Integer>(new Comparator<Integer>() public int compare(integer val1, Integer val2) { return val1 - val2; ); We moeten met de constructor een comparator-object meegeven, een object van een klasse die de Comparator-klasse implementeert. Omdat we deze klasse nergens anders nodig hebben, kunnen we die klasse definiëren bij de creatie van het object. We creëren het object met new en de gevraagde interface en implementeren tezelfdertijd de gevraagde methodes van de interface. Dit wordt een instant class genoemd. Dit is bondig. Anders moesten we eerst een eigen Comparator-klasse definiëren, als volgt: class IntegerComparator implements Comparator<Integer> public int compare(integer val1, Integer val2) { return val1 - val2; Het aanmaken van de boom wordt dan: BinaryTree<Integer> tree = new BinaryTree<Integer>(new IntegerComparator()); Nog een geeft aan dat we de methode overschrijven of implementeren. Dit noemen we een annotatie en is een vorm van documenteren. Het toevoegen van een element in de boom, moet met de nodige zorg gebeuren: public void add(t object){ Node<T> newnode = new Node<T>(object); if (root == null) 3

4 else root = newnode; add(root, newnode); private void add(node<t> current, Node<T> newnode){ if (comparator.compare(newnode.data, current.data) < 0){ // moet links komen if (current.left == null) current.left = newnode; else add(current.left, newnode); else { // rechts if (current.right == null) current.right = newnode; else add(current.right, newnode); Initieel begint men met een lege boom, root staat op null. Het eerst-toe-te-voegen element moet aan de root toegekend worden. Verdere elementen gaan we via een recursief procédé toevoegen. We moeten immers de correcte positie zoeken. Tijdens het afdalen, vergelijken we het element met de node en bepalen we of het element in het linker- of rechterdeel moet komen. Merk op dat de recursieve add-methode private gedefinieerd is omdat die enkel binnen de klasse gebruikt zal worden. 6.3 Het zoeken van een element in een geordende binaire boom Het zoeken gebeurt ook recursief. We maken gebruik van de comparator om enerzijds tijdens het dalen langs de goede kant van de boom af te dalen, en anderzijds om te checken of het element gevonden werd (compare geeft dan 0). public boolean contains(t object){ return find(root, object); private boolean find(node<t> current, T object){ if (current == null) return false; else if (comparator.compare(current.data, object) == 0) return true; else if (comparator.compare(object, current.data) < 0) return find(current.left, object); else return find(current.right, object); De maximale zoektijd is gelijk aan de maximale diepte van de boom. Idealiter zal die log 2 n zijn, behalve wanneer de boom niet gebalanceerd is (zie verder). 6.4 Het verwijderen van een element uit een geordende binaire boom Het is soms nodig om uit een bestaande geordende boom een element te verwijderen, zonder de eigenschappen van de overblijvende boom aan te tasten. Dit is bijvoorbeeld het 4

5 geval wanneer men een woord uit een woordenboek wenst te schrappen. Afhankelijk van waar het element zich in de boom bevindt, zal het verwijderen min of meer moeilijk zijn. Onderstaande figuur toont een voorbeeld van een verwijderen, voorzien worden mogelijke situaties : a) 2 subbomen: 3, 6 b) 0 of 1 subboom: 1, 2, 4, 5, 7 c) niet aanwezig: 0, 8, geordende binaire boom waaruit elementen moeten worden verwijderd. Het verwijderen van een element met één of nul subbomen is eenvoudiger omdat dat neerkomt op het verwijderen van een element uit een lineaire lijst. Tenslotte, om de robuustheid van het algoritme te garanderen, moet ook het geval waarbij men een onbestaande sleutel probeert te Wanneer het te verwijderen element een linker- én een rechtersubboom bezit, gaat het om het verwijderen van de wortel van een boom. Dit is vele malen moeilijker. Er moet dan een nieuwe wortel gekozen worden tussen de overblijvende nodes. Omdat, per definitie, de wortel een sleutelwaarde heeft die kleiner is dan al de elementen van de rechter subboom en groter dan deze van de linker subboom, zijn het element met de grootste sleutel uit de linkersubboom of het element met de kleinste sleutel uit de rechtersubboom de beste kandidaten voor de rol van nieuwe wortel. Op deze manier blijven de herschikkingen aan de boom minimaal. De figuur toont de twee verschillende manieren waarop de vorige boom kan worden herschikt na het verwijderen van element Meest linkse van rechtersubboom Meest rechtse van linkersubboom 5

6 Dit is het volledige algoritme: public boolean remove(t object){ if (comparator.compare(root.data, object)== 0){ root = createsubtree(root); return true; else return findnodeandremove(root, object); private boolean findnodeandremove(node<t> current, T object){ if (current == null) return false; if (current.left!= null && comparator.compare(current.left.data, object)== 0){ current.left = createsubtree(current.left); return true; else if (current.right!= null && comparator.compare(current.right.data, object)== 0){ current.left = createsubtree(current.right); return true; else if (comparator.compare(current.data, object) < 0) return findnodeandremove(current.left, object); else return findnodeandremove(current.right, object); /** * creates single tree from left and right nodes of current node */ private Node<T> createsubtree(node<t> current){ if (current.left == null){ // current.right is the only subtree that we should consider return current.right; else if (current.right == null){ // current.left is the only subtree that we should consider return current.left; else { // promote rightmost node of left subtree if (current.left.right == null){ current.left.right = current.right; return current.left; else { Node<T> rightmostnode = pickrightmostnode(current.left); // he is new root of subtree rightmostnode.right = current.right; rightmostnode.left = current.left; return rightmostnode; private Node<T> pickrightmostnode(node<t> p){ // we expect current.right not to be null if (p.right.right!= null){ return pickrightmostnode(p.right); else { 6

7 Node<T> rightmostnode = p.right; p.right = rightmostnode.left; rightmostnode.left = null; return rightmostnode; Eerst checken we of de root het gezochte element is. Zo ja, dan moet deze verwijderd worden en moeten we van de linker- en rechtersubboom een nieuwe boom maken. Dit doen we met createsubtree (). Op deze methode komen we dadelijk nog terug. Via findnodeandremove() dalen we in de boom tot we het element vinden of tot we merken dat het element niet aanwezig is. In dat laatste geval komen we op een null uit, net als bij het zoeken van een element dat we in het vorige deel hebben gezien. We keren onverrichterzake terug en geven false terug. Als we het element vinden als linker- of rechterelement, zullen we dit element vervangen door de subbomen van de elementen. Die we ook aanmaken met createsubtree (). Deze methode maakt één boom van beide subbomen. Als één van beide leeg is, is het gemakkelijk. Dan kan de andere teruggegeven worden. Indien geen van beide subbomen leeg is, moet een nieuwe wortel worden gekozen. Hier wordt er geopteerd voor het meest rechtse element van de linkersubboom Het doorlopen van binaire bomen Vaak willen we iets doen met alle elementen van de boom, zoals ze afprinten. De vraag is dan in welke volgorde we de elementen willen benaderen. Vaak worden drie specifieke volgordes aangewend die alle drie belangrijke toepassingen hebben. Ze worden respectievelijk in order, in preorder en in postorder genoemd. h d l b f j n a c e g i k m o PreOrder : root links - rechts : hdbacfegljiknmo InOrder : links root - rechts : abcdefghijklmno PostOrder : links rechts - root : acbegfdikjmonlh 7

8 Ze kunnen alle drie eenvoudig verwezenlijkt worden door middel van recursieve procedures. De figuur toont een boom en de uitgeschreven versies van dezelfde boom volgens de drie bovenvermelde methodes. Het is vanzelfsprekend ook nog mogelijk van rechts naar links eerder dan van links naar rechts te werken, dat vergt een kleine aanpassing aan de algoritmen. Hier de drie methodes die de boom volgens de drie bovenvermelde manieren doorlopen en de nodes printen public void preorder(node<t> node){ if (node!= null){ System.out.print(node.data+", "); preorder(node.left); preorder(node.right); public void inorder(node<t> node){ if (node!= null){ inorder(node.left); System.out.print(node.data+", "); inorder(node.right); public void postorder(node<t> node){ if (node!= null){ postorder(node.left); postorder(node.right); System.out.print(node.data+", "); Initieel worden deze procedures opgeroepen met als actuele parameter een pointer naar de wortel van de boom. De procedure verifieert dan eerst of de boom niet leeg is en indien nodig, begint hij aan de behandeling. De procedure PreOrder bv. zal eerst de wortel van de boom printen en daarna, recursief, zichzelf oproepen met eerst een pointer naar de linkersubboom en daarna een naar de rechtersubboom. Hier printen we de data van de node, maar dit kan vervangen worden door een andere actie die we met de data willen doen. Een tweede toepassing is om het aantal kinderen van alle nodes te berekenen. Hiervoor moeten we de boom in PostOrder doorlopen: het aantal nodes van linker- en rechtersubboom tellen. Hier de code: public int aantalkinderen(node<t> node){ if (node == null) return 0; int n = aantalkinderen(node.left); n += aantalkinderen(node.right); System.out.println("Node "+node.data+" heeft "+n+" kinderen"); return n + 1; 8

9 6.6 Perfect gebalanceerde bomen Het volstaat een beetje te experimenteren met de add van 6.2 om vast te stellen dat de structuur van de opgebouwde boom heel sterk afhangt van de volgorde waarin de elementen worden toegevoegd. Indien deze volgorde alfabetisch zou zijn, zou de boom zelfs degenereren in een lineaire lijst. De zoektijd in een lineaire lijst is evenredig met het aantal elementen in de lijst terwijl de zoektijd in een binaire boom evenredig is met het logaritme in basis 2 van dat aantal. Om de zoektijden te beperken moet men dus streven naar evenwichtige bomen, waarin alle bladeren ongeveer op het zelfde niveau te vinden zijn. Om het evenwicht van bomen te kwalificeren, zal men in elk element 12/11 van de boom de linker- en de 5/6 4/6 rechtersubboom vergelijken. Indien het verschil tussen het aantal elementen in deze twee subbomen 2/2 3/2 1/2 3/2 niet groter is dan één, spreekt men 1/0 0/1 1/1 1/0 0/0 1/0 1/1 1/0 van een perfect gebalanceerde boom. De figuur toont een boom die bijna perfect gebalanceerd is, in alle elementen behalve één is aan de voorwaarde voldaan. In de node hebben we telkens de grootte van linker- en rechterkant genoteerd. In de zwarte node merken we dus een verschil dat groter is dan 1. De relatieve waarde van het verschil tussen links en rechts geeft een maat voor de imbalans: imbalance # nodes # nodes links links # nodes # nodes rechts rechts Om te checken of een boom perfect gebalanceerd is moeten we dus het aantal nodes vergelijken van linker- en rechterkant. Dit zagen we in de methode aantalkinderen van vorige sectie. Deze methode kan omgebouwd worden tot een test van perfecte balans. We lopen de hele boom recursief af om de nodes te tellen, we geven het aantal nodes terug, maar als we een onbalans tegen komen moeten we die ook teruggeven. Met andere woorden: de recursieve functie zou twee dingen moeten teruggeven. Dit kan echter niet in Java. De oplossing die we hier toepassen is een -1 teruggeven als niet gebalanceerd. Deze onbalans moeten we verder doorgeven. Hier de code: // geeft -1 als niet perfect gebalanceerd, anders aantal nodes public int isperfectgebalanceerd(node<t> node){ if (node == null) return 0; int nlinks = aantalkinderen(node.left); Deel 2, Hoofdstuk 6, pag.9

10 int nrechts = aantalkinderen(node.right); if (nlinks < 0 && nrechts < 0) return -1; if (Math.abs(nLinks - nrechts) > 1) { System.out.println("Node "+node.data+" is niet perfect gebalanceerd: "+nlinks+" versus "+nrechts); return -1; else { return nlinks + nrechts + 1; 6.7 AVL-bomen Een perfect gebalanceerde boom opbouwen is echter vrij moeilijk want er bestaan geen eenvoudige manipulaties om een bijna perfect gebalanceerde boom om te toveren tot een perfect gebalanceerde Definitie. Twee Russische mathematici, Adelson-Velskii & Landis hebben een minder streng criterium voor het balanceren van bomen bedacht. In plaats van het aantal elementen in de linker- en de rechtersubbomen te vergelijken beschouwen zij enkel de hoogte van deze 3/4 subbomen. Bomen waarbij, in elk 2/2 3/3 element, de hoogte van de linkersubboom niet meer dan een 1/1 1/0 2/2 2/0 niveau verschilt van de hoogte van de rechtersubboom worden AVLbomen 0/0 0/0 0/0 1/0 1/0 1/1 genoemd. De figuur toont een boom waarvan alle elementen behalve één aan de AVLvoorwaarde voldoen. We tonen de diepte links en rechts in elke node. De zwarte node voldoet dus niet aan de voorwaarde. De volgende figuur toont dezelfde boom waarin, door middel van een eenvoudige lokale transformatie, de AVL voorwaarde hersteld werd. 1/1 0/0 0/0 0/0 1/0 3/4 2/2 3/3 2/2 1/0 1/0 0/0 1/1 0/0 Deel 2, Hoofdstuk 6, pag.10 Men dient op te merken dat de definitie van een AVL-boom geenszins uitsluit dat er tussen null-pointers (plaatsen zonder tak) niveauverschillen groter dan één kunnen bestaan. In deze AVL-

11 boom ziet men dat uiterst rechts van de linkersubboom een NULL-pointer te vinden is die twee niveaus hoger ligt dan de NULL-pointers onder de linkse subboom van de rechtersubboom. Dit komt omdat de hoogte van een boom, zoals gebruikt in de AVLdefinitie bepaald wordt door de hoogste subboom. De boom is ook niet perfect gebalanceerd. Ten opzichte van perfect gebalanceerde bomen hebben AVL-bomen het voordeel dat zij eenvoudig kunnen worden opgebouwd terwijl zij toch (redelijk) performant zoeken toelaten Hoogte van subboom. Om bij het aanmaken van de boom aan de AVL-voorwaarde te voldoen, zullen we de hoogte van de subboom van elke node bijhouden. De hoogte is recursief gedefinieerd als het maximum van de hoogte van de linkersubboom en hoogte van rechtersubboom plus 1. We breiden de definitie uit van Node zodat we die in elke node kunnen bijhouden (grijs): class Node<T>{ T data; Node<T> left, right; int hoogte=0; Node(T data){ this.data = data; left = null; right = null; public String tostring(){ return data.tostring()+"("+hoogte+")"; We veranderen ook de tostring-methode zodat de hoogte ook geprint wordt. Nu kunnen we de hoogte in een node berekenen met de volgende code: protected void berekenhoogte(node<t> node){ int nrechts = node.right == null? 0 : 1 + node.right.hoogte; int nlinks = node.left == null? 0 : 1 + node.left.hoogte; node.hoogte = Math.max(nRechts, nlinks); Hierbij gaan we er vanuit dat de hoogte in linker- en rechternode correct is. Oefening: verander de code zodat de AVL-voorwaarde getest wordt. Om deze hoogte up-to-date te houden, moeten we bij elke uitbreiding van de boom, de hoogtes aanpassen. Als we een node toevoegen, dalen we af in de boom tot we de juiste lege plek vinden waar we de node kunnen toevoegen. Het zijn enkel de nodes langs dit pad waarvan de hoogtes veranderd kan zijn. Dit doen we als we terugkeren uit de recursie, op het einde van de add. Dan roepen we de functie berekenhoogte op. Deze functie is enkel correct als de hoogte van de onderste nodes correct zijn. Aan deze voorwaarde is hier voldaan, we passen de hoogtes aan van onder naar boven. Deel 2, Hoofdstuk 6, pag.11

12 In grijs de aanpassingen van de add-methode. public void add(t object){ Node<T> newnode = new Node<T>(object); if (root == null) root = newnode; else add(root, newnode); berekenhoogte(root); private void add(node<t> current, Node<T> newnode){ if (comparator.compare(newnode.data, current.data) < 0){ // moet links komen if (current.left == null) current.left = newnode; else add(current.left, newnode); else { // rechts if (current.right == null) current.right = newnode; else add(current.right, newnode); // herbereken hoogte berekenhoogte(current); Bij toevoeging van een node worden de hoogtes waar nodig aangepast. Dit noemen we het consistent houden van de datastructuur: zorgen dat alle eigenschappen steeds correct blijven. De herberekening van de hoogtes moet dus gebeuren telkens we iets aan de boom aanpassen. Dus ook bij het verwijderen van een node! Oefening: pas de functie remove aan zodat het hoogte-atribuut herberekend wordt waar nodig. De hulpfuncties findnodeandremove, createtreefromsubs en pickrightmostnode zullen dus herbekeken moeten worden. Nu we de tostring van Node hebben aangepast en de hoogte ook geprint wordt, kunnen we onze aanpassingen testen en zien of de hoogte in elke node correct blijft bij het verwijderen van nodes. De encapsulatie-eigenschap van object-georiënteerd programmeren is in het leven geroepen om dataconsistentie te kunnen waarborgen. Zoals hier bij een boom. We houden de datastructuur verborgen voor de gebruiker en passen deze zelf aan in de publieke methodes. Deze publieke methodes zijn de enige die de gebruiker kan oproepen. We zorgen ervoor dat deze correct zijn door ze uitgebreid te testen. Eenmaal correct is dataconsistentie verzekerd, de gebruiker kan de datastructuur immers niet zelf aanpassen. En daarvoor is hij ons dankbaar, hij zou niet goed weten hoe! Deel 2, Hoofdstuk 6, pag.12

13 6.7.3 Het opbouwen van een AVL-boom. Het opbouwen van een AVL-boom gebeurt zoals het opbouwen van een gewone geordende boom. Met dat verschil dat telkens een nieuw element aan de boom wordt toegevoegd, er nagegaan wordt of de AVL-voorwaarden nog steeds voldaan zijn. Indien dit niet het geval is, wordt de boom herschikt. Eerst zullen hier deze herschikkingen besproken worden. A A De figuur toont schematisch twee verschillende situaties die een herschikking noodzakelijk maken na het toevoegen van één element aan een AVLboom. B Buitenwaarts onevenwicht B Binnenwaarts onevenwicht In de schema s worden subbomen gewoonweg voorgesteld door een rechthoek. Horizontale stippellijnen worden gebruikt om de onderste niveaus van deze subbomen aan te duiden. Het is evident dat door een symmetrie waarbij links en rechts worden omgewisseld er twee analoge configuraties ontstaan die ook een herschikking vergen. Hier worden enkel de gevallen getoond die in de figuur besproken worden. De behandeling van de twee anderen is identiek, mits het uitwisselen van links en rechts. Wanneer de hoogte van de linkersubboom één niveau groter is dan de hoogte van de rechtersubboom zal het toevoegen van een element aan de linkersubboom mogelijk aanleiding geven tot een overdreven hoogteverschil tussen linker- en rechtersubboom. Indien het toegevoegde element tot de linkersubboom van de linkersubboom behoort, spreekt men van een buitenwaarts onevenwicht. Indien het de rechtersubboom van de linkse subboom is die gegroeid is, heeft men te maken met een binnenwaarts onevenwicht. B A B A De herschikking die men kan toepassen in het geval van een buitenwaarts onevenwicht wordt beschreven in onderstaande figuur. Door een soort van rotatie wordt de wortel van de linkersubboom (B) de nieuwe wortel van het geheel terwijl de oorspronkelijke wortel (A) de Deel 2, Hoofdstuk 6, pag.13 Herschikking van een buitenwaarts onevenwicht

14 wortel van de rechtersubboom wordt. De rechtersubboom van B wordt de nieuwe linkersubboom van A. Hierbij dient opgemerkt te worden dat de nieuwe boom evenwichtig is en dat de hoogte ervan dezelfde is als deze van de oorspronkelijke boom, vóór het toevoegen van het element dat de herschikking noodzakelijk heeft gemaakt. De herschikking die moet toegepast worden bij een binnenwaarts onevenwicht is A C lichtjes complexer dan deze B B A voor een buitenwaarts onevenwicht. Onderstaande C figuur toont de toegepaste transformatie. Het is de rechtersubboom van de linkersubboom die te hoog geworden is. Dit kan het gevolg zijn van het toevoegen Herschikking van een binnenwaarts onevenwicht van een element aan de linkersubboom of van het toevoegen van een element aan de rechtersubboom. In het schema is dit element voorgesteld met een gestippeld blokje. We tonen twee gespikkelde blokjes voor beide gevallen. Er is er natuurlijk maar één toegevoegd. Beide gevallen kunnen echter op dezelfde manier behandeld worden. Als nieuwe wortel van het geheel kiest men de wortel (C) van de subboom waarvan de hoogte gegroeid is. Hier kan men eveneens vaststellen dat de resulterende boom evenwichtig is en dezelfde hoogte heeft als de oorspronkelijke boom. Het feit dat bij beide transformaties het resultaat dezelfde hoogte heeft als de oorspronkelijke boom is de sleutel tot de efficiëntie van AVL-bomen. Het heeft inderdaad als gevolg dat wanneer men ergens verplicht is geweest, na het toevoegen van een element, een herschikking door te voeren, men niet meer verder moet nagaan of de AVL-voorwaarde wel voldaan is, vermits de herschikte boom niet hoger is dan de oorspronkelijke boom, vóór het toevoegen van het element Programmatie van de add. In deze laatste paragraaf programmeren we de constructie van een boom waarvoor de AVL-voorwaarde bewaard blijft. We moeten hiervoor de add aanpassen. We kunnen deze van BinaryTree aanpassen. Een tweede oplossing is een subklasse aan te maken van BinaryTree. We laten de oorspronkelijke klasse ongemoeid, maar maken een subklasse om onze nieuwe ideeën in te ontwikkelen. We noemen deze AVLTree en definiëren ze als volgt: public class AVLTree<T> extends BinaryTree<T> { public AVLTree(Comparator<T> comparator) { super(comparator); Deel 2, Hoofdstuk 6, pag.14

15 Omdat de default constructor van BinaryTree niet meer van toepassing is, moeten we ook een constructor in AVLTree voorzien. We overschrijven nu de add van BinaryTree met een toevoeging van de herschikking besproken in de vorige paragraaf. Dit is een voorbeeld van overerving, de tweede pijler van object-georiënteerd programmeren. AVLTree zal automatisch alle attributen en methodes van BinaryTree overerven. We moeten deze niet opnieuw programmeren, maar kunnen wel uitbreidingen of overschrijvingen doen. Voor AVLTree gaan we enkel de add overschrijven. Zo zorgen we er voor dat de boom gebalanceerd blijft. De andere methodes van BinaryTree, zoals het opzoeken van een element, kunnen we gewoon blijven gebruiken! Dit illustreert mooi de kracht van object-georiënteerd programmeren. Nu de programmatie. We moeten echter een aanpassing doen van de hulpfunctie private void add(node<t> current, Node<T> newnode). We hebben immers gezien dat bij een herschikking we kiezen voor een nieuwe topnode van een subboom. Bij een buitenwaartse herschikking werd B de nieuwe topnode, bij een binnenwaartse A. Deze nieuwe topnode moet het nieuwe kind van de hogergelegen node worden (links of rechts). Dit lossen we op door de topnode terug te geven bij elke recursieve oproep. De hulpfunctie add heb ik hernoemd naar addavl en deze laten we een Node teruggeven. Als er geen herschikking heeft plaats gevonden is deze node gewoon current. In het andere geval is dit de nieuwe topnode. Deze nieuwe node wordt dan bij het terugkeren van de recursieve functie addavl links of rechts public void add(t object){ Node<T> newnode = new Node<T>(object); root = addavl(root, newnode); // Node wordt toegevoegd en nieuwe topnode wordt teruggegeven (deze kan veranderen) private Node<T> addavl(node<t> current, Node<T> newnode){ if (current == null) return newnode; if (comparator.compare(newnode.data, current.data) < 0){ // moet links komen current.left = addavl(current.left, newnode); // check for imbalance int imbalans = imbalance(current.left, current.right); if (imbalans < -1){ if (comparator.compare(newnode.data, current.left.data) < 0){ System.out.println("When adding "+newnode.data+" outer imbalance at left of "+current.data); // if added left: outer imbalance Node<T> A = current; // zie tekening van cursus Node<T> B = current.left; A.left = B.right; // in de goede volgorde!! B.right = A; Deel 2, Hoofdstuk 6, pag.15

16 current = B; // dit is de nieuwe topnode van subboom berekenhoogte(a); berekenhoogte(b); else { System.out.println("When adding "+newnode.data+" inner imbalance at left of "+current.data); // if added right: inner imbalance Node<T> A = current; // zie tekening van cursus Node<T> B = current.left; Node<T> C = B.right; A.left = C.right; // in de goede volgorde!! B.right = C.left; C.right = A; C.left = B; current = C; // dit is de nieuwe topnode van subboom berekenhoogte(a); berekenhoogte(b); berekenhoogte(c); else { // rechts current.right = addavl(current.right, newnode); // check for imbalance int imbalans = imbalance(current.left, current.right); if (imbalans > 1){ if (comparator.compare(newnode.data, current.right.data) > 0){ System.out.println("When adding "+newnode.data+" outer imbalance at right of "+current.data); // if added right: outer imbalance Node<T> A = current; // spiegelbeeld van vorige Node<T> B = current.right; A.right = B.left; // in de goede volgorde!! B.left = A; current = B; // dit is de nieuwe topnode van subboom berekenhoogte(a); berekenhoogte(b); else { System.out.println("When adding "+newnode.data+" inner imbalance at right of "+current.data); // if added left: inner imbalance Node<T> A = current; // spiegelbeeld van vorige Node<T> B = current.right; Node<T> C = B.left; A.right = C.left; // in de goede volgorde!! B.left = C.right; C.left = A; C.right = B; current = C; // dit is de nieuwe topnode van subboom berekenhoogte(a); berekenhoogte(b); berekenhoogte(c); Deel 2, Hoofdstuk 6, pag.16

17 berekenhoogte(current); return current; Merk op dat we berekenhoogte oproepen voor de nodes die deelnemen aan de herschikking. Deel 2, Hoofdstuk 6, pag.17

Java Programma structuur

Java Programma structuur Java Programma structuur public class Bla // div. statements public static void main(string argv[]) // meer spul Voortgezet Prog. voor KI, week 4:11 november 2002 1 Lijsten Voorbeelden 2, 3, 5, 7, 13 Jan,

Nadere informatie

Informatica 2e semester

Informatica 2e semester Informatica 2 e semester: les 8 Software & binaire bomen Jan Lemeire Informatica 2 e semester februari mei 2017 Vandaag 1. Overzicht datastructuren 2. Binaire bomen 3. Theoretische informatica 4. Software

Nadere informatie

Informatica 2e semester

Informatica 2e semester Informatica 2 e semester: les 8 Software & binaire bomen Jan Lemeire Informatica 2 e semester februari mei 2018 Informatica 2e semester: HOC 8 Vandaag 1. Overzicht datastructuren 2. Binaire bomen 3. Chips

Nadere informatie

Informatica. Deel II: les 9 OS & AVL. Jan Lemeire. Informatica deel II. februari mei Informatica II: les 9

Informatica. Deel II: les 9 OS & AVL. Jan Lemeire. Informatica deel II. februari mei Informatica II: les 9 Informatica Deel II: les 9 OS & AVL Jan Lemeire Informatica deel II februari mei 2014 Hoofdstuk 8: Operating Systems Jan Lemeire Pag. 2 / 64 Bedrijfscomputers Initieel waren er voornamelijk bedrijfscomputers

Nadere informatie

Elementary Data Structures 3

Elementary Data Structures 3 Elementary Data Structures 3 Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 29 september 2014 ODE/FHTBM Elementary Data Structures 3 29 september 2014 1/14 Meer

Nadere informatie

Informatica. Deel II: les 10. Bomen. Jan Lemeire Informatica deel II februari mei Informatica II: les 9

Informatica. Deel II: les 10. Bomen. Jan Lemeire Informatica deel II februari mei Informatica II: les 9 Informatica Deel II: les 10 Bomen Jan Lemeire Informatica deel II februari mei 2012 Informatica II: les 9 De volgende revolutie Internet! Jan Lemeire Pag. 2 / 37 Technologie Netwerk laat toe dat computers

Nadere informatie

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

Hoofdstuk 2. Week 4: Datastructuren. 2.1 Leesopdracht. 2.2 Bomen. 2.3 Definitie Hoofdstuk 2 Week 4: Datastructuren 2.1 Leesopdracht In het hoorcollege komen lijsten en bomen aan de orde. De eerste datastructuur komt in het boek in bladzijden 317-333 aan de orde. In dit dictaat komt

Nadere informatie

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

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011 15 november 2011 Tree traversal Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 15 november 2011 ODE/FHTBM Tree traversal 15 november 2011 1/22 1 ODE/FHTBM Tree

Nadere informatie

Informatica 2e semester

Informatica 2e semester Informatica 2 e semester: les 8 Software & binaire bomen Jan Lemeire Informatica 2 e semester februari mei 2019 Vandaag 1. Non-zero sum games 2. Leren 3. Deel III: slimme algoritmen versus intelligentie

Nadere informatie

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double. Algemeen C# Variabele Een variabele is een willekeurige waarde die word opgeslagen. Een variabele heeft altijd een datetype ( De soort waarde die een variabele bevat). Datatypes Een datatype is de sort

Nadere informatie

Informatica. Deel II: les 8. Software & binaire bomen. Jan Lemeire Informatica deel II&III februari mei Parallel Systems: Introduction

Informatica. Deel II: les 8. Software & binaire bomen. Jan Lemeire Informatica deel II&III februari mei Parallel Systems: Introduction Informatica Deel II: les 8 Software & binaire bomen Jan Lemeire Informatica deel II&III februari mei 2014 Parallel Systems: Introduction Waarmaken van Leibniz s droom (10) Artificiële intelligentie (9)

Nadere informatie

Datastructuren en algoritmen voor CKI

Datastructuren en algoritmen voor CKI Datastructuren en algoritmen voor CKI Jeroen Bransen 1 9 oktober 2015 1 met dank aan Hans Bodlaender en Gerard Tel Zoekbomen Binaire boom Bestaat uit knopen Beginknoop is de wortel (root) Elke knoop heeft

Nadere informatie

Datastructuren; (Zoek)bomen

Datastructuren; (Zoek)bomen Datastructuren; (Zoek)bomen Bomen, zoekbomen, gebalanceerde zoekbomen José Lagerberg FNWI, UvA José Lagerberg (FNWI, UvA) Datastructuren; (Zoek)bomen 1 / 50 Bomen Traversal van bomen Datastructuur van

Nadere informatie

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Uitwerking tentamen Algoritmiek 9 juni :00 17:00 Uitwerking tentamen Algoritmiek 9 juni 2015 14:00 17:00 1. Clobber a. Toestanden: m x n bord met in elk hokje een O, een X of een -. Hierbij is het aantal O gelijk aan het aantal X of er is hooguit één

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden Datastructuren: stapels, rijen en binaire bomen week 12: 23 27 november 2015 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Inleiding In de informatica worden Abstracte DataTypen (ADT s)

Nadere informatie

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

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen Tree traversal Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 15 november 2011 ODE/FHTBM Tree traversal 15 november 2011 1/22 1 ODE/FHTBM Tree traversal 15 november

Nadere informatie

Informatica. 2 e semester: les 9. OS & Sorteren. Jan Lemeire Informatica 2 e semester februari mei Informatica II: les 9

Informatica. 2 e semester: les 9. OS & Sorteren. Jan Lemeire Informatica 2 e semester februari mei Informatica II: les 9 Informatica 2 e semester: les 9 OS & Sorteren Jan Lemeire Informatica 2 e semester februari mei 2016 Vandaag 1. Besturingssystemen 2. Het gebruik van static 3. Binaire bomen (vervolg) 4. Sorteren Hoofdstuk

Nadere informatie

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

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber Tentamen TI1310 Datastructuren en Algoritmen, 15 april 2011, 9.00-12.00 TU Delft, Faculteit EWI, Basiseenheid Software Engineering Bij het tentamen mag alleen de boeken van Goodrich en Tamassia worden

Nadere informatie

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

Programmeren in C++ Efficiënte zoekfunctie in een boek Examen Software Ontwikkeling I 2e Bachelor Informatica Faculteit Wetenschappen Academiejaar 2010-2011 21 januari, 2011 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief de hints/opmerkingen)!

Nadere informatie

Inleiding Programmeren 2

Inleiding Programmeren 2 Inleiding Programmeren 2 Gertjan van Noord November 26, 2018 Stof week 3 nogmaals Zelle hoofdstuk 8 en recursie Brookshear hoofdstuk 5: Algoritmes Datastructuren: tuples Een geheel andere manier om te

Nadere informatie

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49 Stacks and queues Introductie 45 Leerkern 45 6.1 Stacks 45 6.2 Queues 47 6.3 Double-ended queues 48 Terugkoppeling 49 Uitwerking van de opgaven 49 Bijlage: Diagrammen belangrijkste interfaces en klassen

Nadere informatie

Inleiding Programmeren 2

Inleiding Programmeren 2 Inleiding Programmeren 2 Gertjan van Noord November 28, 2016 Stof week 3 nogmaals Zelle hoofdstuk 8 en recursie Brookshear hoofdstuk 5: Algoritmes Datastructuren: tuples Een geheel andere manier om te

Nadere informatie

Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Tentamen Object Georiënteerd Programmeren TI1206 29 oktober 2014, 9.00-11.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Digitale

Nadere informatie

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is

voegtoe: eerst methode bevat gebruiken, alleen toevoegen als bevat() false is PROEF-Tentamen Inleiding programmeren (IN1608WI), X januari 2010, 9.00-11.00, Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Open boek tentamen: bij het tentamen mag alleen gebruik worden gemaakt

Nadere informatie

Hoofdstuk 9. Hashing

Hoofdstuk 9. Hashing Hoofdstuk 9 Hashing Het zoeken in een verzameling van één object is in deze cursus al verschillende malen aan bod gekomen. In hoofdstuk 2 werd uitgelegd hoe men een object kan zoeken in een array die veel

Nadere informatie

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden.

Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. Herhaling Objectgeorïenteerd werken is gebaseerd op de objecten die door het systeem gemanipuleerd worden. De basisbouwsteen is het object; een geïntegreerde eenheid van data en operaties werkend op deze

Nadere informatie

IMP Uitwerking week 13

IMP Uitwerking week 13 IMP Uitwerking week 13 Opgave 1 Nee. Anders moet bijvoorbeeld een venster applicatie een subklasse zijn van zowel Frame en WindowListener. Als de applicatie ook een button of een menu heeft, dan moet het

Nadere informatie

Dergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen.

Dergelijke functionaliteit kunnen we zelf ook aan eigen code toevoegen. Indexers in C#.Net In deze tutorial ga ik het hebben over indexers. Bij het gebruik van bijvoorbeeld een ArrayList object, kan je de gegevens uit deze collectie opvragen als ware het een array. // ArrayList

Nadere informatie

Tentamen Programmeren in C (EE1400)

Tentamen Programmeren in C (EE1400) TU Delft Tentamen Programmeren in C (EE1400) 5 april 2012, 9.00 12.00 Faculteit EWI - Zet op elk antwoordblad je naam en studienummer. - Beantwoord alle vragen zo nauwkeurig mogelijk. - Wanneer C code

Nadere informatie

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep.

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep. Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep. Gebruik deze opgaven, naast die uit het boek, om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes tot acht opgaven.

Nadere informatie

Een gelinkte lijst in C#

Een gelinkte lijst in C# Een gelinkte lijst in C# In deze tutorial ga demonstreren hoe je een gelinkte lijst kan opstellen in C#. We gaan een klasse schrijven, die een gelijkaardige functionaliteit heeft als een ArrayList, namelijk

Nadere informatie

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Uitwerking tentamen Algoritmiek 9 juli :00 13:00 Uitwerking tentamen Algoritmiek 9 juli 0 0:00 :00. (N,M)-game a. Toestanden: Een geheel getal g, waarvoor geldt g N én wie er aan de beurt is (Tristan of Isolde) b. c. Acties: Het noemen van een geheel

Nadere informatie

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei 2014. Parallel Systems: Introduction

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei 2014. Parallel Systems: Introduction Informatica Deel II: les 1 Java versus Python Jan Lemeire Informatica deel II februari mei 2014 Parallel Systems: Introduction Arabidopsis (zandraket) Arabidopsis (zandraket) MMIQQA Multimodal Microscopic

Nadere informatie

Tweede college algoritmiek. 12 februari Grafen en bomen

Tweede college algoritmiek. 12 februari Grafen en bomen College 2 Tweede college algoritmiek 12 februari 2016 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)

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 6 december 2013 Terugblik Programma en geheugen Opdrachten Variabelen Methoden Objecten Klasse Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in

Nadere informatie

Addendum bij hoofdstuk 5 Generieke implementatie van de zoekalgoritmen

Addendum bij hoofdstuk 5 Generieke implementatie van de zoekalgoritmen Addendum bij hoofdstuk 5 Generieke implementatie van de zoekalgoritmen De implementatie wordt kort besproken in 5.2.6 1. Programmatie Zoekalgoritme Definitie van boom: we hebben geen binaire boom met exact

Nadere informatie

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

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort Algoritmiek 018/Algoritme van Dijkstra Elfde college algoritmiek 18 mei 018 Algoritme van Dijkstra, Heap, Heapify & Heapsort 1 Algoritmiek 018/Algoritme van Dijkstra Uit college 10: Voorb. -1- A B C D

Nadere informatie

Algoritmiek. 15 februari Grafen en bomen

Algoritmiek. 15 februari Grafen en bomen 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

Nadere informatie

Overerving & Polymorfisme

Overerving & Polymorfisme Overerving & Polymorfisme Overerving Sommige klassen zijn speciaal geval van andere klasse Docent is een speciaal geval van werknemer, dwz. elke docent is ook werknemer Functionaliteit van docent = functionaliteit

Nadere informatie

Kleine cursus PHP5. Auteur: Raymond Moesker

Kleine cursus PHP5. Auteur: Raymond Moesker Kleine cursus PHP5 Auteur: Raymond Moesker Kleine cursus PHP PHP is platform en CPU onafhankelijk, open source, snel, heeft een grote userbase, het is object georiënteerd, het wordt omarmd door grote bedrijven

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 27 november 2015 Recursie Objecten Constructors Aanpassen variabelen this keyword Recursie Recursie Recursieve functie roept zichzelf (direct of indirect) aan

Nadere informatie

2 Recurrente betrekkingen

2 Recurrente betrekkingen WIS2 1 2 Recurrente betrekkingen 2.1 Fibonacci De getallen van Fibonacci Fibonacci (= Leonardo van Pisa), 1202: Bereken het aantal paren konijnen na één jaar, als 1. er na 1 maand 1 paar pasgeboren konijnen

Nadere informatie

Lessen Java: Reeks pag. 1

Lessen Java: Reeks pag. 1 Lessen Java: Reeks 2 1-3-2016 pag. 1 Primitieve types type grootte waardes byte 8 bits 128, 127 short 16 bits 32768, 32767 int 32 bits 2 31, 2 31 1 long 64 bits 2 63, 2 63 1 type grootte waardes float

Nadere informatie

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

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie Hoofdstuk 5 Recursion I N T R O D U C T I E Veel methoden die we op een datastructuur aan kunnen roepen, zullen op een recursieve wijze geïmplementeerd worden. Recursie is een techniek waarbij een vraagstuk

Nadere informatie

Examen Datastructuren en Algoritmen II

Examen Datastructuren en Algoritmen II Tweede bachelor Informatica Academiejaar 2012 2013, tweede zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 11 december 2015 Ingebouwde datastructuren Meer boomstructuren Access specifiers Gebruikersinvoer Codestijl Packages SAT-solver Ingebouwde datastructuren Ingebouwde

Nadere informatie

Informatica. Deel II&III: les 7. AI linked lists - chips. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Informatica. Deel II&III: les 7. AI linked lists - chips. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction Informatica Deel II&III: les 7 AI linked lists - chips Jan Lemeire Informatica deel II februari mei 2015 Parallel Systems: Introduction Hoofdstuk 9: Artificiële intelligentie Jan Lemeire Pag. 2 / 77 Waarmaken

Nadere informatie

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

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40 Recursion Introductie 37 Leerkern 37 5.1 Foundations of recursion 37 5.2 Recursive analysis 37 5.3 Applications of recursion 38 Terugkoppeling 40 Uitwerking van de opgaven 40 Hoofdstuk 5 Recursion I N

Nadere informatie

Verslag Opdracht 4: Magische Vierkanten

Verslag Opdracht 4: Magische Vierkanten Verslag Opdracht 4: Magische Vierkanten Stefan Schrama, Evert Mouw, Universiteit Leiden 2007-08-14 Inhoudsopgave 1 Inleiding 2 2 Uitleg probleem 2 3 Theorie 2 4 Aanpak 2 5 Implementatie 4 6 Experimenten

Nadere informatie

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing Introductie In dit document geven we een mogelijke oplossing voor het eerste practicum. Deze oplossing gebruikt verschillende klassen en overerving,

Nadere informatie

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep. Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep. Gebruik deze opgaven, naast die uit het boek, om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes tot acht opgaven.

Nadere informatie

Zelftest Programmeren in Java

Zelftest Programmeren in Java Zelftest Programmeren in Java Document: n0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST PROGRAMMEREN IN JAVA Deze test

Nadere informatie

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei 2015. Parallel Systems: Introduction

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei 2015. Parallel Systems: Introduction Informatica Deel II: les 1 Java versus Python Jan Lemeire Informatica deel II februari mei 2015 Parallel Systems: Introduction Arabidopsis (zandraket) Arabidopsis (zandraket) MMIQQA Multimodal Microscopic

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 13 december 2013 Terugblik Fibonacci public class Fibonacci { public static void main(string[] args) { // Print het vijfde Fibonaccigetal System.out.println(fib(5));

Nadere informatie

Informatica. Deel II&III: les 8. Software & binaire bomen. Jan Lemeire Informatica deel II&III februari mei Parallel Systems: Introduction

Informatica. Deel II&III: les 8. Software & binaire bomen. Jan Lemeire Informatica deel II&III februari mei Parallel Systems: Introduction Informatica Deel II&III: les 8 Software & binaire bomen Jan Lemeire Informatica deel II&III februari mei 2015 Parallel Systems: Introduction Leibniz droom De Calculus ratiocinator Een logisch denkend apparaat

Nadere informatie

Vakgroep CW KAHO Sint-Lieven

Vakgroep CW KAHO Sint-Lieven Vakgroep CW KAHO Sint-Lieven Objecten Programmeren voor de Sport: Een inleiding tot JAVA objecten Wetenschapsweek 20 November 2012 Tony Wauters en Tim Vermeulen tony.wauters@kahosl.be en tim.vermeulen@kahosl.be

Nadere informatie

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI Vrijdag 22 januari 2010 Toelichting Dit is een open boek tentamen. Communicatie en het gebruik van hulpmiddelen zijn niet toegestaan.

Nadere informatie

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int

Nadere informatie

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Uitwerking tentamen Algoritmiek 10 juni :00 13:00 Uitwerking tentamen Algoritmiek 10 juni 2014 10:00 13:00 1. Dominono s a. Toestanden: n x n bord met in elk hokje een O, een X of een -. Hierbij is het aantal X gelijk aan het aantal O of hooguit één hoger.

Nadere informatie

NAAM: Programmeren 1 Examen 21/01/2011

NAAM: Programmeren 1 Examen 21/01/2011 Programmeren 1 21 januari 2011 Prof. T. Schrijvers Instructies Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien). Geef ook je kladbladen af. Bij heel wat vragen moet

Nadere informatie

Informatica: C# WPO 11

Informatica: C# WPO 11 Informatica: C# WPO 11 1. Inhoud Pass by reference (ref, out), recursie, code opdelen in verschillende codebestanden 2. Oefeningen Demo 1: Swapfunctie Demo 2: TryParse(int) Demo 3: Recursion Tree Demo

Nadere informatie

Stacks and queues. Hoofdstuk 6

Stacks and queues. Hoofdstuk 6 Hoofdstuk 6 Stacks and queues I N T R O D U C T I E In dit hoofdstuk worden drie datastructuren stack, queue en deque behandeld. Om deze datastructuren te implementeren, worden onder andere arrays en linked

Nadere informatie

Abstracte klassen & Interfaces

Abstracte klassen & Interfaces Abstracte klassen & Interfaces Overerving public class Vierhoek {... Vierhoek public class Rechthoek extends Vierhoek {... public class Ruit extends Vierhoek {... Rechthoek Ruit Elke rechthoek is een vierhoek.

Nadere informatie

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10 CPP 1 van 10 ADSdt 1-2009 TENTAMENVOORBLAD Voor aanvang van het tentamen s.v.p. de tentamengegevens goed doorlezen om eventuele misverstanden te voorkomen!! Naam student : Studentnummer : Groep : Studieonderdeel

Nadere informatie

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele

Informatica. Objectgeörienteerd leren programmeren. Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele Informatica Objectgeörienteerd leren programmeren Van de theorie met BlueJ tot een spelletje met Greenfoot... Bert Van den Abbeele http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode Objectgeörienteerd

Nadere informatie

Lineaire data structuren. Doorlopen van een lijst

Lineaire data structuren. Doorlopen van een lijst Lineaire data structuren array: vast aantal data items die aaneensluitend gestockeerd zijn de elementen zijn bereikbaar via een index lijst: een aantal individuele elementen die met elkaar gelinkt zijn

Nadere informatie

Design patterns Startbijeenkomst

Design patterns Startbijeenkomst Design patterns Startbijeenkomst Harrie Passier Docenten Sylvia Stuurman (1 e examinator) Sylvia.Stuurman@ou.nl Harrie Passier (2 e examinator) Harrie.Passier@ou.nl Aarzel niet vragen te stellen! Rooster

Nadere informatie

Tentamen Programmeren in C (EE1400)

Tentamen Programmeren in C (EE1400) TU Delft Tentamen Programmeren in C (EE1400) 3 feb. 2012, 9.00 12.00 Faculteit EWI - Zet op elk antwoordblad je naam en studienummer. - Beantwoord alle vragen zo nauwkeurig mogelijk. - Wanneer C code gevraagd

Nadere informatie

Informatica. 2 e semester: les 8. Software & binaire bomen. Jan Lemeire Informatica 2 e semester februari mei Parallel Systems: Introduction

Informatica. 2 e semester: les 8. Software & binaire bomen. Jan Lemeire Informatica 2 e semester februari mei Parallel Systems: Introduction Informatica 2 e semester: les 8 Software & binaire bomen Jan Lemeire Informatica 2 e semester februari mei 2016 Parallel Systems: Introduction Leibniz droom De Calculus ratiocinator Een logisch denkend

Nadere informatie

Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding

Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding Hoofdstuk 3 Week 5: Sorteren 3.1 Inleiding Zoals al bleek in college 1 kunnen zoekalgoritmen veel sneller worden uitgevoerd, indien we weten dat de elementen in de lijst, waarin wordt gezocht, geordend

Nadere informatie

Programmeren (1) Examen NAAM:

Programmeren (1) Examen NAAM: Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien) en geef zowel klad als net af. Bij heel wat vragen moet je zelf Java-code schrijven. Hou dit kort en bondig. Je hoeft

Nadere informatie

In BlueJ. Doe onderstaande met muis/menu s:

In BlueJ. Doe onderstaande met muis/menu s: In BlueJ Doe onderstaande met muis/menu s: Download en unzip het bestand sklok-run.zip en open het in BlueJ Maak een Schaakklok-object Voer herstart() uit voor dit object Vraag de resterende tijd op voor

Nadere informatie

Lab Webdesign: Javascript 3 maart 2008

Lab Webdesign: Javascript 3 maart 2008 H5: OPERATORS In dit hoofdstuk zullen we het hebben over de operators (of ook wel: operatoren) in JavaScript waarmee allerlei rekenkundige en logische bewerkingen kunnen worden uitgevoerd. Daarbij zullen

Nadere informatie

10 Meer over functies

10 Meer over functies 10 Meer over functies In hoofdstuk 5 hebben we functies uitgebreid bestudeerd. In dit hoofdstuk bekijken we drie andere aspecten van functies: recursieve functies dat wil zeggen, functies die zichzelf

Nadere informatie

Design principes.

Design principes. Design principes joost.vennekens@kuleuven.be Doelstelling Code die werkt doet wat klant wil betrouwbaar is gemakkelijk te veranderen is En dit ook blijft doen Software rot Rottende software geeft geurtjes

Nadere informatie

Zevende college Algoritmiek. 6 april Verdeel en Heers

Zevende college Algoritmiek. 6 april Verdeel en Heers Zevende college Algoritmiek 6 april 2018 Verdeel en Heers 1 Algoritmiek 2018/Backtracking Programmeeropdracht 2 Puzzel 2: D O N A L D G E R A L D + R O B E R T Elke letter stelt een cijfer voor (0,1,...,9)

Nadere informatie

Design principes.

Design principes. Design principes joost.vennekens@kuleuven.be Motivatie Software projecten mislukken vaker Vaker dan bouwkunde Vaker dan EM Vaker dan Oorzaak? Omgaan met verandering Vereisten Technologie Externe systemen

Nadere informatie

Datastructuren en algoritmen voor CKI

Datastructuren en algoritmen voor CKI Datastructuren en algoritmen voor CKI Jeroen Bransen 1 14 oktober 2015 1 met dank aan Hans Bodlaender en Gerard Tel Willekeurig gebouwde zoekbomen Willekeurig gebouwde zoekbomen Hoogte van zoekboom met

Nadere informatie

Tentamen Imperatief Programmeren

Tentamen Imperatief Programmeren Tentamen Imperatief Programmeren Maandag 22 oktober 2001 Toelichting Dit is een open boek tentamen, d.w.z. het cursusboek mag gebruikt worden. N.B.: Het tentamen is individueel: voor het maken van de opgaven

Nadere informatie

Tentamen in2705 Software Engineering

Tentamen in2705 Software Engineering Tentamen in2705 Software Engineering Voorbeeld (bijna tweemaal te groot) U mag meenemen naar dit tentamen: Lethbridge, afdrukken PPT slides, afdrukken handouts. 1. De TU wil een nieuw systeem ontwikkelen

Nadere informatie

NAAM: Programmeren 1 Examen 29/08/2012

NAAM: Programmeren 1 Examen 29/08/2012 Programmeren 29 augustus 202 Prof. T. Schrijvers Instructies Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien). Geef ook je kladbladen af. Bij heel wat vragen moet je

Nadere informatie

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Programmeren 1 23 januari 2013 Prof. T. Schrijvers Programmeren 1 23 januari 2013 Prof. T. Schrijvers Instructies Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien). Geef ook je kladbladen af. Bij heel wat vragen moet

Nadere informatie

Zelftest Inleiding Programmeren

Zelftest Inleiding Programmeren Zelftest Inleiding Programmeren Document: n0824test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST INLEIDING PROGRAMMEREN Deze

Nadere informatie

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

software constructie recursieve datastructuren college 15 5 stappen plan ontwerpen de software bestaat uiteindelijk uit datatypen functies software constructie recursieve datastructuren college 15 software engineering highlights 1 de software bestaat uiteindelijk uit datatypen functies verbindingen geven gebruik aan main is de top van het

Nadere informatie

Programmeren in Java 3

Programmeren in Java 3 26 september 2007 Deze les korte herhaling vorige les Unified Modelling Language notatie van een class afleiding pointers abstracte classes polymorphisme dubieuze(?) constructies interfaces Meer over class

Nadere informatie

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Zevende college algoritmiek. 23/24 maart Verdeel en Heers Zevende college algoritmiek 23/24 maart 2017 Verdeel en Heers 1 Algoritmiek 2017/Backtracking Tweede Programmeeropdracht 0 1 2 3 0 1 2 3 4 1 2 3 4 5 2 Algoritmiek 2017/Backtracking Tweede Programmeeropdracht

Nadere informatie

Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Tentamen Object Georiënteerd Programmeren TI1200 30 januari 2013, 9.00-12.00 Afdeling SCT, Faculteit EWI, TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Dit

Nadere informatie

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 ) OI 2010 Finale 12 Mei 2010 Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub VOORNAAM :....................................................... NAAM :..............................................................

Nadere informatie

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

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 c. het langste gerichte pad: 4 2 3 met lengte twee. d. het langste on -gerichte pad is oneindig lang: je mag bijvoorbeeld voortdurend tussen twee knopen heen en weer wandelen. e. ja: elke knoop heeft maximaal

Nadere informatie

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces.

Hoofdstuk 1: Inleiding. Hoofdstuk 2: Klassen en objecten Datahiding: afschermen van implementatiedetails. Naar de buitenwereld toe enkel interfaces. Hoofdstuk 1: Inleiding Objectoriëntatie: 1. Objecten & klassen: samenwerking van componenten om bepaald doel te bereiken; herbruikbaarheid. 2. Encapsulation: afschermen gedragingen en kenmerken van de

Nadere informatie

Inleiding tot Func.oneel Programmeren les 3

Inleiding tot Func.oneel Programmeren les 3 Inleiding tot Func.oneel Programmeren les 3 Kris Luyten, Jo Vermeulen {kris.luyten,jo.vermeulen}@uhasselt.be Exper.secentrum voor Digitale Media Universiteit Hasselt Currying Currying: een func.e met meerdere

Nadere informatie

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

Programmeermethoden. Recursie. week 11: november kosterswa/pm/ Programmeermethoden Recursie week 11: 21 25 november 2016 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Pointers Derde programmeeropgave 1 Het spel Gomoku programmeren we als volgt: week 1: pointerpracticum,

Nadere informatie

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk. HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een

Nadere informatie

Datastructuren en Algoritmen voor CKI

Datastructuren en Algoritmen voor CKI Ω /texmf/tex/latex/uubeamer.sty-h@@k 00 /texmf/tex/latex/uubeamer.sty Datastructuren en Algoritmen voor CKI Vincent van Oostrom Clemens Grabmayer Afdeling Wijsbegeerte Hoorcollege 5 16 februari 2009 Waar

Nadere informatie

Een inleiding in de Unified Modeling Language 67

Een inleiding in de Unified Modeling Language 67 Een inleiding in de Unified Modeling Language 67 1.4.5. Toepassing 5: Klasse Kaart. De opdracht bestaat erin algemene klassen te maken zodanig dat het mogelijk wordt om het even welk kaartspel te maken.

Nadere informatie

[15] Variabelen in functies (of: een woordje over scope)

[15] Variabelen in functies (of: een woordje over scope) [15] Variabelen in functies (of: een woordje over scope) In de vorige leerfiche hebben we geleerd over functies. We leerden dat functies parameters hebben en dat ze return-waarden kunnen teruggeven aan

Nadere informatie

Zevende college algoritmiek. 24 maart Verdeel en Heers

Zevende college algoritmiek. 24 maart Verdeel en Heers Zevende college algoritmiek 24 maart 2016 Verdeel en Heers 1 Verdeel en heers 1 Divide and Conquer 1. Verdeel een instantie van het probleem in twee (of meer) kleinere instanties 2. Los de kleinere instanties

Nadere informatie

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING DIAGNOSTISCHE TOETS Softwaresystemen datum: Donderdag van Week 7 UITWERKING Deze diagnostische toets bevat vragen over excepties en concurrency. Beantwoord de vragen zo goed mogelijk in 30 minuten Bespreek

Nadere informatie