Uppgift 2 -- AD1 VT04 -- Uppsala Universitet
Uppgift 2 måste lämnas in senast måndag 16 februari klockan 8:00
(på morgonen). Lämna in den med hjälp av inlämningssystemet (se
slutet av denna sida). Se till att läsa igenom kodkonventionerna
innan du börjar. Dessa skall följas.
Din inlämning
Överst i din fil ska följande finnas (inom kommentartecken):
- Ditt namn och klass.
- Om du löser uppgiften tillsammans med en annan student, ange den
andra studentens namn. I så fall ska endast en av er lämna in
en lösning, men båda ska meddela namn, klass och labpartner via
inlämningssystemet.
- Filens namn (inklusive din hemkatalogs namn; hela sökvägen alltså).
- En kort beskrivning (en rad) av vad det är för fil.
- Notera att alla kommentarer och all dokumentation ska vara på engelska.
Kontrollera att du hunnit ge svar på varje deluppgift.
Uppgift
Filen listMergeSort.sml innehåller
funktionen
listMergeSort: ('a * 'a -> bool) -> 'a list -> 'a list
som är en implementation av mergesort med hjälp av listor.
Du ska undersöka hur sorteringstiden för mergesort skiljer sig mellan
den implementationen och två andra implementationer av mergesort. De
två andra implementationerna ska du skriva själv.
Den första implementationen
listOptMergeSort: ('a * 'a -> bool) -> 'a list -> 'a list
ska vara en optimering av den givna funktionen listMergeSort.
Hur du genomför optimeringen är upp till dig, men algoritmen måste
även efter optimeringen bygga på listor och vara en implementation av
mergesort. Tips: ett lämpligt ställe att optimera är vid
uppdelningen av listorna.
Den andra implementationen
ArrayMergeSort: ('a * 'a -> bool) -> 'a array -> 'a array
arbetar med arrayer (istället för listor).
Tiden för enstaka sorteringar kan mätas med hjälp av funktionen
timeIt: ('a -> 'b) -> 'a -> real, som finns i filen ranTime.sml och tar en funktion f och
ett argument a och returnerar exekveringstiden för f
applicerat på a.
Vid redovisning av uppgiften ska du använda funktionen go: unit ->
unit i filen u2test.sml (som inhåller
filen ranTime.sml). Funktionen testkör de tre
implementationerna på sorterat, omvänt sorterat och slumpmässigt data
och genererar nio filer som sedan kan plottas med gnuplot.
Det ni ska sortera är endast heltal, och predikatet som ska jämföra
heltalen är < -operatorn (skriv op< som första
argument till sorteringsfunktionerna).
Uppgiften består av följande moment:
- Ladda ner filerna listMergeSort.sml och ranTime.sml till ditt konto och öppna dem i
en texteditor (förslagsvis Emacs).
- Implementera sorteringsprocedurerna listOptMergeSort och
arrayMergeSort. Om du vill testköra på lite större
indata kan du generera slumpmässiga listor och arrayer med
följande kommandon:
För att skapa en slumpmässig lista, skriv:
ArrRandom.rangelist (0, 10000) (numOfElms, Random.newgen())
För att skapa en slumpmässig array, skriv:
Array.fromList (Random.rangelist (0, 10000) (numOfElms, Random.newgen()))
- Redovisa resultatet med hjälp av funktionen go: unit ->
unit i filen u2test.sml.
Funktionen testkör de tre implementationerna på sorterat, omvänt
sorterat och slumpmässigt data. Nio filer genereras, till exempel
lmsS.txt för listMergeSort på sorterat data,
lmsOC.txt för listOptMergeSort på omvänt
sorterat data och amsR.txt för arrayMergeSort på
slumpmässigt data.
Filen plotta innehåller en serie
gnuplot-kommandon som läser de nio filerna och skapar grafer för
de tre sorteringsalgoritmerna på filen sort.ps. Skriv
gnuplot plotta vid unix-prompten för att skapa grafen
ifrån de tre filerna med mätdata.
- Beskriv matematiskt hur sorteringstiden beror av antalet element
som ska sorteras för var och en av de tre implementationerna.
- Kommentera experimentet och vilka slutsatser man kan dra av det.
I din slutsats ska det framgå vilken av implementationerna som är
den snabbaste, och med ungefär hur mycket snabbare den är än den
långsammaste (ange resultatet i procent).
Din redovisning ska innehålla
- Din implementation av sorteringsprocedurerna
listOptMergeSort och arrayMergeSort samt
proceduren listMergeSort (se punkt 2 ovan).
- Sökvägar (URL) till en fil med de tre plottarna (se punkt 3 ovan).
- Matematiska uttryck för hur sorteringstiden beror av antalet
element som ska sorteras för var och en av de tre
implementationerna (se punkt 4 ovan).
- Dina kommentarer till experimentet och vilka slutsatser man kan
dra av det (se punkt 5 ovan).
Din inlämning ska vara körbar. Det som inte är kod ska vara
bortkommenterat!
Glöm inte att alla funktioner ska dokumenteras enligt kodkonventionerna
(dvs även listMergeSort).
Frivilliga extrauppgifter
SML-NJ: Det finns en annan implementation av SML, New Jersey
SML, som är betydligt effektivare än Moscow ML. Provkör dina
sorteringar under New Jersey SML. Du startar med sml från
unix-prompten. Notera att vissa bibliotek i SML-NJ skiljer sig från
motsvarande bibliotek i Moscow ML, så du måste skriva om koden som
genererar indata och mäter tid. Ungefär hur mycket snabbare är SML-NJ
på de tre sorteringarna?
Hall of Fame: De snabbaste implementationerna av mergesort på
listor respektive arrayer kommer att presenteras på kurssidan. Att
hamna i Hall of Fame ger inga bonuspoäng men äran är väl belöning nog.
Vi kommer att ta emot tävlingsbidrag även efter sista inlämningsdatum.
Inlämning
Hämta ett formulär för att lämna in uppgiften genom att fylla i fälten
nedan.