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): 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:

  1. Ladda ner filerna listMergeSort.sml och ranTime.sml till ditt konto och öppna dem i en texteditor (förslagsvis Emacs).
  2. 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()))
  3. 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.

  4. Beskriv matematiskt hur sorteringstiden beror av antalet element som ska sorteras för var och en av de tre implementationerna.
  5. 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 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.
ID:
PIN:
formulär för inlämning