Q&A - Frågor från Övningar/Labbtillfällen/Föreläsningar

På denna sida kommer frågor som ställts under kursens gång som kan vara bra för alla att känna till publiceras med tillhörande svar. 

Övning 5

Vad gäller när man "slår ihop" sannorlikheter när man bygger Huffmanträd?

Det är alltid de två tecken med lägst sannorlikhet som slås ihop först, vilket leder till att de tecken får längst kod i Huffmankodning. Den nya boxen som bildas av dessa är då denna man tar hänsyn till nästa gång man väljer boxar. 

Om fler än två boxar har samma sannorlikhet så spelar det inte så stor roll vilka två man väljer (förslagsvis första två bara för att hålla nått slags system). Det kommer inte förstöra kodningen, men kan resultera i att två träd baserat på samma text kan ge lite olika kodning.

Vad är stack frames för något?

Stack frames är ett sätt för oss att visualisera körning av kod. Om vi börja med att exekvera nedan kod:

def addera(x, y):
    z = x + y
    print(x, "+", y, "=", z) # Ex: "1 + 1 = 2"

def huvudfunktion():
    a = 0
    b = 1
    addera(a, b)

    c = 1
    addera(b, c)

    d = 2
    addera(c, d)

    e = 3
    addera(d, e)

huvudfunktion()

Så kan stack frames till denna kod visualiseras som i nedan animation.

Varje gång en funktion/metod anropas så läggs den på kodstacken som en stack frame. En dator kör koden en rad i taget, och när datorn ska köra nästa rad så kommer den välja att stega stack framen som ligger högst upp, eftersom stacken följer "sist-in-först-ut" regeln. När datorn kört sista raden i en stack frame så tas den bort från stacken, och börjar stega i framen under.

Viktigt att tänka på här är att datorn kommer ihåg vilken rad de var på i en den gamla stack framen när en ny frame läggs på stacken. Så när en stack frame har precis tagits bort fortsätter datorn från den rad de lämnande sist. När stacken är tom så har programmet kört klart!

Ytterligare kan man också med fördel skriva ner varje variabels värde i varsin stack frame för att lättare hålla koll på vad som händer i funktionen, som i animationen ovan. Print outputs är också en bra sak att ha koll på.

 

Stack frames är också utmärkt när man vill visualisera rekursion. Varje gång man gör ett rekursivt anrop så skapas en ny stack frame och läggs på stacken, med nästan samma innehåll som den föregående stack framen. Skillnaden kommer främst ligga i att parameterns värde kommer vara annorlunda. I förberedelseuppgiften för labb 5 så kommer listan bli mindre i varje ny stack frame.

Stacken fylls på tills man når basfallet, för labb 5 händer detta när listan är tom. Då börjar datorn ta bort de rekursiva stack frames:en. Kod som finns innan ett rekursivt anrop har redan körts av datorn när stacken byggdes upp. När stacken bryts ner kommer kod som ligger efter det rekursiva anropet att köras, då datorn inte kan fortsätta hit förrens alla stack frames ovanför är borta.

 

Övning 3

Vad är skillanden mellan inorder, preorder och postorder när man skriver ut binära sökträd?

  • Inorder skriver ut trädets noder i "storlektsordning", exempelvis 1, 2, 3, ... för siffror, A, B, C, ... för strängar, alternativt på hittad ordning via exempelvis __lt__ metoden i ett klassobjekt.
    Preorder bibehåller den hierarkiska strukturen i utrskiften av ett allmänt träd, och skapar man ett nytt träd av utskriften får man ett träd med samma struktur. 
    Postorder ger ordningen för ett träd från nod till rot, vilket gör att det blir lätt utifrån denna utskrift att exempelvis radera delar (eller hela) trädet från just nod till rot. 

Övning 2

Min linkedQ ger tillbaka output i omvänd ordning från vad som står i exempeloutput för labb 2 (och vad kattis vill ha).

  • Kontrollera att den länkade köns struktur är på samma sätt som i bildexemplena som går att hitta på sidan för Övning 1. Notera att noden som sattes in först i kön har first-pekaren på sig och att alla noder i kön pekar med sin next-pekare mot noden som står sist i kön och har last-pekaren på sig. Då ska utskriften bli i rätt ordning på en gång.

Övning 1

Kan csv.reader() läsa in mer än bara .csv filer?

  • Kort svar: Ja! I kursen får ni exempelvis primärt filer på formatet .txt med data för inläsning i labbarna och när dessa packas upp av with open(filnamn ...) as fil kommer dessa kunna tolkas på samma vis som .csv filer skulle göras. Är ni nyfikna på om det finns fler filtyper som CSV-modulen kan hantera så kan ni läsa mer om detta i Pythons dokumentation (Wow!) gällande CSV-modulen Links to an external site..

Vad menas med att lista.pop() har ett "optional argument"?

  • Ett "optional argument" betyder att det är valfritt om man vill ange detta argument när en metod eller funktion anropas (ofta gällande inbyggda sådana, men man kan konstruera "optional argumets" i sina egna funktioner/metoder också). I just fallet för lista.pop() kan man välja att sätta en integer innanför parenteserna vilket då säger vilket index från start (positiv integer) eller slutet (negativ integer) som ska tas ut specifikt.
    OBS! Detta kommer ni aldrig behöva göra i denna kurs! (Om ni inte väljer att bygga en lösning som utnyttjar just detta, men det kan lätt bli rörigt att följa med i vad koden gör).

Kan man se vad python gör medans koden kör?

  • I många IDEer (ex. PyCharm, VSCode m.fl.) finns inbyggt stöd för att köra koden i debugg-läge. Läs på för just er IDE om ni är nyfikna på detta. Det finns också ett online-verktyg som heter Python Tutor Links to an external site.. Här kan ni klista in kod som ni vill testa och se med hjälp av visualiseringar (boxar, pilar, listor m.m.) vad det är som händer i just er implementation av ett program.
    OBS! för några av de större labbarna kan det bli klurigt för Python Tutor att visa vad som händer då komplexiteten på eran kod ökar. 

Ska labbarna ha presenterats innan deadline?

  • Ja. Deadline ligger efter veckans sista redovisningstillfälle. När det gäller labb 1 så är det en del som inte hunnit bli anmälda till kursen och dom får förlängd tid.

Måste man kunna redogöra hur GitHub fungerar vid redovisning av Lab 1?

  • Ja, men bara översiktligt.

Ska vi använda Kattis eller Canvas för att skicka in våra labbar?

  • Ni ska alltid lämna in den slutliga versionen av programmet i Canvas. Om det står i labben att ni ska lämna in i Kattis så ska ni göra det också!

När släpps redovisningstiderna för datorlaborationerna?

  • Dagen efter veckans sista redovisningstillfälle.

Får man redovisa labbar när som helst innan deadline? Ponera att jag av någon anledning vill presentera exempelvis labb 7 nu, är det då möjligt?

  • Veckans labb har prioritet, men om det finns tid kan du redovisa extra labbar via hjälpkön.