Het minimale aantal sleutels op niveau h is derhalve

Vergelijkbare documenten
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.

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Ziv-Lempel-Welch Compressie

Inhoud eindtoets. Eindtoets. Introductie 2. Opgaven 3. Terugkoppeling 6

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

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

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

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

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

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

opgaven formele structuren deterministische eindige automaten

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

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

TW2020 Optimalisering

Implementatie en toepassing van de trie

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

Doorzoeken van grafen. Algoritmiek

TW2020 Optimalisering

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

Tiende college algoritmiek. 26 april Gretige algoritmen

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

Automaten & Complexiteit (X )

Automaten. Informatica, UvA. Yde Venema

Finite automata. Introductie 35. Leerkern 36. Zelftoets 44. Terugkoppeling 45

Datastructuren Uitwerking jan

Elfde college complexiteit. 23 april NP-volledigheid III

Talen & Automaten. Wim Hesselink Piter Dykstra Opleidingsinstituut Informatica en Cognitie 9 mei 2008

(iii) Enkel deze bundel afgeven; geen bladen toevoegen, deze worden toch niet gelezen!

Twaalfde college algoritmiek. 12 mei Branch & Bound

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

8C080 deel BioModeling en bioinformatica

Examen Algoritmen en Datastructuren III

Tiende college algoritmiek. 14 april Gretige algoritmen

Uitwerking Opgaven Formele talen, grammaticas en automaten Week 1

Algoritmiek. 15 februari Grafen en bomen

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Twaalfde college algoritmiek. 23 mei Branch & Bound, Heapsort

Reguliere Expressies

1 Delers 1. 3 Grootste gemene deler en kleinste gemene veelvoud 12

TENTAMEN Basismodellen in de Informatica VOORBEELDUITWERKING

Uitwerkingen opgaven Kunstmatige intelligentie

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Tentamen Discrete Wiskunde 1 10 april 2012, 14:00 17:00 uur

Examen Datastructuren en Algoritmen II

Transport-, Routing- en Schedulingproblemen. Wi4062TU / Wi487TU / a86g. Uitwerkingen

Elfde college algoritmiek. 21 april Dijkstra en Branch & Bound

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

ALGORITMIEK: antwoorden werkcollege 5

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

Cover Page. The handle holds various files of this Leiden University dissertation.

Lege polygonen in een graaf.

l e x e voor alle e E

1 In deze opgave wordt vijftien maal telkens drie beweringen gedaan waarvan er één juist is. Kruis de juiste bewering aan. (2pt. per juist antwoord).

Vrijeplanning WisseQ WoWie

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

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

2WO12: Optimalisering in Netwerken

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

Greedy algoritmes. Algoritmiek

TW2020 Optimalisering

Tweede college algoritmiek. 12 februari Grafen en bomen

Automaten en Berekenbaarheid 2016 Oplossingen #4

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

Verzamelingen deel 2. Tweede college

Fundamentele Informatica

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Opdracht 1 Topics on Parsing and Formal Languages - fall 2010

Discrete modellen in de toegepaste wiskunde (WISB136) Uitwerkingen proeftentamen.

Hoofdstuk!7!Kortste!paden!

Periodieke facturen Deze functie is beschikbaar in de volledige versie van RADAR. RADAR Lite heeft deze functie niet.

Examen Discrete Wiskunde donderdag 12 april, 2018

Opdracht 1 Topics on Parsing and Formal Languages - fall 2010

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

Transport-, Routing- en Schedulingproblemen. Wi4062TU / Wi487TU / a86g. Uitwerkingen

Wiskundige animaties, Doolhoven/Pentomino s. Peter van Alem zaterdag

3. Elke lijn van een graaf draagt twee bij tot de som van alle graden.

Kosten. Computationale Intelligentie. Een zoekprobleem met stapkosten. Een voorbeeld: het vinden van een route. Zoeken met kosten.

Twaalfde college algoritmiek. 17 mei Branch & Bound

Sommige praktische IP problemen kunnen worden geformuleerd als optimalisering op een netwerk.

Formeel Denken 2014 Uitwerkingen Tentamen

Het gebruik van (alle soorten) rekenmachines is toegestaan.

Hebzucht loont niet altijd

Minimum Opspannende Bomen. Algoritmiek

Week Hier vind je uitwerkingen van enkele opgaven uit het dictaat Grafen: Kleuren en Routeren.

Opgaven Kunstmatige Intelligentie 1 maart 2017

l e x e voor alle e E

8C080 deel BioModeling en bioinformatica

Zoekproblemen met tegenstanders. Zoekalgoritmen ( ) College 9: Zoeken met een tegenstander (I) Een zoekprobleem met een tegenstander

1 Calculatie XE, 9.00 update 16 2

# seetut_20 $ De Sjabloon Editor Toepassen + seetut:0370 K Sjablonen;Algemeen;Naam Wijzigen Sjabloon;Ontwerp;Sjabloon Editor;Sjabloon Openen

Grafen en BFS. Mark Lekkerkerker. 24 februari 2014

Lineaire Algebra voor ST

3 De stelling van Kleene

In dit gedeelte worden drie problemen genoemd die kunnen voorkomen in netwerken.

Inrichting Systeem: Locaties & Toegang

Het sorteren van post

Transcriptie:

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 knoop minimaal twee sleutels (behalve eventueel de wortel) en maximaal vier sleutels Derhalve heeft een knoop minimaal drie kinderen (behalve eventueel de wortel, en de bladeren natuurlijk) en maximaal vijf kinderen Daarom: op minimaal minimaal maximaal maximaal niveau # knopen # sleutels # knopen # sleutels 1 1 1 1 4 1 5 4 5 3 3 3 5 5 4 5 5 4 3 3 3 3 5 5 5 4 5 5 5 h 3 h 3 h 5 h 1 4 5 h 1 Het minimale aantal sleutels op niveau h is derhalve { 1 als h = 1; 4 3 h als h Het maximale aantal sleutels op niveau h is 4 5 h 1 voor iedere h 1 Er zijn bonuspunten te verdienen voor wie dit netjes met inductie afleidt (c) We pakken de kolommen minimaal # sleutels en maximaal # sleutels uit de tabel van onderdeel (b) en maken die cumulatief: t/m minimaal maximaal niveau # sleutels # sleutels 1 1 4 5 4 3 17 14 4 53 64 5 161 314 6 485 7 1457 Met h 3 heb je hoogstens 14 sleutels Met h 7 heb je minstens 1457 sleutels Met h = 4 kun je 64 sleutels precies kwijt Met h {5, 6} heb je speling Met h {4, 5, 6} kun je dus 64 sleutels in een B-boom van orde 5 hebben Overigens kan men met inductie algemeen afleiden dat een B-boom van orde 5 en hoogte h minstens 3 h 1 1 en hoogstens 5 h 1 sleutels bevat Hiermee zijn echter geen bonuspunten te verdienen (d) De plaatjes van de B-bomen in dit onderdeel zijn niet compleet Subbomen die hetzelfde zijn als in de originele boom B zijn vaak weggelaten

i De sleutel 13 hoort thuis in het tweede blad vanaf links: 40 8 18 6 3 10 1 13 14 16 Na toevoeging van 13 aan dit blad, bevat het blad 5 sleutels, en dat is te veel Het blad splitst op, en de middelste sleutel (toevallig 13 zelf) gaat omhoog naar de ouderknoop: 40 8 13 18 6 3 10 1 14 16 Nu is de ouderknoop op zijn beurt te vol Ook deze splitst op, en de middelste sleutel (18) gaat omhoog naar de wortel: 18 40 8 13 6 3 4 6 10 1 14 16 0 4 8 30 34 36 38 ii De sleutel 33 hoort thuis in het vijfde blad vanaf links Wanneer we 33 daar aan toevoegen, bevat die knoop 4 sleutels, en dat mag gewoon We hoeven geen knopen op te splitsen: 40 8 18 6 3 33 34 36 38

(e) De plaatjes van de B-bomen in dit onderdeel zijn niet compleet Subbomen die hetzelfde zijn als in de originele boom B zijn vaak weggelaten i De sleutel 8 bevindt zich in een blad, en kan hier eenvoudig uit verwijderd worden: 40 8 18 6 3 0 4 30 34 36 38 De knoop waar 8 uit verwijderd is, bevat nu nog maar één sleutel, en is dus te leeg geworden Gelukkig heeft zijn linkerbroer (en ook zijn rechterbroer trouwens) een sleutel meer dan het minimale aantal twee We lenen daarom een sleutel van deze linkerbroer ( via de ouder): 40 8 18 4 3 0 6 30 34 36 38 ii De sleutel 46 bevindt zich niet in een blad We verwisselen hem met zijn voorganger in de B-boom (de grootste kleinere sleutel), sleutel 44, en verwijderen vervolgens 46: 40 44 5 4 48 50 54 56 De knoop met sleutel 4 bevat nu nog maar één sleutel, en is dus te leeg Een linkerbroer heeft deze knoop niet, een rechterbroer wel, maar die zit al op het minimum van twee sleutels Een sleutel lenen is dus niet mogelijk De te lege knoop wordt daarom samengevoegd met zijn rechterbroer:

40 8 18 6 3 5 8 30 34 36 38 4 44 48 50 54 56 Nu bevat de knoop met sleutel 5 nog maar één sleutel, en is dus te leeg Zijn linkerbroer bevat vier sleutels en daar lenen we er een van Merk op hoe de tussenliggende subboom mee verhuist: 3 8 18 6 40 5 8 30 34 36 38 4 44 48 50 54 56 (a) Bij het coderen starten we in de wortel van de initiële codeerboom Iedere keer dat we een letter lezen, kijken we of de huidige knoop een kind(tak) met die letter heeft Zo ja, dan stappen we gewoon naar dat kind toe Zo nee, dan voeren we de code van de huidige knoop uit, we geven de huidige knoop een kind(tak) met de zojuist gelezen letter, kennen aan dit kind de eerstvolgende nieuwe code toe, springen terug naar de wortel van de codeerboom en stappen van daar naar het kind met de zojuist gelezen letter Wanneer we alle letters van de tekst gelezen hebben, voeren we de code van de huidige knoop uit Voorbeeld: we beginnen in de wortel van de codeerboom We lezen de letter c en stappen naar het kind c van de wortel Vervolgens lezen we de letter d De huidige knoop heeft geen kind(tak) d (hij heeft überhaupt nog geen kinderen), dus we voeren de code van de huidige knoop uit, geven de huidige knoop een kind(tak) d, kennen aan dit kind de eerstvolgende nieuwe code 4 (= cd) toe, springen terug naar de wortel van de codeerboom en stappen van daar naar het kind d Gaan we zo verder met coderen, dan vinden we: Voer codes uit: Lees tekst in: Maak nieuwe codes: c d b c a c a c d a a a b c 3 1 0 7 4 0 11 6 4 5 6 7 8 9 10 11 1

De codeerboom die we opgebouwd hebben, ziet er als volgt uit: a b c d 0 1 3 a c c a d b 11 8 6 7 4 5 b c a 1 9 10 (b) Iedere keer dat er bij het coderen een code werd uitgevoerd, werd er onderaan die code een nieuwe tak aangemaakt voor de eerstvolgende nieuwe code De betreffende tak was de eerste tak van de code die als volgende zou worden uitgevoerd Voorbeeld: de eerste twee codes die werden uitgevoerd zijn code 1 (= b) en code 3 (= d) De eerste (tevens enige) letter van code 3 is d Die letter werd dus als tak onderaan code 1 gehangen Zo ontstond code 4 (= bd) Gaan we zo verder met decoderen, dan vinden we: Lees codes in: Voer tekst uit: Maak nieuwe codes: 1 3 3 4 0 6 10 0 1 13 9 b d d b d a c d b d b d a b b b c d 4 5 6 7 8 9 10 11 1 13 14 Twee gevallen verdienen een aparte vermelding, omdat de ingelezen code op het moment van decoderen nog niet in de boom hangt: De nieuwe code 10 bestaat uit code 6 (= db) gevolgd door de eerste letter van code 10 De eerste letter van code 10 is dus de eerste letter van code 6, de letter d De totale code 10 wordt dan code 6 gevolgd door deze letter: dbd De nieuwe code 13 bestaat uit code 1 (= b) gevolgd door de eerste letter van code 13 De eerste letter van code 13 is dus de eerste letter van code 1, de letter b De totale code 13 wordt dan code 1 gevolgd door deze letter: bb De codeerboom die we opgebouwd hebben, ziet er als volgt uit: a b c d 0 1 3 b c b d d b d 1 8 13 4 9 6 5 c a d 14 7 10 a 11

(c) Iedere keer dat er bij het coderen een code werd uitgevoerd, werd er onderaan die code een nieuwe tak aangemaakt voor de eerstvolgende nieuwe code De locaties van de toegevoegde codes (aan de initiële boom) 4, 5, 6, 7, 8, 9 verraden dus de substring die op dat moment gecodeerd werd Voorbeeld: voor de nieuwe code 4 (= ab) werd onderaan code 0 (= substring a) een tak b aangemaakt De tekst begint dus met ab en de laatste letter hiervan (= b) moet de eerste letter van code 5 zijn (dat klopt) Gaan we zo verder, dan vinden we: Voer tekst uit: Lees nieuwe codes: a b a a b c a b a 4 5 6 7 8 9 De string abaabcaba vormt derhalve het begin van de tekst Na het aanmaken van de laatste code (code 9, eindigend met een tak a) zijn we teruggesprongen naar de wortel en zijn daar naar kind a gestapt Nadien is geen nieuwe code meer aangemaakt, dus de resterende letters van de tekst waren allemaal in de boom te vinden Vanuit kind a van de wortel kunnen we de volgende paden in de boom volgen: (het lege pad), a, b, ba, bc De totale tekst kan derhalve geweest zijn: abaabcaba abaabcabaa abaabcabab abaabcababa abaabcababc (vijf mogelijkheden) (d) We kunnen het coderen van de tekst vervolgen door i gewoon verder te gaan met de huidige codeerboom, maar geen nieuwe codes meer toe te voegen (zoals in de programmeeropdracht); ii helemaal opnieuw te beginnen met een nieuwe codeerboom voor de rest van de tekst (dit gebeurt uiteindelijk bij gif-compressie); iii de bladeren uit de codeerboom te verwijderen; deze corresponderen namelijk met codes (substrings) die niet opnieuw zijn voorgekomen na het aanmaken; de vrijkomende code(nummer)s kun je hergebruiken voor nieuwe substrings; iv de codelengte met een bit uit te breiden (dit gebeurt in eerste instantie bij gif-compressie); dan ontstaan er weer nieuwe codes die je kunt gebruiken; dit antwoord is maar half goed, omdat hierbij kennelijk toch nog niet alle beschikbare codes zijn toegekend 3 (a) We construeren achtereenvolgens de matrices A 0, A 1,, A 4 Hierbij is A 0 de directe afstandenmatrix Voor k = 1,, 4 bevat A k [i, j] het totale gewicht van het kortste pad van knoop i naar knoop j waarbij onderweg knopen uit de verzameling {1,, k} gepasseerd mogen worden (voor k = 0 klopt dit overigens ook!) In deze laatste vier matrices is een waarde A k [i, j] onderstreept als ze beter is dan de corresponderende waarde in de vorige matrix (A k 1 [i, j] dus)

A 0 1 3 4 1 0 3 1 3 0 1 4 3 1 0 6 4-4 6 0 A 1 1 3 4 1 0 3 1 3 0 1 4 3 1 0 6 4-1 -1 0 A 1 3 4 1 0 3 1 7 3 0 1 4 3 4 1 0 5 4-1 -1 0 A 3 1 3 4 1 0 1 6 3 0 1 4 3 4 1 0 5 4-0 -1 0 A 4 1 3 4 1 0 1 6 0 1 4 3 3 1 0 5 4-0 -1 0 (b) In A 4 zien we dat het kortste pad van knoop 1 naar knoop 4 totaal gewicht 6 heeft Dit gewicht is berekend in A 3 Dit betekent dat het kortste pad van knoop 1 naar knoop 4 via knoop 3 loopt (1 3 4) In A 4 zien we dat het kortste pad van knoop 1 naar knoop 3 totaal gewicht 1 heeft Dit gewicht kwam al voor in A 0 Dit betekent dat het kortste pad van knoop 1 naar knoop 3 de directe tak van knoop 1 naar knoop 3 is (1 3) In A 4 zien we dat het kortste pad van knoop 3 naar knoop 4 totaal gewicht 5 heeft Dit gewicht is berekend in A Dit betekent dat het kortste pad van knoop 3 naar knoop 4 via knoop loopt (3 4) In A 4 zien we dat het kortste pad van knoop 3 naar knoop totaal gewicht 1 heeft en dat het kortste pad van knoop naar knoop 4 totaal gewicht 4 heeft Beide gewichten kwamen al voor in A 0 Dit betekent dat het kortste pad van knoop 3 naar knoop de directe tak van knoop 3 naar knoop is (3 ) en dat het korste pad van knoop naar knoop 4 de directe tak van knoop naar knoop 4 is ( 4) Het kortste pad van knoop 1 naar knoop 4 is derhalve 1 3 4 (c) Kies beginknoop 3 De werking van het algoritme van Dijkstra kan dan als volgt in een tabel worden weergegeven: Kandidaat- Knoop Actie waardes 1 3 4 Stap 1 1-6 Kies 3 - - 4 Kies 1 3 - - - 4 Kies 4 Volgens het algoritme van Dijkstra zou het kortste pad van knoop 3 naar knoop 1 dus 3 1 zijn, met totaal gewicht 4 Het is echter 3 4 1, met totaal gewicht 3 Dit laatste pad wordt ook door het algoritme van Floyd gevonden; kijk maar na in de matrices van onderdeel (a)! (d) Als een graaf een kring met een negatief totaal gewicht bevat, dan is niet voor alle paren knopen (i, j) het kortste pad van i naar j gedefinieerd Neem immers twee knopen i en j op deze kring Dan kun je het totale gewicht van het pad van i naar j altijd weer kleiner maken door de kring een keer (extra) te doorlopen Als het kortste pad van knoop i naar knoop j niet gedefinieerd is, kun je moeilijk van het algoritme van Floyd verwachten dat het wel het kortste pad oplevert

4 (a) Voor de tweede reguliere expressie zijn twee mogelijke semantische bomen De keuze voor de een of de ander hangt af van de interpretatie van de term A*B*A, als (A*B*)A of als A*(B*A) We geven de boom die hoort bij de tweede interpretatie Merk op: bij de andere boom hoort ook een andere postfix notatie, hoewel hij natuurlijk wel dezelfde verzameling strings representeert * * A + * A A B * + B B * A * A B Postfix notatie: A*AA B*+* Postfix notatie: BB A*B*A +* i ii (b) Als we bij iedere knoop in de semantische boom de corresponderende beginen eindknoop van de eindige automaat zetten, ziet de boom er als volgt uit: start eind 3 1 13 1 * 13 * 11 A 1 + 4 9 7 * 10 4 6 A A 8 B 5 7 9 De bijbehorende eindige automaat is A 1 3 A A 4 5 6 7 11 1 13 8 B 9 10

(c) Voor beide gezochte strings moeten we letter-voor-letter een depth-firstsearch uitvoeren In de bijbehorende boom structuren betekent: : tak met verkeerde letter of te vroeg in de eindtoestand; : deze knoop hebben we in de huidige stap al bezocht; 13 : eindtoestand bereikt toen we er naar zochten Voor de eerste string ( ABA ) voeren we vier depth-first-searches uit: eerst drie voor de drie letters van de string, en vervolgens nog een om te proberen de eindknoop van de automaat te bereiken A A 1 1 A A 3 1 11 4 5 3 1 11 4 B 9 8 B 9 8 9 10 1 10 1 13 13 5 6 A } {{ } 1 B 9 8 A 10 1 11 4 5 9 13 } {{ } 3 } {{ } 6 A } {{ } 4 Helaas, het lukt ons in de vierde zoektocht niet om de eindknoop van de automaat te bereiken De string ABA voldoet dus niet aan de gegeven expressie Voor de tweede string ( ABAA ) voeren we vijf depth-first-searches uit: eerst vier voor de vier letters van de string, en vervolgens nog een om de eindknoop van de automaat te bereiken De eerste drie zoektochten zijn uiteraard gelijk aan die bij de string ABA We vervolgen met de vierde zoektocht A A 5 6 7 1 11 4 B 9 8 10 1 13 } {{ }} {{ } 4 5

Nu bereiken we wel de eindknoop De string ABAA voldoet dus wél aan de gegeven expressie (d) Een methode om erachter te komen of er een substring van een string S is die aan een reguliere expressie X voldoet, is: construeer op de gebruikelijke manier de eindige automaat voor de expressie X; voer de zoektocht naar de string S op de gebruikelijke manier uit, met twee aanpassingen: begin iedere volgende depth-first-search niet alleen in de knopen die bereikt zijn in de vorige depth-first-search, maar ook in de beginknoop; breek de zoektocht af zodra de eindknoop bereikt is; als we dit stadium bereiken, dan voldoet een substring van S aan X (en omdat we weten bij welke letter van S we waren gebleven, weten we ook waar die substring eindigt); als we dit stadium helemaal niet bereiken, dan voldoet geen enkele substring van S aan X Een alternatieve methode is: construeer op de gebruikelijke manier de eindige automaat voor de expressie X; voeg voor iedere letter die voor kan komen in string S een tak toe van de beginknoop naar zichzelf, met die letter als label; voeg voor iedere letter die voor kan komen in string S een tak toe van de eindknoop naar zichzelf, met die letter als label; creëer indien gewenst een nieuwe eindknoop, en een tak zonder letter van de oude eindknoop naar deze nieuwe eindknoop; voer de zoektocht naar de string S op de gebruikelijke manier uit Beide methodes zijn aangepaste varianten voor het testen van S aan de expressie (A+B+ +Z)* X (A+B+ +Z)*, waarbij A, B,, Z de letters in het alfabet zijn (Rudy van Vliet, juli 00)