22.08.2013 Views

Opgave 3: Sorteren van rationele getallen

Opgave 3: Sorteren van rationele getallen

Opgave 3: Sorteren van rationele getallen

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!