3 Dynamisch (recursieve) datastructuren

Maat: px
Weergave met pagina beginnen:

Download "3 Dynamisch (recursieve) datastructuren"

Transcriptie

1 3 Dynamisch (recursieve) datastructuren Bij de ontwikkeling van programma s die grote hoeveelheden gegevens in het computergeheugen moeten opslaan, wordt heel vaak de mogelijkheid van dynamische variabelen (dus: waarbij met pointers verwezen wordt naar gegevens op de heap) uitgebreid wordt tot het wijzen naar gegevensrecords, waarin een of meer pointervelden zijn opgenomen, die op hun beurt weer (recursief) kunnen verwijzen naar andere gegevensrecords op de heap. Voorbeelden van veelgebruikte dynamische, recursieve datastructuren zijn: lineaire ( gelinkte ) lijsten binaire (zoek-) bomen dubbelgelinkte lijsten. We zullen hierna voorbeelden van deze datastructuren verder uitwerken. Bij al deze typen bestaat er een definitie van een gegevensrecordtype, waarbij in dat record een of meer pointervelden voorkomen; pointervelden van een zodanig type dat die pointers weer ( recursief ) kunnen doorverwijzen naar een of meer volgende records van hetzelfde type. TYPE DATAWIJZER = ^DATARECORD ; DATARECORD = RECORD Gegeven : GEGEVENSTYPE ; Wijzer : DATAWIJZER ; {evt. Wijzer2, etc.: DATAWIJZER } Uiteraard zal zo n zich recursief voortzettende streng van records ooit ergens moeten zijn begonnen en ooit ergens moeten eindigen. Dat laatste gebeurt door het pointerveld (of bij bomen: de pointervelden) van het laatste record een NIL-waarde te geven. Die situatie met een pointer als wortel (in het begin) naar een record, dat ook weer een of meerdere pointervelden heeft, is hiernaast schematisch weergegeven. Indien het record slechts één pointerveld heeft, kunnen we er een lineaire lijst mee gaan vormen. Twéé pointers naar volgende records zijn nodig voor (binaire) bomen en een pointer naar een volgend plus een pointer naar een vorig record worden gebruikt voor een dubbel gelinkte lijst. Wortel pointer naar volgend of vorig record pointer naar volgend Figuur 1 Schematische weergave recursief dynamisch datatype 3.1 Lineaire lijsten Lineair gelinkte lijsten kunnen in meerdere smaken voorkomen. Belangrijke smaken zijn enerzijds: wèl of nìet gesorteerd en anderzijds: toegang via alléén de wortel van de lijst of (ook) op andere manieren. Wortel NIL Figuur 2 Schematische weergave van een lineaire, via pointers gelinkte lijst We geven hierna in een voorbeeld allereerst type-definities en daarna een recursief geformuleerde procedure voor het tonen van de waarden in zo n lineaire lijst. TYPE ELEMENT = STRING [ 10 ] ; { of INTEGER e.d } LIJSTWIJZER = ^LIJSTRECORD ; 19

2 LIJSTRECORD = RECORD waarde : ELEMENT ; vervolg : LIJSTWIJZER PROCEDURE Toon_Lijst ( wijzer : LIJSTWIJZER ) ; IF wijzer = NIL THEN write ( ' --> NIL' ) write ( ' --> ', wijzer^.waarde ) ; Toon_Lijst ( wijzer^.vervolg ) {het recursieve aspect} {'RECURSIEVE versie'} Let erop, dat bij aanroepen van deze procedure een pointer naar (het begin van) een lijst als parameter moet worden meegegeven. Let erop, dat zo n recu rsief geformuleerde procedure ons erg gemakkelijk een oplossingsalgoritme voor het toon waarden van zo n lineaire lijst laat aangeven. Indien we te maken hebben met een lineaire lijst van veel records, dan zal zo n recursieve procedure snel stack overflow geven; in dat geval zullen we onze recursieve aanpak moeten vervangen door een iteratieve (dus: met een herhaling... zolang de pointer niet NIL is...). Een iteratieve versie van deze procedure zou de volgende kunnen zijn: PROCEDURE Toon_Lijst ( wijzer : LIJSTWIJZER ); WHILE NOT ( wijzer = NIL ) DO write ( ' --> ', wijzer^.waarde ) ; wijzer := wijzer^.vervolg writeln ( ' --> NIL' ) { ITERATIEVE versie'} Ga de werking van beide versies van deze Toon_Lijst-procedure na. Het is vrij eenvoudig om een functie te schrijven, die het aantal elementen in een lineaire lijst kan bepalen. We geven hier een recursieve uitwerking van zo n functie: FUNCTION Lijst_Lengte ( wijzer: LIJSTWIJZER ): INTEGER ; {RECURSIEVE versie} IF wijzer = NIL THEN Lijst_Lengte := 0 Lijst_Lengte := 1 + Lijst_Lengte ( wijzer^.vervolg ) Zet deze versie desgewenst zélf om in een iteratieve versie. Gecompliceerder wordt het toevoegen van waarden aan zo n (al dan niet gesorteerde) lineaire lijst en het verwijderen van records uit de lijst. In beide gevallen krijgen we te maken met pointer-algoritmiek (die vaak aanleiding tot fouten is). We gaan daar in de volgende paragrafen op in Toevoegen van een record aan een lineaire lijst Wortel NIL in te voegen datarecord : Figuur 3 Invoegen van record door verandering van pointerwaarden 20

3 Om het nieuwe record te kunnen invoegen, zal er altijd een (al dan niet: hulp )pointer naar toe moeten wijzen. De belangrijkste vraag bij het toevoegen van records aan een lineaire lijst is die van hoe, op welke plek in de lijst, moet het betreffende record toe/tussen-gevoegd worden?. Veel voorkomende mogelijkheden daarbij zijn: vooraan in de lijst toevoegen en bij weghalen weer dat element als eerste weghalen (LiFo: Last in First out) achteraan aan de lijst toevoegen en bij weghalen het eerste element weghalen (FiFo: First in First out) gesorteerd toevoegen volgens ordening van een datadeel-waarde We geven eerst een mogelijke procedure voor het steeds vooraan in de lijst plaatsen van een nieuw datarecord: PROCEDURE Voeg_voor_aan_lijst_toe (VAR lijstkopwijzer : LIJSTWIJZER; toe_te_voegen_waarde : ELEMENT ); VAR hulprecordwijzer : LIJSTWIJZER; new ( hulprecordwijzer ) ; hulprecordwijzer^.waarde := toe_te_voegen_waarde ; hulprecordwijzer^.vervolg := lijstkopwijzer ; { er tussen in wrotten } lijstkopwijzer := hulprecordwijzer Ga de werking van deze procedure na. We geven hierna een aantal onderdelen van een eenvoudig programma (met de toevoeg- procedure recursief geformuleerd) voor het toevoegen van lijst-elementen aan een gesorteerde lineaire lijst. PROCEDURE Voeg_toe_na ( VAR vervolgwijzer : LIJSTWIJZER ; toe_te_voegen_waarde : ELEMENT ) ; VAR hulprecordwijzer : LIJSTWIJZER; new ( hulprecordwijzer ); hulprecordwijzer^.waarde := toe_te_voegen_waarde ; hulprecordwijzer^.vervolg := vervolgwijzer ; vervolgwijzer := hulprecordwijzer 1 ) PROCEDURE Voeg_toe_aan_gesorteerde_lijst ( VAR wijzer: LIJSTWIJZER ; toe_te_voegen_waarde : ELEMENT ); { 'RECURSIEVE versie' } IF wijzer = NIL THEN Voeg_toe_na ( wijzer, toe_te_voegen_waarde ) IF toe_te_voegen_waarde < wijzer^.waarde THEN Voeg_toe_na ( wijzer, toe_te_voegen_waarde ) Voeg_toe_aan_gesorteerde_lijst( wijzer^.vervolg, toe_te_voegen_waarde) {hoofdprogramma} LijstKop := NIL ; Toon_Lijst ( LijstKop ); GotoXY(1,24); write ( 'Toe te voegen waarde (0 voor ''einde-invoer'') : ' ); readln ( toe_te_voegen_waarde ); WHILE toe_te_voegen_waarde <>'0' DO Voeg_toe_aan_gesorteerde_lijst ( LijstKop, toe_te_voegen_waarde); GotoXY(1,1); Toon_Lijst ( LijstKop ); GotoXY(1,24); write ('Toe te voegen waarde (0 voor ''einde-invoer'') : '); GotoXY(48,24); readln ( toe_te_voegen_waarde ). Indien je (b.v. vanwege dreigende stack overflow problemen) een iteratieve versie van een procedure Voeg toe aan gesorteerde lijst wilt maken, dan zul je met twéé hulppointers (die in de lijst onmiddelijk achter elkaar 1 Let op het taalgebruik ; interpreteer eerst de code van de procedure Voeg_toe_aan_gesorteerde_lijst en pas daarna die van de aangeroepen Voeg_toe_na. Interpreteer de naam Voeg_toe_na nu als: vanuit een bepaald lijstrecord wordt deze procedure aangeroepen met als parameter de vervolgwijzer. Als vervolgens besloten wordt het nieuwe record in te voegen, dan gebeurt dat dus nà het record vanwaaruit werd opgeroepen. 21

4 aanlopen ) door de lineaire lijst moet lopen; eentje ( huidige ) waarmee st eeds afgetast wordt of je met die pointer soms al te ver dóór geschoten bent of bij de NIL-pointer op het einde van de lijst bent terechtgekomen en een andere hulppointer ( vorige ) waarmee je steeds de positie (lees: de pointerwaarde) van het vorige lijstrecord onthoudt. Schematische aanpak voor zo n iteratieve variant: Wortel Vorige NIL 2 Huidige 3 in te voegen record 4 8 NIL <=Startsituatie NIL In dit voorbeeld gebruiken we records, die slechts bestaan uit een getalveld + een vervolgpointer. Stel nu dat we het getoonde in te voegen record aan de lijst willen toevoegen. We starten door de hulppointer Huidige eerst te laten wijzen naar het eerste lijstrecord (beter: we geven hem dezelfde [adres] waarde als de Wortel -pointer). Wortel Vorige Huidige in te voegen record NIL Vervolgens geven we in een iteratie de pointer Vorige de waarde van Huidige en schuiven die laatste steeds een plek op naar het adres waar eerder Huidige^.Vervolg naar toe wees. Wortel Vorige Huidige in te voegen record NIL Als we op deze manier op een gegeven moment aangekomen zijn op de juiste plek van invoegen, dan moeten we de waarden van de pointers Vorige^.Vervolg en In_te_voegen_record^.Vervolg zodanig aanpassen, dat het lineaire-lijst-aspect gehandhaaft blijft. Wortel Vorige Huidige 4 ingevoegd record <=Eindsituatie Hou ondertussen wel goed de lijststaart in de gaten! Ga zelf voor de geschetste eindsituatie de volgorde van de vervolg-pointers in de lineaire lijst na. Een uit te werken sjabloon voor zo n iteratieve aanpak is dan: maak via New ( Nieuw_Record_pointer ) dynamisch record; vul met toe te voegen waarde; zet pointer naar vorige record op NIL; zet boolean variabele gevonden op False ; initieer pointer huidige met de lijstkop; { ga nu op zoek naar de plaats waar het nieuwe record tussengeplaatst moet worden: } WHILE ( huidige <> NIL ) AND NOT gevonden DO IF toe_te_voegen_waarde > huidige^.waarde THEN vorige := huidige ; huidige := huidige^.vervolg gevonden := True ; { plaats nu het toe te voegen record er tussen / op zijn plaats } Nieuw_Record_pointer^.vervolg := huidige ; IF vorige = NIL THEN LijstKop := Nieuw_Record_pointer vorige^.vervolg := Nieuw_Record_pointer 22

5 3.1.2 Verwijderen van een record uit een lineaire lijst Wortel NIL Figuur 4 Verwijderen van een record uit een lineaire lijst door pointer-algoritmiek Ook bij verwijderen is de vraag weer: hoe en waar?. We geven hier een procedure om het voorste datarecord uit een lineaire lijst te laten verwijderen: PROCEDURE Haal_voorste_element_uit_lijst (VAR Lijstkopwijzer: LIJSTWIJZER); VAR hulprecordwijzer : LIJSTWIJZER; IF LijstKopWijzer = NIL THEN write ('Lijst is leeg!') hulprecordwijzer:= LijstKopWijzer^.vervolg ; Dispose ( LijstKopWijzer ); LijstKopWijzer := hulprecordwijzer Op een vergelijkbare manier is het uiteraard mogelijk om eerst (b.v. in een gesorteerde lijst) op zoek te gaan naar een record (d.m.v. het identificerende gegeven ervan) en dan dat record uit de lijst te verwijderen (vergeet dan niet om via Dispose(..) de door dat te verwijderen record gealloceerde geheugenruimte weer vrij te geven). We geven hier een recursieve uitwerking van het probleem. PROCEDURE Verwijder_uit_Lijst( te_verwijderen: ELEMENT; VAR wijzer : LIJSTWIJZER); VAR huidige : LIJSTWIJZER ; { recursieve versie } IF wijzer = NIL THEN write ( 'Lijst is leeg!' ) huidige := wijzer ; IF huidige^.waarde = te_verwijderen {hebbes; dit element verwijderen!} THEN Wijzer := huidige^.vervolg ; Dispose ( huidige ) { geef geheugenplaats vrij } { laat pointer naar volgende wijzen} Verwijder_uit_Lijst ( te_verwijderen, wijzer^.vervolg ) Desgewenst is ook deze verwijder-procedure om te zetten naar een iteratieve variant. Een alternatieve aanpak zou ook als volgt kunnen zijn: eerst zoeken of het te verwijderen element in de lijst zit en zoja, te onthouden wáár en dan op die aangewezen plek het betreffende record er uit te werken. Indien je een gesorteerde lineaire lijst hebt, dan is het eenvoudig om na te gaan of een bepaalde waarde in een record van die lijst voorkomt. We geven daarvoor de volgende (recursief geformuleerde) functie: FUNCTION Zit_in_Gesorteerde_Lijst ( wijzer : LIJSTWIJZER ; zoekwaarde : INTEGER ; VAR positie : INTEGER ) : BOOLEAN ; IF wijzer = NIL THEN Zit_in_Gesorteerde_Lijst := FALSE IF zoekwaarde < wijzer^.waarde THEN Zit_in_Gesorteerde_Lijst := FALSE IF zoekwaarde = wijzer^.waarde THEN inc ( positie ) ; Zit_in_Gesorteerde_Lijst := TRUE 23

6 inc ( positie ) ; Zit_in_Gesorteerde_Lijst := Zit_in_Gesorteerde_Lijst( wijzer^.vervolg, zoekwaarde, positie ) Indien voorgaande functie als functiewaarde true oplevert, dan is hier via de VAR-parameter positie tevens te achterhalen op welke plaats in de lijst de bij oproep meegegeven zoekwaarde is aangetroffen (afhankelijk van de vraagstelling, zou je die aangetroffen plaats ook via een pointer-waarde kunnen terugspelen). Door het via een pointer terugspelen van de plaats waar in een gesorteerde lijst het record voorafgaande aan een te verwijderen record zit, dan is het daarna relatief eenvoudig om met wat pointer-algoritmiek dat record uit de lijst te verwijderen (via een toekenning van iets als vorig^.vervolg := vorig^.vervolg^.vervolg en - indien gewenst- het via dispose vrijgeven van de gealloceerde geheugenruimte) Dynamische Stack s en Queue s Stack s en Queue s worden nìet noodzakelijkerwijs, maar wèl in het algemeen als dynamische datastructuren (met pointers) gerealiseerd. Beide typen zijn op te vatten als speciale uitwerkingen van een lineaire lijst. De verschillen/specialiteiten zijn als volgt: Stack: een datastructuur waarbij toevoegingen en verwijderingen van gegevens(records) steeds van éénzelfde kant plaatsvinden; Queue: een datastructuur waarbij toevoegingen en verwijderingen van gegevens(records) aan verschillende kanten plaatsvinden. Toevoegen: Stack: Toevoegen: Queue: Afhalen Afhalen Stack s Zoals gezegd vinden hierbij toevoegingen en verwijderingen van gegevens(records) steeds van éénzelfde kant plaats. Men spreekt wel vaak van een LiFo-stack: Last in First out. Bekende kreten bij stacks zijn: pop en push. Deze kreten staan voor: Push : zet/bewaar een waarde op de stack; meestal geef je zo n waarde als parameter mee Pop : haal een waarde van de stack af (meestal zal die opgehaalde waarde een VAR-parameter zijn). Als we zo n stack implementeren al s een dynamische lineaire lijst (zie aan het begin van dit hoofdstuk), dan kunnen we de push -operatie heel eenvoudig implementeren: PROCEDURE Push ( VAR Stackwijzer : LIJSTWIJZER ; toe_te_voegen_waarde : ELEMENT ); Voeg_voor_aan_lijst_toe ( Stackwijzer, toe_te_voegen_waarde ) Uiteraard is het mogelijk deze procedure direct te schrijven, zonder gebruik te maken van de procedures zoals we die bij lineaire lijsten hebben gezien. Voor de pop -procedure kunnen we niet eenvoudig weg een aanroep van de eerder besproken procedure Haal_voorste_element_uit_Lijst doen, omdat die procedure slechts dat voorste element verwijderde, maar het niet als (bijvoorbeeld) VAR-parameter-waarde terug gaf naar de plaats van aanroep. Een ietwat omslachtige maar wel luie uitwerking kan de volgende aanpassing zijn: PROCEDURE Pop ( VAR Stackwijzer : LIJSTWIJZER; VAR opgehaald : ELEMENT ); IF Stackwijzer <> NIL THEN opgehaald := Stackwijzer^.waarde ; { en pas hierna: verwijder dat eerste record: } Haal_voorste_element_uit_lijst ( Stackwijzer ) 24

7 3.1.5 Queue s Bij Queue s vinden toevoegingen en verwijderingen van gegevens(records) aan verschillende kanten plaats: dit wordt vaak aangeduid met de FiFo-aanpak: First in, First out. Het zal erg inefficiënt worden om voor zo n Queue een eenvoudige lineaire lijst te gebruiken; we zullen dan vaak de gehele lijst moeten volgen om (bij keuze om achteraan toe te voegen en vooraan weg te halen) aan de staart een gegeven toe te voegen. Het is veel efficiënter om niet alleen naar de kop, maar ook naar de staart van de queue een pointer te hebben. Een variant op een dubbelgelinkte lijst zou hier dus goed bruikbaar voor zijn Practicumopdracht over lineaire lijsten In de I:Voorb2ld-directory tref je een relatief groot getypeerd gegevensbestand Strings.dat aan, van meer dan duizend gedeeltelijk (via random-functies) gevulde STRING s (het bestand is dus getypeerd als een FILE OF STRING ; per string zijn in dit getypeerde bestand dus steeds 25 Bytes gereserveerd). Maak nu een programma waarmee je het volgende kunt doen: alle strings uit het gegevensbestand inlezen en in een (op stringwaarde) gesorteerde lineaire lijst plaatsen de stringwaarden van de lijst-elementen in die gesorteerde volgorde kunt laten zien alle stringwaarden tenslotte in die gesorteerde volgorde laat wegschrijven naar een TEXT-bestand (b.v. onder de naam Strings.txt ; controleer of alles goed gegaan is door met een editor dit TEXT -bestand in te laden en te kijken of het gesorteerd is en uit hoeveel tekst(onzin)regels het bestaat. Klopt dat met het uit het oorspronkelijke bestand ingelezen aantal stringrecords? zorg ervoor, dat uiteindelijk alle eerder bezette geheugenruimte weer vrij is gegeven (en controleer door gebruik te maken van de functie MemAvail of je dit inderdaad gelukt is). Hint: beperk in eerste instantie je programma dusdanig, dat je alleen b.v. de eerste 8 strings uit het bestand inleest en er verder mee werkt (dat gaat wat sneller en je hebt bij het trace n wat meer overzicht in wat er gebeurt). Breid het daarna pas uit tot het verwerken van alle strings uit het volledige bestand. Wel kan het zijn dat je dan ontdekt, dat een recursief geformuleerde oplossing niet meer werkt omdat je stack overflow krijgt en dat je dus je oplossing zult moeten omzetten naar een iteratieve aanpak. 3.2 Binaire (zoek-) bomen In het algemeen kan een binaire boom gedefinieerd worden als een boom die steeds twéé mogelijke vervolgdelen heeft (die elk ook weer een binaire boom zijn). Uiteraard kan een binaire boom ook leeg zijn; d.w.z. de pointer naar de wortel van een boom kan NIL zijn. Anders gedefinieerd: een binaire boom is òf leeg (NIL), of bestaat uit een datarecord met daarin twéé pointervelden, die op elk hun beurt NIL kunnen zijn of naar een linker- of een rechterzijtak verwijzen. Zo n zijtak is ook weer een binaire boom. Als mogelijke record-definitie voor het opzetten van zo n boomstructuur geven we: 2 Wortel pointer naar linker vervolgtak pointer naar rechter vervolgtak Figuur 5 Algemene recordstructuur binaire boom TYPE ELEMENT = STRING[]; { of INTEGER e.d. ;} BOOMWIJZER = ^BOOMBLAD; BOOMBLAD = RECORD Waarde : ELEMENT; Links, Rechts : BOOMWIJZER 2 N.B. deze record-definitie, maar ook alle verdere behandelde Pascal-code over binaire bomen, kun je op de I: -drive in de Voorb2ld-directory aantreffen onder de naam BinBoom.pas. 25

8 waarbij het begin van zo n boomstructuur gevonden kan worden via een pointervariabele als: VAR Wortel : BOOMWIJZER; Een speciaal (maar voor ons interessant) geval is daarbij de binaire zoekboom; waarbij (recursief) vanuit een bepaalde knoop geredeneerd, de sleutelwaarden in de records van de linker vervolgboom steeds kleiner (of gelijk) zijn aan de waarden van die knoop beschouwde en waarbij sleutelwaarden van knopen in de rechter vervolgboom steeds groter zijn dan die in die knoop. Een voorbeeld van een concrete invulling van zo n binaire zoekboom is de volgende: / \ 4 8 / \ / \ / \ / \ / \ / \ NIL 3 NIL NIL NIL NIL NIL NIL / \ NIL NIL Duidelijk is hierin te zien, dat: elk knoop-record twéé (mogelijke) verwijzingen naar een volgend record heeft ( die NIL kunnen zijn); dat het linker vervolg-record steeds een kleinere waarde heeft dan het knooprecord zèlf en het rechter vervolg-record net een grotere waarde heeft. Voorgaande boomstructuur is op het beeldscherm afgedrukt met de procedure: PROCEDURE Toon_Boom ( tak : BOOMWIJZER ; xcoord, ycoord, diepte : BYTE ); VAR xnieuw,ynieuw,i : INTEGER; GotoXY(xcoord,ycoord); IF tak = NIL THEN write('nil') write ( tak^.waarde,'':3 ); GotoXY ( xcoord-1, ycoord+1 ); write ('/ \'); ynieuw := ycoord + 2; { ga naar positie linkerblad (diepte+1,xnieuw,ynieuw): } xnieuw := xcoord - 80 DIV ((diepte+1)*(diepte+1)); GotoXY(xnieuw+2,ycoord+1); FOR i:=xnieuw TO xcoord-4 DO write('_'); Toon_Boom ( tak^.links, xnieuw, ynieuw, diepte+1 ); { ga naar positie rechterblad ( diepte+1, xnieuw, ynieuw ): } xnieuw := xcoord + 80 DIV ((diepte+1)*(diepte+1)); GotoXY(xcoord+3,ycoord+1); FOR i:=xcoord TO xnieuw-4 DO write('_'); Toon_Boom ( tak^.rechts, xnieuw, ynieuw, diepte+1 ) die aangeroepen werd via: Toon_Boom ( wortel, 39, 1, 1 ); teneinde de gehele boom op het scherm te kunnen tonen. N.B. laat je hierbij niet al te veel afleiden door de opmaak-code (met GotoXY... etc.) maar richt je vooral op de vetgedrukte (en eventuele cursieve) delen binnen deze procedure. Vanwege de gebruikte lay out zullen grotere bomen helaas onoverzichtelijk op het scherm worden getoond. Heel wat gemakkelijker wordt zo n Toon -procedure als je je geen zorgen over de layout hoeft te maken. Als we slechts onder elkaar de gesorteerde (sleutel)waarden van de bladeren van de eerder gebruikte binaire zoekboom op het scherm willen laten afdrukken, dan kan dat eenvoudig via de volgende procedure: PROCEDURE Toon_Boomwaarden_in_Volgorde ( Tak : BOOMWIJZER ); IF Tak <> NIL THEN Toon_Boomwaarden_in_Volgorde ( Tak^.Links ); writeln ( Tak^.Waarde ); Toon_Boomwaarden_in_Volgorde ( Tak^.Rechts ) 2

9 Ga de werking van deze procedure na en let wederom op de recursieve formulering ervan Het toevoegen van elementen aan een binaire boom De vraag of een boom-in-opbouw een gewone binaire boom of een binaire zoek-boom wordt, hangt geheel af van de wijze waarop de bladeren (lees: records) in die boom worden toegevoegd. Als dat toevoegen op een gestructureerde manier gebeurt, waarbij kleinere sleutelwaarden in de linker boomtak geplaatst worden en grotere in de rechter boomtak (dit alles vergeleken bij de sleutelwaarde in het blad waar de vervolgrichting bepaald moet worden), dan hebben we te maken met een binaire zoekboom. We geven daarvoor hier de toevoeg-procedure voor een eenvoudige binaire zoek-boom: PROCEDURE Voeg_Toe_aan_Boom ( VAR Tak: BOOMWIJZER; nieuwe_waarde: ELEMENT); IF Tak = NIL THEN New ( Tak ); WITH Tak^ DO Waarde := nieuwe_waarde; Links := NIL; Rechts := NIL IF nieuwe_waarde >= Tak^.Waarde THEN Voeg_Toe_aan_Boom ( Tak^.Rechts, nieuwe_waarde ) Voeg_Toe_aan_Boom ( Tak^.Links, nieuwe_waarde ) Let op het recursief geformuleerde karakter van deze procedure Verwijderen van elementen uit een (gesorteerde) binaire zoekboom Het verwijderen van een element (een knoop of blad ) uit een binaire boom is complexer dan bijvoorbeeld het toevoegen van een element. Er kunnen zich bij zo n verwijderen vier verschillende situaties voordoen: de te verwijderen knoop heeft géén verdere vertakkingen (d.w.z. beide vervolgwijzers zijn NIL ) de te verwijderen knoop heeft één verdere vertakkingen (en één NIL-vervolgwijzer) de te verwijderen knoop heeft twéé simpele verdere vertakkingen (en géén NIL-vervolgwijzer) de te verwijderen knoop heeft twéé complexe vertakkingen, die beiden vertakte bomen zijn. a) 5 b) c) d) e) Figure 1 Het verwijderen van ' knopen'uit een binaire boom 9 9 We bespreken deze mogelijkheden aan de hand van de volgende in de figuren geschetste voorbeelden. In de eerste figuur is aangegeven wat het resultaat moet zijn als onze nog op te stellen verwijder-algoritme op de boom wordt losgelaten, om allereerst (onderdeel a => b) de knoop met de waarde 4 te verwijderen en daarna achtereenvolgens de knopen met de waarden 3, 8 en 5. Omdat we ons probleem recursief willen oplossen, worden te verwijderen knopen aangeduid via een pointer, die bereikbaar is via de wortelwijzer van de boom. De eerste verwijdering van die knoop met waarde 4 is er een van het genoemde eerste type (deze knoop heeft géén verdere vertakkingen) en is eenvoudig uit te voeren: gooi die waarde weg (via dispose) en zet de oude pointer (vanuit de knoop met waarde 3 ) ernaartoe op NIL. 27

10 De tweede verwijdering van de knoop met waarde 3 is er een van het tweede type ( één verdere vertakking). We kunnen dan de waarde van de knoop vervangen door die van de eraan hangende volgende knoop; of beter: de pointer vanuit de bovenliggende knoop (hier: 5 ) ernaartoe, vervangen door een pointerwaarde naar de vervolgknoop (lees: 1 ) en de door de te verwijderen knoop bezette geheugenruimte vr ij geven (via dispose). De bij c) en d) aangeduide verwijderingen zijn beide van het genoemde derde type (met twéé simpele verdere vertakkingen, die beide of losse bladeren òf slechts aan één kant vertakte bomen zijn). In dit geval kunnen we ervoor kiezen om de waarde(n) van de te verwijderen knoop te vervangen door die van de linker vervolgknoop of van de rechter vervolgknoop (we hebben in onze implementatie gekozen voor links ). Een speciaal probleem doet zich echter voor als we beginnen met het verwijderen van de knoop met waarde 5, die zowel een vertakte linker als een vertakte rechter onderboom heeft. Om de ordening in de boom in stand te houden, zullen we iets speciaals moeten doen met de knopen met waarden 1, 3 en 4 (als we ervoor kiezen om iets met de linker onderboom te doen). We moeten dan (zie volgende figuur) -om de ordening te behouden- de waarde van 4 op de plaats van de te verwijderen knoop 5 plaatsen. Indien de onderbomen nog verder (naar beneden) vertakt zijn, dan moeten we bij onze keuze voor doe iets met de linker onderboom (de waarde(n) van) het meest rechtse blad uit die linker onderboom op de plaats van de te verwijderen knoop plaatsen. f) 5 g) Figure 2 Verwijderen van een knoop bij 2 vertakte onderbomen We geven hierna de bijbehorende (recursief geformuleerde) algoritme (met een lokale hulpprocedure voor het implementeren van het besproken probleem bij twee vertakte onderbomen): PROCEDURE Verwijder_uit_Boom ( VAR Tak : BOOMWIJZER; oude_waarde : ELEMENT); VAR hulpwijzer : BOOMWIJZER ; PROCEDURE Vervang_deze_knoop_door ( VAR Knoop : BOOMWIJZER ) ; IF Knoop^.Rechts <> NIL THEN { pak knoop verder naar rechts } Vervang_deze_knoop_door ( Knoop^.Rechts ) hulpwijzer^.waarde := Knoop^.Waarde ; hulpwijzer := Knoop ; Knoop := Knoop^.Links IF Tak = NIL THEN write ( 'Waarde komt niet voor in boom!' ) IF oude_waarde > Tak^.Waarde THEN Verwijder_uit_boom ( Tak^.Rechts, oude_waarde ) IF oude_waarde = Tak^.Waarde THEN { hebbes; deze knoop moet verwijderd worden } hulpwijzer := Tak ; IF hulpwijzer^.rechts = NIL THEN Tak := hulpwijzer^.links IF hulpwijzer^.links = NIL THEN Tak := hulpwijzer^.rechts Vervang_deze_knoop_door ( Tak^.Links ) ; Dispose ( hulpwijzer ) Verwijder_uit_boom ( Tak^.Links, oude_waarde ) 28

11 3.2.3 Het (snel) opzoeken van waarden in een binaire zoekboom Binaire zoek-bomen worden in de praktijk gebruikt voor het zeer snel kunnen opzoeken van waarden. Hier volgt de invulling van een mogelijke functie voor het laten bepalen of een bepaalde waarde wel/niet in een binaire zoek-boom voorkomt: FUNCTION Waarde_in_boom ( Tak: BOOMWIJZER; zoekwaarde: INTEGER ) : BOOLEAN; IF Tak = NIL THEN Waarde_in_boom := FALSE IF Tak^.Waarde = zoekwaarde THEN Waarde_in_boom := TRUE IF Tak^.Waarde < zoekwaarde THEN Waarde_in_boom := Waarde_in_boom ( Tak^.Rechts, zoekwaarde) Waarde_in_boom := Waarde_in_boom ( Tak^.Links, zoekwaarde ) Voor het héél snel kunnen vinden van waarden in een binaire zoek-boom is het nodig dat de boom min of meer uitgebalanceerd is; dat wil zeggen dat in elke knoop de diepte van de linkertak en die van de rechtertak hooguit één eenheid van elkaar verschillen. In zo n uitgebalanceerde binaire boom met een diepte van 10 kunnen in totaal ruim duizend gegevensrecords ( knopen ) geplaatst worden; het kunnen plaatsen van een miljoen records vereist een diepte van 20. Voor het laten bepalen of een binaire boom wel dan niet uitgebalanceerd is, kunnen we vrij gemakkelijk de minimale en de maximale diepte van de verschillende takken van de boom laten bepalen. We geven hierna een recursieve uitwerking daarvan. FUNCTION Grootste_Diepte ( Tak : BOOMWIJZER ) : INTEGER ; IF Tak = NIL THEN Grootste_Diepte := 0 Grootste_Diepte := 1 + Maximum ( Grootste_Diepte ( Tak^.Rechts), Grootste_Diepte ( Tak^.Links) ) FUNCTION Kleinste_Diepte ( Tak : BOOMWIJZER ) : INTEGER ; IF Tak = NIL THEN Kleinste_Diepte := 0 Kleinste_Diepte := 1 + Minimum ( Kleinste_Diepte( Tak^.Rechts), Kleinste_Diepte( Tak^.Links) ) De door de eerste functie aangeroepen hulpfunctie Maximum (met door de tweede functie als lichte va riant: Minimum ) is: FUNCTION Maximum ( getal1, getal2 : INTEGER ) : INTEGER ; IF getal1 > getal2 THEN Maximum := getal1 Maximum := getal2 Het uitbalanceren van bomen (vooral vaak nodig na toevoegingen of verwijderingen van records uit de boom) valt echter buiten het kader van deze cursus (voor geïnteresseerden: zie b.v. de klassieker van Niklaus Wirth: Algoritmen und Datastrukturen of de engelstalige versie van dit boek). Bekijk het volgende voorbeeld om een idee te krijgen van hoe zo n uitbalanceren van bomen in zijn werk gaat. h) i) j) Figure 3 Het uitbalanceerproces van een binaire zoekboom 29

12 Voor alledrie de getoonde bomen geldt, dat het (geordende) zoekbomen zijn. De linker (en de middelste) boom heeft echter een kleinste en een grootste diepte van resp. 2 en 4 en is nìet uitgebalanceerd. In de figuur wordt de linker boom in twee stappen, via zogenaamde links - en rechts -rotaties, omgezet in de wèl uitgebalanceerde rechter boom. Voor de benodigde algoritmiek verwijzen we naar de literatuur. Uitgebalanceerde zoekbomen noemt men (naar hun ontdekkers Adelson -Velskii en Landis) ook wel AVL-bomen Complexere recordstructuur op de knopen/bladen van een binaire boom Uiteraard is het mogelijk om de recordstructuur van de boombladeren voor wat betreft het gegevensdeel veel complexer te maken. In het volgend plaatje is b.v. zowel de recordstructuur aangepast (om ook het aantal voorkomens van een sleutelwaarde te onthouden) en de eerder gegeven toon boom -procedure: (2x) / \ 3(4x) 9(2x) / \ / \ 2 5(2x) 8 NIL / \ / \ / \ NIL NIL 4(2x) NIL 7(2x) NIL / \ / \ NIL NIL NIL NIL Let erop, dat ook deze boom nìet uitgebalanceerd is (met minimale en maximale diepte resp.: 2 en 4 ). Op een soortgelijke manier zou je bijvoorbeeld studentgegevens in een zoekboom kunnen hangen, waarbij als sleutelwaarde het studentnummer wordt gebruikt. Als je dan op studentnoemer zoekt, kom je bij een ergens in de boom gehangen compleet record met overige studentgegevens terecht (die je op kunt vragen en/of waar je veranderingen in kunt aanbrengen). 3.3 Dubbelgelinkte (pointer-)lijsten In een dubbelgelinkte (pointer-) lijst is elk opgenomen record via een pointer zowel verbonden met een volgend als (door een tweede pointer) met een voorgaand record. Schematisch kunnen we dat als volgt weergeven: Data NIL Data Data Data NIL Kop Wijzer? Staart Figure 4 (mogelijk) voorbeeld van een dubbelgelinkte lijst Een dergelijke datastructuur kan opgebouwd worden via een volgende TYPE-definitie: TYPE DGLIJSTWIJZER = ^DGLIJSTRECORD ; DGLIJSTRECORD = RECORD Waarde : ELEMENT ; Volgend, Vorig : DGLIJSTWIJZER Het voordeel van zo n dubbelgelinkte lijst is, dat je vanuit een gegevensrecord zowel naar het volgende als naar het vorige record kunt gaan. Toevoegingen, wijzigingen en -vooral- verwijderingen kunnen hierdoor veel gemakkelijker plaatsvinden. De lijst is zowel via de kop als via de staart benaderbaar. Ook is het bij dit type lijst mogelijk om een hulpwijzer op een record in de lijst te laten wijzen en dan dat record te verwijderen door de pointers in het voorafgaande en het volgende record aan te passen. 30

13 N.B. 1) In de geschetste figuur vormen het eerste en het laatste record een uitzondering op deze net gegeven omschrijving; (alleen) in deze twee records komen NIL-pointers voor. Een veel gebruikte variant is daarom, om als eerste en als laatste record een zogenaamd sentinel-record ( schildwacht ) te plaatsen en die schildwacht -records circulair naar elkaar te laten verwijzen. Het eerste sentinel-record wordt dan een onmogelijk lage sleutelwaarde gegeven (zoals 0000 of aaaa of -MAXINT of zoiets) en het laatste een onmogelijk hoge sleutelwaarde ( 9999, +MAXINT, zzzzz of iets in die trant). Er kan dan immers vanwege dat circulaire niet meer gecontroleerd worden op het bereiken van een NILwaarde (die zijn er dan immers niet meer). 2) Er zijn diverse varianten van dubbelgelinkte lijsten mogelijk. In principe zou één enkele pointer naar een record van een dubbelgelinkte lijst voldoende zijn om de de gehele lijst (naar voren en naar achteren) te kunnen doorlopen. Een veel gehanteerde aanpak is om één pointer naar de kop te laten wijzen, één pointer naar de staart en [minimaal] nog eentje naar het record waar op dat moment de aandacht op gevestigd is. We geven hier een uitgewerkt voorbeeld van het werken met dubbelgelinkte lijsten. We doen dat met dezelfde definitie van een Studentrecord als in het vorige hoofdstuk en gaan (via een voor een inlezen van records uit een getypeerd bestand) deze records in een dubbelgelinkte lijst plaatsen. We geven eerst het aansturend hoofdprogramma en vervolgens de inhoud van een unit Lijsten : Program TestLijst; { Opdracht over het werken met pointers} Uses Crt, Studenten, Lijsten; VAR bestand : FStudent; student : RStudent; OpenStudentBestand ( bestand ); WHILE NOT EOF( bestand ) DO Read ( bestand, student ); Add( student ); { While }; Close( bestand ); Show;. Unit Lijsten; Interface Uses Studenten, Crt; TYPE PEStudent = ^REStudent ; REStudent = RECORD last : PEstudent ; stud_ptr : PStudent ; next : PEStudent PROCEDURE Add ( student : RStudent ) ; PROCEDURE Show ; In deze recorddefinitie zien we duidelijk, dat een REStudent-record uit drie pointervelden bestaat: een last - en een next -pointer staan naar respectievelijk een vorig en een volgend (REStudent-) record en een stud_ptr - pointer verwijst naar een studentrecord (dat hadden we toch al ; we hadden hier natuurlijk geen pointerveld naar zo n studentr ecord hoeven op te nemen, dat had ook b.v. een veld deze_student van het type Rstudent kunnen zijn). De functie van die stud_ptr wordt in de volgende figuur weergegeven: 31

14 De functie van het last - en het next -pointerveld wordt hierna geschetst. Naast de figuur wordt (bij het implementatie-deel van de procedure Init ) de code gegeven voor het initialiseren van deze dubbelgelinkte lijst, waarbij aan het begin én aan het einde die schilwacht-records worden geplaatst. Implementation VAR kop, wijzer, staart : PEStudent; PROCEDURE Init ( VAR kop, wijzer, staart : PEStudent); {Maak schildwachtknopen:} New ( kop ); New(kop^.stud_ptr); InitStudent(kop^.stud_ptr^); { deze sentinel heeft naam zo klein mogelijk; immers } New(staart); New(staart^.stud_ptr); InitStudent(staart^.stud_ptr^ ); { Laatste schildwacht met naam alfabetisch zo groot mogelijk: } staart^.stud_ptr^.naam := 'zzzzz'; wijzer := staart; { Verbind schildwachten circulair: } kop^.next := staart ; kop^.last := staart ; staart^.next := kop ; staart^.last := kop { Init }; PROCEDURE Add ( student : RStudent ); VAR p : PEStudent; WHILE ( wijzer^.stud_ptr^.naam > student.naam ) DO wijzer := wijzer^.last; WHILE ( wijzer^.stud_ptr^.naam <= student.naam ) DO wijzer := wijzer^.next; New ( p ); New ( p^.stud_ptr ); p^.stud_ptr^ := student; { kopieer de parameter-record-inhoud } p^.next := wijzer; p^.last := wijzer^.last; wijzer^.last^.next := p; wijzer^.last := p; wijzer := p; { Add }; PROCEDURE Show; VAR p : PEStudent; p := kop^.next; WHILE p <> staart DO ToonStudent( p^.stud_ptr ); 32

15 p := p^.next; { While }; { Show }; { Initialisatie Lijsten } Init ( kop, wijzer, staart ); { Unit Lijsten }. Het tussen de aan de uiteinden van de lijst staande schilwacht-records toevoegen van een nieuw record gaat (zie code in voorgaande procedure Add schematisch als volgt: new(p); new(p^.stud_ptr); p^.stud_ptr^ := student; En vervolgens: p^.next := wijzer; p^.last := wijzer^.last; wijzer^.last^.next := p; wijzer^.last := p; wijzer := p; 33

16 3.3.1 Practicumopdracht over binaire zoekbomen In de taal Pascal bestaan een aantal gereserveerde woorden, zoals,, FOR, etc.. In deze opdracht moet je eerst al deze gereserveerde woorden in een binaire zoekboom plaatsen en daarvan gebruik maken om van een (via de bestandsnaam aan te duiden) Pascal-programma te laten analyseren op het (hoe vaak) voorkomen van elk van deze woorden. De (uitgebalanceerde) zoekboom ziet er als volgt uit: LABEL / \ SET / \ / \ CONST FUNCTION PROCEDURE UNTIL / \ / \ / \ / \ DO FILE IF NIL RECORD TO WHILE / \ / \ / \ / \ / \ / \ / \ / \ ARRAY CASE DIV DOWNTO FOR GOTO IN MOD OF PROGRAM REPEAT THEN TYPE VAR WITH In de I:voorb2ld-directory tref je een TEXT-bestand Psleutel.txt aan, waarin deze bekende PASCAL - gereserveerde woorden, per regel steeds één woord in hoofdletters, zijn opgeslagen. Maak nu een programma waarmee je het volgende kunt doen: laat de gegeven gereserveerde woorden inlezen en plaats ze in een binaire zoekboom, waarbij in z on gegevensrecord niet alleen het betreffende woord, maar voorlopig ook een 0 als reeds gevonden aantal_voorkomens van dat woord is opgenomen (zie bovenstaande schetsmatige boomstructuur); laat de gebruiker nu de naam van een reeds bestaand Pascal-programma-bestand intikken; het programma moet nu regel-voor-regel van het aangeduide Pascal-programma-bestand inlezen, in het computergeheugen (d.w.z. in gewone statische variabelen) per regel de (losse) woorden isoleren, ze om zetten in hoofdletters en tenslotte van alle (in hoofdletters omgezette) woorden in de eerder opgebouwde zoekboom nagaan of het betreffende woord een gereserveerd Pascal-woord is. Indien dat zo is, dan moet in de boom bij dat woord de waarde in het gegevensveld met het aantal voorkomens van dat woord met één verhoogd worden. laat tenslotte een alfabetisch gerangschikt overzicht van gereserveerde Pascal-woorden en het aantal keren dat elk woord in het programma is aangetroffen op het scherm verschijnen. verzin zèlf een manier om de door de zoekboom gealloceerde geheugenruimte vrij te geven en implementeer die (en test uit). N.B. de volgorde van de woorden in het bestand Psleutel.txt is reeds zodanig, dat bij normaal opbouwen de verkregen binaire zoek-boom uitgebalanceerd is. 34

7 Omzetten van Recursieve naar Iteratieve Algoritmen

7 Omzetten van Recursieve naar Iteratieve Algoritmen 7 Omzetten van Recursieve naar Iteratieve Algoritmen Het lijkt mogelijk om elke oplossings-algoritme, die vaak in eerste instantie recursief geformuleerd werd, om te zetten in een iteratieve algoritme

Nadere informatie

Pascal uitgediept Data structuren

Pascal uitgediept Data structuren Pascal uitgediept Data structuren MSX Computer & Club Magazine nummer 68-juni/juli 1994 Herman Post Scanned, ocr ed and converted to PDF by HansO, 2001 In deze aflevering wordt bekeken hoe zelf een datastructuur

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

Faculteit Economie en Bedrijfskunde

Faculteit Economie en Bedrijfskunde Faculteit Economie en Bedrijfskunde Op dit voorblad vindt u belangrijke informatie omtrent het tentamen. Voordat u met het tentamen t: lees dit voorblad! Tentamen: V&O IV: Programmeren Tentamendatum &

Nadere informatie

Datastructuren Uitwerking jan

Datastructuren Uitwerking jan Datastructuren Uitwerking jan 2015 1 1a. Een abstracte datastructuur is een beschrijving van een datastructuur, met de specificatie van wat er opgeslagen wordt (de data en hun structuur) en welke operaties

Nadere informatie

Programmeren Blok B. Onderwerpen. wstomv/edu/2ip05/ College 8. Tom Verhoeff

Programmeren Blok B. Onderwerpen.   wstomv/edu/2ip05/ College 8. Tom Verhoeff Programmeren Blok B Onderwerpen http://www.win.tue.nl/ wstomv/edu/2ip05/ College 8 Tom Verhoeff Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica Software Engineering & Technology Verdelen

Nadere informatie

Variabelen en statements in ActionScript

Variabelen en statements in ActionScript Ontwikkelen van Apps voor ios en Android Variabelen en statements in ActionScript 6.1 Inleiding Als we het in de informatica over variabelen hebben, bedoelen we een stukje in het geheugen van de computer

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

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

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren Achtste college algoritmiek 12 april 2019 Verdeel en Heers Dynamisch Programmeren 1 Uit college 7: Partitie Partitie Partitie(A[l r]) :: // partitioneert een (sub)array, met A[l] als spil (pivot) p :=

Nadere informatie

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Wat is scripting?

Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Wat is scripting? Inhoud Computervaardigheden Hoofdstuk 4 Scripting (Let op: dit is enkel voor studenten Biologie.) Dit hoofdstuk bekijkt heel kort de basis van scripting. - Opstellen van functies. - Conditionele code.

Nadere informatie

{ auteur, toelichting }

{ auteur, toelichting } Programmeren Blok A Trilogie van (programmeer)talen http://www.win.tue.nl/ wstomv/edu/ip0/ College Syntaxis (vormleer): Hoe ziet t eruit, hoe schrijf je t? Tom Verhoeff Technische Universiteit Eindhoven

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

Hoofdstuk 7: Werken met arrays

Hoofdstuk 7: Werken met arrays Programmeren in Microsoft Visual Basic 6.0, lessenserie voor het voortgezet onderwijs HAVO/VWO David Lans, Emmauscollege, Marnix Gymnasium Rotterdam, januari 2004 Hoofdstuk 7: Werken met arrays 7.0 Leerdoel

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

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

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

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

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

OPDRACHT Opdracht 2.1 Beschrijf in eigen woorden wat het bovenstaande PSD doet. Les C-02: Werken met Programma Structuur Diagrammen 2.0 Inleiding In deze lesbrief bekijken we een methode om een algoritme zodanig structuur te geven dat er gemakkelijk programmacode bij te schrijven

Nadere informatie

B2: Algoritmen, Datastructuren en Objectprogrammeren Zoekalgoritmen

B2: Algoritmen, Datastructuren en Objectprogrammeren Zoekalgoritmen 5 Zoekalgoritmen Inleiding In de B1-cursus heb je al kennis gemaakt met eenvoudige zoek-algoritmen voor het zoeken in al dan niet gesorteerde rijen. Voor het verkrijgen van meer overzicht over een aantal

Nadere informatie

Dynamisch Programmeren. Het Rugzakprobleem

Dynamisch Programmeren. Het Rugzakprobleem INLEIDING Dynamisch Programmeren 1 Dynamisch Programmeren Section Page Inleiding................................................. 1 1 Oplossing................................................ 2 2 Subprobleem.............................................

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

Cursus Algoritmiek - - - najaar 2005

Cursus Algoritmiek - - - najaar 2005 Cursus Algoritmiek - - - najaar 2005 Practicumopdracht 4 : werken met kale gegevensbestanden 1. Achtergrond In de 2 e en de 3 e practicumopdracht heb je al kennis gemaakt met het via het toetsenbord laten

Nadere informatie

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Uitwerking tentamen Analyse van Algoritmen, 29 januari Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007. (a) De buitenste for-lus kent N = 5 iteraties. Na iedere iteratie ziet de rij getallen er als volgt uit: i rij na i e iteratie 2 5 4 6 2 2 4

Nadere informatie

{ specificatie (contract) en toelichting }

{ specificatie (contract) en toelichting } Programmeren Blok A Drie aspecten van routines http://www.win.tue.nl/ wstomv/edu/2ip05/ College 5 Kees Hemerik Tom Verhoeff Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica Software

Nadere informatie

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007 Uitgebreide uitwerking Tentamen Complexiteit, mei 007 Opgave. a. Een beslissingsboom beschrijft de werking van het betreffende algoritme (gebaseerd op arrayvergelijkingen) op elke mogelijke invoer. In

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

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

Small Basic Programmeren Text Console 2

Small Basic Programmeren Text Console 2 Oefening 1: Hoogste getal Je leest een reeks positieve gehele getallen in totdat je het getal 0 (nul) invoert. Daarna stopt de invoer en druk je een regel af met het hoogste getal uit de reeks. Voorbeeld:

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

Indexen.

Indexen. Indexen joost.vennekens@kuleuven.be Probleem Snel gegevens terugvinden Gegevens moeten netjes geordend zijn Manier waarop hangt af van gebruik Sequentieel Gesorteerde gegevens, die in volgorde overlopen

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

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

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010 Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2009-2010 16 juni, 2010 **BELANGRIJK** 1. Schrijf je naam onderaan op elk blad. 2.

Nadere informatie

{ specificatie (contract) en toelichting }

{ specificatie (contract) en toelichting } Programmeren Blok B Drie aspecten van routines http://www.win.tue.nl/ wstomv/edu/2ip05/ College 7 Tom Verhoeff Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica Software Engineering &

Nadere informatie

4EE11 Project Programmeren voor W. College 3, 2008 2009, Blok D Tom Verhoeff, Software Engineering & Technology, TU/e

4EE11 Project Programmeren voor W. College 3, 2008 2009, Blok D Tom Verhoeff, Software Engineering & Technology, TU/e 4EE11 Project Programmeren voor W College 3, 2008 2009, Blok D Tom Verhoeff, Software Engineering & Technology, TU/e 1 Onderwerpen Grotere programma s ontwerpen/maken Datastructuren en algoritmes 2 Evolutie,

Nadere informatie

Turbo Pascal (deel 1)

Turbo Pascal (deel 1) Turbo Pascal (deel 1) MSX CLUB MAGAZINE 34 Erik van Bilsen Scanned, ocr ed and converted to PDF by HansO, 2001 Erik van Bilsen leert u het klappen van de Turbo Pascal zweep. Turbo Pascal toepassen Deze

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

Amorized Analysis en Union-Find Algoritmiek

Amorized Analysis en Union-Find Algoritmiek Amorized Analysis en Union-Find Vandaag Amortized analysis Technieken voor tijdsanalyse van algoritmen Union-find datastructuur Datastructuur voor operaties op disjuncte verzamelingen Verschillende oplossingen

Nadere informatie

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, 10.00 13.00 uur Opgave 1. a. Een toestand wordt bepaald door: het aantal lucifers op tafel, het aantal lucifers in het bezit van Romeo,

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

Tutorial 1, Delphi: Geldspraak

Tutorial 1, Delphi: Geldspraak Tutorial 1, Delphi: Geldspraak Versie Datum Auteurs Opmerkingen 1 25-09-2001 Kees Hemerik (code) Gebaseerd op Delphi 5 Enterprise. Roel Vliegen (tekst) 2 17-03-2005 Kees Hemerik Aanpassingen: Delphi 7,

Nadere informatie

UNIVERSITEIT ANTWERPEN FACULTEIT WETENSCHAPPEN DEPARTEMENT WISKUNDE-INFORMATICA OBERON CODE CONVENTIONS

UNIVERSITEIT ANTWERPEN FACULTEIT WETENSCHAPPEN DEPARTEMENT WISKUNDE-INFORMATICA OBERON CODE CONVENTIONS UNIVERSITEIT ANTWERPEN FACULTEIT WETENSCHAPPEN DEPARTEMENT WISKUNDE-INFORMATICA OBERON CODE CONVENTIONS Laatste aanpassing: 15 oktober 2003 Inhoudsopgave 1 Bestandsnamen 3 2 Organizatie Bestanden 3 3 Indentatie

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

Tiende college algoritmiek. 14 april Gretige algoritmen

Tiende college algoritmiek. 14 april Gretige algoritmen College 10 Tiende college algoritmiek 1 april 011 Gretige algoritmen 1 Greedy algorithms Greed = hebzucht Voor oplossen van optimalisatieproblemen Oplossing wordt stap voor stap opgebouwd In elke stap

Nadere informatie

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at www.pyrrho.

Automatisering voor Financiële Dienstverleners. Werken met Queries en Merge Documenten. For more information visit our website at www.pyrrho. Automatisering voor Financiële Dienstverleners Werken met Queries en Merge Documenten For more information visit our website at www.pyrrho.com Date: Document Nr: 30 maart, 2007 UBizzMerge, Versie 4.0 Status:

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

Programmeermethoden NA. Week 6: Lijsten

Programmeermethoden NA. Week 6: Lijsten Programmeermethoden NA Week 6: Lijsten Kristian Rietveld http://liacs.leidenuniv.nl/~rietveldkfd/courses/prna2016/ Getal opbouwen Stel je leest losse karakters (waaronder cijfers) en je moet daar een getal

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

Waarden persistent (blijvend) opslaan gaat in bestanden (files). Lege tekst: eof

Waarden persistent (blijvend) opslaan gaat in bestanden (files). Lege tekst: eof Programmeren Blok A Persistente opslag van waarden http://www.win.tue.nl/ wstomv/edu/2ip05/ College 4 Tom Verhoeff Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica Software Engineering

Nadere informatie

Tiende college algoritmiek. 26 april Gretige algoritmen

Tiende college algoritmiek. 26 april Gretige algoritmen Algoritmiek 01/10 College 10 Tiende college algoritmiek april 01 Gretige algoritmen 1 Algoritmiek 01/10 Muntenprobleem Gegeven onbeperkt veel munten van d 1,d,...d m eurocent, en een te betalen bedrag

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

BLOK 3 HOOFDSTUK 8 PARAGRAAF 2

BLOK 3 HOOFDSTUK 8 PARAGRAAF 2 BLOK 3 HOOFDSTUK 8 PARAGRAAF 2 4-BITS DEMOCOMPUTER IN 1000 STO R0 0000 opdracht tot opslaan 0000 waar moet het worden opgeslagen IN 1000 LD R1 0011 opdracht tot kopiëren 0000 welk adres moet gekopieerd

Nadere informatie

HomeOffice to ASCII Teksten converteren

HomeOffice to ASCII Teksten converteren HomeOffice to ASCII Teksten converteren Marco Soijer MCCM 65 Scanned, ocr ed and converted to PDF by HansO, 2001 Dit al enige tijd geleden ingezonden programma zet tekstbestanden, gemaakt met Home Office

Nadere informatie

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

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010 Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2009-2010 16 juni, 2010 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief

Nadere informatie

Practicumopdracht 8 : Recursief bomen tekenen en complexiteit van algoritmen

Practicumopdracht 8 : Recursief bomen tekenen en complexiteit van algoritmen Cursus Algoritmiek - - - najaar 2005 Practicumopdracht 8 : Recursief bomen tekenen en complexiteit van algoritmen Ook deze opdracht is bedoeld voor 2 weken: 1 e week t/m deelopdracht 8.2 ; maak in de 2

Nadere informatie

10. Mijn eerste programma

10. Mijn eerste programma 10. Mijn eerste programma Een korte handleiding voor het invoeren en editten van programmatekst voor een pseudotaal programma. In dit hoofdstuk wordt beschreven hoe je je allereerste pseudotaal programma

Nadere informatie

Cursus Onderwijs en ICT. Programmeren met Visual Basic

Cursus Onderwijs en ICT. Programmeren met Visual Basic Cursus Onderwijs en ICT Jaargang 2, deel 23 (versie 1.0 NL 2-7-2011) Programmeren met Visual Basic door Serge de Beer Inleiding In sommige gevallen biedt het aanbod op de softwaremarkt niet wat je zoekt.

Nadere informatie

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

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search Algoritmiek 2018/Toestand-actie-ruimte Vierde college algoritmiek 2 maart 2018 Toestand-actie-ruimte Exhaustive Search 1 Algoritmiek 2018/Toestand-actie-ruimte Kannen Voorbeeld 4: Kannenprobleem We hebben

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

Het minimale aantal sleutels op niveau h is derhalve

Het minimale aantal sleutels op niveau h is derhalve 1 (a) In een B-boom van orde m bevat de wortel minimaal 1 sleutel en maximaal m 1 sleutels De andere knopen bevatten minimaal m 1 sleutels en maximaal m 1 sleutels (b) In een B-boom van orde 5 bevat elke

Nadere informatie

Hoofdstuk 5: Functies voor getallen en teksten

Hoofdstuk 5: Functies voor getallen en teksten Programmeren in Microsoft Visual Basic 6.0, lessenserie voor het voortgezet onderwijs HAVO/VWO David Lans, Emmauscollege, Marnix Gymnasium Rotterdam, maart 2001 Hoofdstuk 5: Functies voor getallen en teksten

Nadere informatie

Methode: Verdeel en heers

Methode: Verdeel en heers Programmeren Blok B Thema: Complexiteit beteugelen http://www.win.tue.nl/ wstomv/edu/ip05/ College Tom Verhoeff Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica Software Engineering

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

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

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

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument Complexiteit 2019/04 College 4 Vierde college complexiteit 26 februari 2019 Beslissingsbomen en selectie Toernooimethode Adversary argument 1 Complexiteit 2019/04 Zoeken: samengevat Ongeordend lineair

Nadere informatie

Bijlage Inlezen nieuwe tarieven per verzekeraar

Bijlage Inlezen nieuwe tarieven per verzekeraar ! Bijlage inlezen nieuwe tarieven (vanaf 3.2) Bijlage Inlezen nieuwe tarieven per verzekeraar Scipio 3.303 biedt ondersteuning om gebruikers alle tarieven van de verschillende verzekeraars in één keer

Nadere informatie

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

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011 Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2010-2011 21 juni 2011 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief

Nadere informatie

TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica

TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica TWl(0)9O Inleiding Programmeren Tentamen 16 maart 2017, 9:00-12:00 uur Normering: Opgave 1 t/m 3 ieder 6 punten. Score:

Nadere informatie

Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00

Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00 Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00 TU/e Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica (Na de toets gecorrigeerde versie) PROBLEEM: Sleutels Lees

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

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

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/ Programmeermethoden Recursie Walter Kosters week 11: 20 24 november 2017 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Vierde programmeeropgave 1 De Grote getallen programmeren we als volgt: week 1: pointerpracticum,

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden : stapels, rijen en binaire bomen Walter Kosters week 12: 26 30 november 2018 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 en Vierde programmeeropgave Othello programmeren we als volgt:

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

Samenvoeging document syntax

Samenvoeging document syntax Samenvoeging document syntax Kleos beschikt over een interne model- en tekstblokbewerker om de aanmaak en de bewerking van modellen en tekstblokken mogelijk te maken. U kunt hiervoor echter ook een externe

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

Principe Maken van een Monte Carlo data-set populatie-parameters en standaarddeviaties standaarddeviatie van de bepaling statistische verdeling

Principe Maken van een Monte Carlo data-set populatie-parameters en standaarddeviaties standaarddeviatie van de bepaling statistische verdeling Monte Carlo simulatie In MW\Pharm versie 3.30 is een Monte Carlo simulatie-module toegevoegd. Met behulp van deze Monte Carlo procedure kan onder meer de betrouwbaarheid van de berekeningen van KinPop

Nadere informatie

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens Info-books AL20 Toegepaste Informatica Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) Jos Gils Erik Goossens Hoofdstuk 6 Lusstructuren of iteraties 6.1 Probleemstelling Het gebeurt dikwijls

Nadere informatie

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.

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. . a) Een Fibonacci boom (niet te verwarren met een Fibonacci queue) van hoogte h is een AVL-boom van hoogte h met zo weinig mogelijk knopen. i. Geefvoorh =,,,,eenfibonacciboomvanhoogteh(eenboombestaande

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

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

Programmeren A. Genetisch Programma voor het Partitie Probleem. begeleiding:

Programmeren A. Genetisch Programma voor het Partitie Probleem. begeleiding: Programmeren A Genetisch Programma voor het Partitie Probleem begeleiding: Inleiding Het Partitie Probleem luidt als volgt: Gegeven een verzameling van n positieve integers, vindt twee disjuncte deelverzamelingen

Nadere informatie

Bouwstenen voor PSE. Datatypes en Datastructuren

Bouwstenen voor PSE. Datatypes en Datastructuren Bouwstenen voor PSE Datatypes en Datastructuren Definitie Datatype Klasse van dataobjecten tesamen met operaties om ze te construeren, te manipuleren en te verwijderen. Een datatype omvat een specificatie

Nadere informatie

Bij dit hoofdstukken horen geen opgaven.

Bij dit hoofdstukken horen geen opgaven. 6. Programmeertalen Een computer begrijpt eigenlijk alleen maar binaire code (bestaande uit 1 en 0). Om hem/haar makkelijk opdrachten te geven zijn programmeertalen ontwikkeld. Deze moeten een goed gedefinieerde

Nadere informatie

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5 ALGORITMIEK: antwoorden werkcollege 5 opgave 1. a. Brute force algoritme, direct afgeleid uit de observatie: loop v.l.n.r. door de tekst; als je een A tegenkomt op plek i (0 i < n 1), loop dan van daaruit

Nadere informatie

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

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/ Programmeermethoden Pointers Walter Kosters week 10: 13 17 november 2017 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Pointers Introductie Een pointer is in feite gewoon een geheugenadres. Het geheugen kun

Nadere informatie

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017 Uitgebreide uitwerking Tentamen Complexiteit, juni 017 Opgave 1. a. Een pad van de wortel naar een blad stelt de serie achtereenvolgende arrayvergelijkingen voor die het algoritme doet op zekere invoer.

Nadere informatie

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek Divide & Conquer: Verdeel en Heers vervolg Algoritmiek Algoritmische technieken Vorige keer: Divide and conquer techniek Aantal toepassingen van de techniek Analyse met Master theorem en substitutie Vandaag:

Nadere informatie

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie Complexiteit 2016/04 College 4 Vierde college complexiteit 16 februari 2016 Beslissingsbomen en selectie 1 Complexiteit 2016/04 Zoeken: samengevat Ongeordend lineair zoeken: Θ(n) sleutelvergelijkingen

Nadere informatie

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

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms Giso Dal (0752975) Pagina s 5 7 1 Deelverzameling Representatie

Nadere informatie

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

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify Algoritmiek 2016/Branch & Bound Twaalfde college algoritmiek 13 mei 2016 Branch & Bound Heap, Heapsort & Heapify 1 Algoritmiek 2016/Branch & Bound TSP met Branch & Bound Mogelijke ondergrenzen voor de

Nadere informatie

MSX Computer & Club Magazine nummer 69 - augustus 1994 Arno Dekker. Scanned, ocr ed and converted to PDF by HansO, 2001

MSX Computer & Club Magazine nummer 69 - augustus 1994 Arno Dekker. Scanned, ocr ed and converted to PDF by HansO, 2001 MT2ASCII MSX Computer & Club Magazine nummer 69 - augustus 1994 Arno Dekker Scanned, ocr ed and converted to PDF by HansO, 2001 In de laatste serie MSX Club Magazine s werd at dieper ingegaan op MT-Base

Nadere informatie

Programmeermethoden NA

Programmeermethoden NA Programmeermethoden NA Week 6: Lijsten Kristian Rietveld http://liacs.leidenuniv.nl/~rietveldkfd/courses/prna/ Bij ons leer je de wereld kennen 1 Getal opbouwen Stel je leest losse karakters (waaronder

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

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

Doorzoeken van grafen. Algoritmiek

Doorzoeken van grafen. Algoritmiek Doorzoeken van grafen Algoritmiek Vandaag Methoden om door grafen te wandelen Depth First Search Breadth First Search Gerichte Acyclische Grafen en topologische sorteringen 2 Doolhof start eind 3 Depth

Nadere informatie

Tentamen Programmeren in C (EE1400)

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

Nadere informatie

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

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ. Tweede Toets Datastructuren 29 juni 2016, 13.30 15.30, Educ-Γ. Motiveer je antwoorden kort! Zet je mobiel uit. Stel geen vragen over deze toets; als je een vraag niet duidelijk vindt, schrijf dan op hoe

Nadere informatie

Zelftest Programmeren in PL/I

Zelftest Programmeren in PL/I Zelftest Programmeren in PL/I Document: n0830test.fm 26/03/2012 ABIS Training & Consulting P.. Box 220 B-3000 Leuven Belgium TRAINING & CNSULTING INLEIDING BIJ DE ZELFTEST PRGRAMMEREN IN PL/I m de voorkennis

Nadere informatie

DATASTRUCTUREN LIJSTEN. Dr. D.P. Huijsmans 12 sept 2012 Universiteit Leiden, LIACS

DATASTRUCTUREN LIJSTEN. Dr. D.P. Huijsmans 12 sept 2012 Universiteit Leiden, LIACS DATASTRUCTUREN LIJSTEN Dr. D.P. Huijsmans 12 sept 2012 Universiteit Leiden, LIACS EEN ANALOGIE VOOR ABSTRACTE DATATYPEN (ADT) ADT: architectuur + functionaliteit Woon/werk elementen, adressering Mogelijkheden

Nadere informatie

Handleiding IDEP: Inlezen gegevens; meerdere stromen/periodes/aangevers

Handleiding IDEP: Inlezen gegevens; meerdere stromen/periodes/aangevers Handleiding IDEP Inlezen gegevens; meerdere stromen/periodes/aangevers In deze korte handleiding wordt beschreven hoe je meerdere stromen en/of periodes en/of aangevers in één keer kunt inlezen. Dat betekent

Nadere informatie

6.2 VBA Syntax. Inleiding Visual Basic

6.2 VBA Syntax. Inleiding Visual Basic 6.2 VBA Syntax Wij gaan de Visual Basic Editor opnieuw openen, om de instructie die wij zojuist getypt hebben, nader te bekijken. Klik te tab Hulpmiddelen voor databases Klik op Maken Macro s en Code -

Nadere informatie