Opgave 3: Sorteren van rationele getallen

Download Report

Transcript Opgave 3: Sorteren van rationele getallen

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