© Harry Broeders.
In het onderstaande voorbeeldprogramma is de class StopWatch
opgenomen. Deze class kan gebruikt worden om tijd te meten. In het
voorbeeldprogramma wordt de tijd gemeten die het bubble_sort
algoritme nodig heeft om een array met N
elementen te sorteren.
Er zijn 2 versies van het programma. De eerste versie kan op elk operating systeem gebruikt worden maar is niet zo nauwkeurig. De tweede versie maakt is nauwkeuriger maar kan alleen voor Windows-XP worden gebruikt.
Opdracht 2a.
Start het voorbeeldprogramma en zoek een waarde van
De tijd die nodig is om |
Op mijn machine was de tijd die nodig is om 10000 getallen te sorteren ongeveer 1 seconde:
Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.80 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.84 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.81 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.80 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.80 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.84 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.83 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.81 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.77 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 0.84 sec Geef N (of Ctrl+C om te stoppen):
Opdracht 2b.
Probeer nu de orde van het algoritme vast te stellen door de benodigde tijd
te meten voor verschillende waarden van |
Op mijn machine heb ik het volgende gemeten:
Geef N (of Ctrl+C om te stoppen): 5000 Tijdsduur: 0.38 sec Geef N (of Ctrl+C om te stoppen): 10000 Tijdsduur: 1.55 sec Geef N (of Ctrl+C om te stoppen): 15000 Tijdsduur: 3.44 sec Geef N (of Ctrl+C om te stoppen): 20000 Tijdsduur: 6.11 sec Geef N (of Ctrl+C om te stoppen): 25000 Tijdsduur: 9.53 sec Geef N (of Ctrl+C om te stoppen): 30000 Tijdsduur: 13.64 sec Geef N (of Ctrl+C om te stoppen): 35000 Tijdsduur: 19.33 sec Geef N (of Ctrl+C om te stoppen): 40000 Tijdsduur: 29.67 sec Geef N (of Ctrl+C om te stoppen): 45000 Tijdsduur: 38.30 sec Geef N (of Ctrl+C om te stoppen):
Opdracht 2c.
De C++ standaard functie |
Een meerderheidselement in een array van N
elementen is een
element dat meer dan N
/2 keer in de array voorkomt.
De array: 3, 3, 4, 2, 4, 4, 5, 4, 4
heeft als meerderheidselement
de waarde 4
.
De array: 3, 3, 4, 2, 4, 4, 5, 4, 3
heeft geen
meerderheidselement.
Er zijn verschillende algoritmen om het meerderheidselement van een array te vinden:
N
/2+1
keer voorkomt is dit het meerderheidselement. Zo niet, tel dan hoe vaak het
tweede element voorkomt. Als dit element N
/2+1 keer voorkomt
is dit het meerderheidselement. Enzovoort totdat je geteld hebt hoe vaak
element N
/2+1 voorkomt. Als je dan nog steeds geen
meerderheidselement hebt gevonden dan is het er ook niet.
N
/2+1 elementen met dezelfde
waarde vindt heb je het meerderheidselement gevonden.
Als we alle elementen hebben "bekeken" blijft er een kandidaat over (teller
> 0) of niet (teller == 0). Omdat we er (in eerste instantie) vanuit gegaan
zijn dat de array een meerderheidselement heeft moet je nu, als er een kandidaat
is, nog wel even controlleren of dit het meerderheidselement is door
te tellen hoe vaak de kandidaat in de array voorkomt.
Uitleg:
Als de teller 0 wordt hebben we net zoveel elementen gehad die gelijk waren
aan de kandidaat (telkens +1) als elementen die ongelijk waren aan de kandidaat
(-1). Deze elementen vormen dus paartjes van ongelijke elementen en die kunnen
we dus allemaal uit de array verwijderen. Als er een meerderheidselement
was in de oorspronkelijke array dan heeft de resterende rij hetzelfde
meerderheidselement! (Dit zou wel of niet de vorige kandidaat kunnen zijn
maar dat maakt niets uit!)
Deze methode is bedacht door Moore en Boyer. Zie
http://www.cs.utexas.edu/users/moore/best-ideas/mjrty/index.html
voor een eenvoudige uitleg en een stap voor stap demo. Zie
http://www.cs.utexas.edu/users/boyer/mjrty.pdf
voor een uitgebreide uitleg.
Opdracht 2d.Schrijf een functie die kan bepalen of een array een meerderheidselement heeft (met één van de drie hierboven beschreven methoden). Als de array een meerderheidselement heeft dan moet de functie dit element ook teruggeven. Het prototype van de functie is als volgt:
De parameter
Gebruik het programma timedzme.cpp
|