Till KTH:s startsida Till KTH:s startsida

Laboration 6

vinyl

Laboration 6: Sökning och sortering

Mål: Kunna jämföra algoritmer med avseende på tidskomplexitet, i teori och praktik.

Läsning

  • Läs i kapitel 3 i kursboken (Cormen): Algorithms for Sorting and Searching, och kapitel 4: A Lower Bound for Sorting and How to Beat It

Sökning och sortering

I denna labb ska du arbeta med större datamängder. Filen /info/tilda/unique_tracks.txt (84MB) är hämtad från Million Song Dataset. Den innehåller data om en miljon låtar. Varje rad i filen har formatet:

     trackid<SEP>låtid<SEP>artistnamn<SEP>låttitel

Lista med objekt

Skriv en klass som representerar en låt enligt ovan. Förutom de vanliga metoderna ska du också implementera __lt__(self, other) som kan jämföra om objektet self är mindre än objektet other, med avseende på artistnamn.

Läs in låtarna från filen, skapa ett objekt för varje rad och spara objekten både

  • i en lista
  • i en dictionary (med artistnamn som nyckel)

Testa att inläsningen har fungerat.

Modulen timeit

Läs i dokumentationen för Pythons modul timeit och svara på följande frågor:

  • Vad representerar parametern stmt?
  • Vad representerar parametern number?
  • Vad är det timeit tar tid på?
  • Vad skrivs ut av ett anrop av timeit?

Tidtagningen

Nu ska du skriva ett program som gör följande, och tar tid på varje del:

  • Söker med linjärsökning i den osorterade listan.
  • Sorterar listan med lämplig sorteringsmetod.
  • Söker med binärsökning i den sorterade listan.
  • Slår upp ett element i dictionaryn.

Som hjälp för att komma igång har du följande exempel (kursiverade funktioner behöver du skriva själv). När man tar tid på en funktion som har parametrar får man använda lambda.

def main():

    filename = "/info/tilda/unique_tracks.txt"

    lista, dictionary = readfile(filename)
    n = len(lista)
    print("Antal element =", n)

    sista = lista[n-1]
    testartist = sista.artist

    linjtid = timeit.timeit(stmt = lambda: linsok(lista, testartist), number = 10000)
    print("Linjärsökningen tog", round(linjtid, 4) , "sekunder")

Du får gärna använda kod (för sortering och sökning) från föreläsningar, kursboken eller andra källor, men var noga med att ange var koden kommer från.

Analys

Skriv upp tidskomplexiteten för de algoritmer du tagit tid på ovan. Stämmer dina resultat med teorin? Skriv en kommentar sist i ditt program där du analyserar dina resultat.förklara skillnaden i tid mellan de olika momenten.

Redovisning

Labben lämnas in på kurswebbsidan (se Inlämningsuppgifter i vänstermenyn) och redovisas muntligt av bägge gruppmedlemmarna.

Vid redovisningen ska du kunna

  • berätta vilken tidskomplexitet dina algoritmer har,
  • visa hur dina sök-, och sorteringsfunktioner fungerar,
  • motivera upplägget av dina experiment,
  • förklara skillnaden i tid mellan de olika momenten.

Betyg

Denna labb kan endast ge betyg E. Du måste lämna in den och redovisa den i tid för att få göra labbarna för högre betyg i period 2.

Linda Kann skapade sidan 12 juli 2016

Lärare Linda Kann ändrade rättigheterna 12 juli 2016

Kan därmed läsas av lärare och ändras av lärare.

Lärare Linda Kann ändrade rättigheterna 16 september 2016

Kan därmed läsas av alla och ändras av lärare.
En användare har tagit bort sin kommentar
kommenterade 29 september 2016

Måste dictionary kunna skriva ut alla låtar med samma key i testprogrammet och senare i "Slår upp ett element i dictionaryn."? Pythons inbyggda dictionary sparar endast en låt per artist, den sista låten av den artisten i txt filen. Måste huvudsökningen inkludera alla låtar av samma artist i den fjärde punken i tidtagningen?

Lärare kommenterade 29 september 2016

Ni ska inte försöka ändra i Pythons dictionary, men ni ska kunna förklara resultatet!

kommenterade 5 oktober 2016

Hej! Det finns flera låtar per artist. Vet hur många låtar det är men inte hur många artister det är.

Är det okej att göra med songtitel/id istället? Finns det en tanke med just artist?

Svårt att räkna helt rätt på antalet element och komplexitet då.

Lärare kommenterade 5 oktober 2016

Prova gärna bägge varianterna och jämför resultaten!