© 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 3 versies van het programma. De eerste versie kan op elk operating systeem gebruikt worden maar is niet zo nauwkeurig. De tweede versie is nauwkeuriger maar kan alleen voor Windows XP worden gebruikt, de derde versie is ook nauwkeuriger dan de eerste versie en kan ook op Windows 7 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 15000 getallen te sorteren ongeveer 1 seconde.
Opdracht 2b.Probeer nu de orde van het algoritme vast te stellen
door de benodigde tijd te meten voor minstens 10 verschillende waarden
van |
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 |