Opgave 3: Sorteren van rationele getallen
Opgave 3: Sorteren van rationele getallen
Opgave 3: Sorteren van rationele getallen
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Opgave</strong> 3: <strong>Sorteren</strong> <strong>van</strong> <strong>rationele</strong> <strong>getallen</strong><br />
Datastructuren 2011/2012<br />
Dit is de derde opgave <strong>van</strong> het practicum Datastructuren <strong>van</strong> 2011/2012.<br />
<strong>Sorteren</strong> <strong>van</strong> <strong>rationele</strong> <strong>getallen</strong><br />
In deze opgave gaan we een aantal <strong>rationele</strong> <strong>getallen</strong> sorteren op grootte. De<br />
<strong>getallen</strong> zijn gegeven als een soort breuk. Het sorteren moet gebeuren met<br />
behulp <strong>van</strong> een hybride vorm <strong>van</strong> Randomized Quicksort en Insertion<br />
Sort.<br />
Elk <strong>van</strong> deze breuken is gegeven door twee positieve gehele <strong>getallen</strong>: eerst<br />
de teller en dan de noemer. In de uitvoer moeten we dezelfde paren <strong>getallen</strong><br />
terugzien, maar nu gesorteerd <strong>van</strong> klein naar groot.<br />
Invoer<br />
De eerste regel <strong>van</strong> de invoer is een positief geheel getal. Dit getal geeft aan<br />
hoeveel paren <strong>getallen</strong> er volgen; we noemen dit getal n.<br />
Op de n opeenvolgende regels staan steeds twee positieve gehele <strong>getallen</strong>.<br />
Elk paar geeft een rationeel getal weer. Als op een regel eerst het getal p<br />
staat en dan het getal q, dan geeft deze regel het getal p/q weer.<br />
Voor elke invoer geldt dat elk <strong>van</strong> de <strong>getallen</strong> altijd een positief geheel<br />
getal is en dat elk <strong>van</strong> deze <strong>getallen</strong> nooit groter is dan één miljoen.<br />
Uitvoer<br />
De uitvoer bestaat uit n regels, elk met een paar <strong>getallen</strong>. Hierbij moet elk<br />
paar <strong>getallen</strong> <strong>van</strong> de invoer weer voorkomen. Echter, nu moeten de paren<br />
gegeven worden in gesorteerde volgorde, <strong>van</strong> klein naar groot: om precies te<br />
zijn: in niet dalende volgorde.<br />
Een paar p, q moet dus op een eerdere regel staan dan een paar r, s, als<br />
geldt dat<br />
p<br />
q<br />
< r<br />
s<br />
1
U mag de paren niet vereenvoudigen: als bijvoorbeeld het paar 2, 4 in<br />
de invoer staat, dan mag u dit niet ver<strong>van</strong>gen door 1 2, ondanks dat dit<br />
hetzelfde <strong>rationele</strong> getal voorstelt.<br />
Als twee paren <strong>getallen</strong> hetzelfde <strong>rationele</strong> getal voorstellen, moet u deze<br />
paren verder sorteren op stijgende teller. Het paar 3, 6 komt dus eerder dan<br />
het paar 5, 10.<br />
Methode<br />
Als sorteermethode moet u de hieronder beschreven hybride vorm <strong>van</strong> Randomized<br />
Quicksort en Insertion Sort gebruiken.<br />
Gebruik <strong>van</strong> een andere sorteermethode (zoals bijvoorbeeld Heapsort,<br />
Bubble Sort, puur Randomized Quicksort . . . ) voldoet dus niet aan de opdracht.<br />
Een hybride vorm <strong>van</strong> Randomized Quicksort en Insertion<br />
Sort<br />
Als de invoer een array is <strong>van</strong> lengte kleiner dan 20 dan moet de array<br />
gesorteerd worden met behulp <strong>van</strong> Insertion Sort. Als de invoer een array is<br />
<strong>van</strong> lengte groter dan 20 dan moet de array gesorteerd worden met behulp<br />
<strong>van</strong> Randomized Quicksort, met die modificatie dat wanneer een recursieve<br />
aanroep gedaan wordt voor een deelarray met lengte kleiner dan 20, dan<br />
moet Insertion Sort gebruikt worden.<br />
Opmerking / achtergrond Deze hybride vorm is vaak sneller dan een<br />
’gewoon’ (niet hybride; ongemengd) algoritme. Het getal 20 is wat willekeurig<br />
hier; wellicht wordt met een ander getal het nog sneller. De specificatie zegt<br />
niet wat je met precies 20 moet doen; mag je zelf kiezen.<br />
Een mogelijke opzet<br />
Een mogelijke opzet zou de volgende kunnen zijn:<br />
• Gebruik een recursief programma, dat als invoer de naam <strong>van</strong> een array,<br />
en twee integers krijgt, en dat het gedeelte met indices tussen die<br />
integers sorteert.<br />
• Als dit gedeelte een lengte meer dan twintig heeft, dan gebruik je randomized<br />
partition; ga in recursie op het linkerdeel en ga in recursie op<br />
het rechterdeel.<br />
2
• Als dit gedeelte een lengte hooguit twintig heeft, dan sorteer je het<br />
gedeelte met insertion sort; in dit deel code heb je dan geen recursieve<br />
aanroep meer.<br />
Je kan ook een andere opzet kiezen, maar belangrijk is dat je code de<br />
hybride vorm <strong>van</strong> randomized quicksort en insertion sort gebruikt die in de<br />
vorige sectie is beschreven.<br />
Voorbeeld<br />
Als de invoer is:<br />
6<br />
3 5<br />
10 20<br />
6 10<br />
100 33<br />
1 1<br />
1 8<br />
dan representeert deze invoer de serie <strong>getallen</strong>:<br />
3<br />
5<br />
10 6 , , 20 10<br />
, 100<br />
33<br />
1 1 , , 1 8<br />
De uitvoer moet dan zijn:<br />
1 8<br />
10 20<br />
3 5<br />
6 10<br />
1 1<br />
100 33<br />
want<br />
Hint<br />
1<br />
8<br />
< 10<br />
20<br />
< 3<br />
5<br />
≤ 6<br />
10<br />
< 1<br />
1<br />
< 100<br />
33<br />
Maak een nieuwe klasse aan, met objecten die paren <strong>getallen</strong> voorstellen.<br />
Voor elk paar <strong>getallen</strong> kan u dan één object nemen. Zet de objecten in een<br />
array, en sorteer deze array.<br />
3
Over de opdracht<br />
U dient deze opdracht zelf en alleen te programmeren in C#.<br />
Hierbij mag u niet gebruik maken <strong>van</strong> libraries behalve libraries voor invoer<br />
en uitvoer. In het bijzonder mag u geen library gebruiken voor sorteren.<br />
Inleveren<br />
Bij het inleveren <strong>van</strong> opgaven voor het practicum <strong>van</strong> Datastructuren 2011/2012<br />
wordt gebruik gemaakt <strong>van</strong> het Domjudge systeem.<br />
Dit systeem controleert automatisch of het programma dat U inlevert:<br />
• correct compileert<br />
• op een aantal (geheime) testinvoeren correcte uitvoer genereert<br />
• op deze testinvoeren snel genoeg werkt.<br />
Indien uw programma aan minstens één <strong>van</strong> deze voorwaarden niet voldoet,<br />
dan wordt uw programma niet geaccepteerd. U krijgt een melding<br />
waarom het programma niet wordt geaccepteerd.<br />
Daarna heeft u de mogelijkheid om uw programma te verbeteren. U kunt<br />
het programma zo vaak inleveren als u wilt, uiterlijk tot de deadline <strong>van</strong> deze<br />
opdracht (zie hieronder).<br />
Zolang het systeem niet een programma voor deze opdracht <strong>van</strong> u heeft<br />
geaccepteerd, is de opdracht nog niet gehaald. Wanneer het systeem wel een<br />
programma <strong>van</strong> u voor deze opdracht heeft ingeleverd, dan is de opdracht<br />
meestal gehaald (zie hieronder).<br />
Om de opgave in te leveren gaat u naar<br />
https://datastructuren.cs.uu.nl/team,<br />
logt u met uw solisID in, kiest u boven in het kopje “Submit” en upload<br />
u uw bestand en selecteerd u het juiste “Problem” en “Language” in de<br />
uitklapmenu’s. Het resultaat <strong>van</strong> deze submissie kunt u terugvinden onder<br />
het kopje “Submissions”.<br />
Deadline<br />
U moet uw opgave inleveren uiterlijk woensdag 16 mei 2012 23.59 uur via<br />
het systeem zoals boven beschreven.<br />
4
Becijfering<br />
Er zijn slechts twee mogelijke uitslagen voor deze opgave: gehaald en niet<br />
gehaald.<br />
Voor de cijferregeling, zie de website <strong>van</strong> het vak. Deze opdracht levert,<br />
indien gehaald, 1,4 punt <strong>van</strong> het cijfer voor het practicum. Niet gehaalde<br />
opdrachten geven 0 punten. Je eindcijfer is het totaal <strong>van</strong> de punten voor<br />
gehaalde opdrachten.<br />
Meestal zal gelden dat een programma dat door het systeem wordt geaccepteerd<br />
een gehaalde opdracht betekent. De programma’s zullen echter nog<br />
wel geïnspecteerd worden, en in bijzondere gevallen kan een door het systeem<br />
geaccepteerd programma toch niet als gehaald worden beschouwd:<br />
• Er is sprake <strong>van</strong> ongeoorloofd gebruik <strong>van</strong> libraries.<br />
• Specifieke andere eisen (omschreven bij de opdracht) zijn niet voldaan.<br />
Bij opdracht 3 geldt dat uw programma als niet gehaald kan worden<br />
beoordeeld als u niet met het beschreven algoritme sorteert. Bijvoorbeeld:<br />
als u de <strong>rationele</strong> <strong>getallen</strong> sorteert met behulp <strong>van</strong> heapsort of<br />
mergesort, dan leidt dit in het algemeen tot het beoordelen met niet<br />
gehaald.<br />
• Er is sprake <strong>van</strong> fraude of plagiaat. (Zie hieronder.)<br />
Fraude en plagiaat<br />
U dient de opdrachten zelf en alleen te maken. Het overnemen <strong>van</strong> code <strong>van</strong><br />
andere studenten of het kopiëren <strong>van</strong> code <strong>van</strong> andere bronnen (zoals het<br />
internet) is ten strengste verboden.<br />
Wanneer dit soort gevallen <strong>van</strong> fraude en/of plagiaat worden ontdekt,<br />
dan wordt de procedure, omschreven in het examenreglement <strong>van</strong> de studie<br />
gevolgd. Dit zal in het algemeen leiden tot verdere uitsluiting <strong>van</strong> deelname<br />
aan dit vak dit jaar en melding aan de examencommissie, maar kan ook<br />
verdere uitsluiting <strong>van</strong> de studie als gevolg hebben.<br />
Vragen<br />
Vragen over de opdracht kunt u stellen tijdens de werkcolleges <strong>van</strong> Datastructuren.<br />
Het is niet de bedoeling dat je aan je opdracht werkt tijdens de<br />
werkcolleges; wel kan je vragen stellen over de opdracht of je programma<br />
tijdens de werkcolleges.<br />
5
Vragen over het inleveren via het Domjudge systeem kunt u stellen aan<br />
Tigran Gasparian (t.g.gasparian@uu.nl). Houd er rekening mee dat je<br />
vragen niet altijd direct beantwoord kunnen/hoeven te worden!<br />
Vragen over de uitslag kunt u stellen aan Steven Woudenberg.<br />
6