Reflektioner kring OU1 Generellt sett bra kvalitet på dokumentationen! Första intryck... –Skulle du lämna in en jobbansökan med ett häftstift/gem eller vikta blad i stället för att leta en häftapparat? –Skulle du använda denna rapport som ett exempel på hur du dokumenterar dina kunskaper när du söker jobb? Sidnummer och innehållsförteckning Rapporten ska läsas av ”utomstående” –många beskriver inte operationerna i en tabell! –att redovisa tiderna för programmen underlättar förståelsen av analysen Formellt skrivande –”jag”, ”du”, slang
Reflektioner kring OU1 Kommentera koden! –Absolut minimum: varje enskild metod ska ha en kommentar som beskriver syfte och parametrar –En godtycklig javakunnig person ska förstå koden Trend i årets labbar: Ineffektiva program! –Först gör man en lookup för att se om elementet finns och sen traverserar man igen(!) för att sätta in/ta bort... –Loopa igenom hela arrayen i IsEmpty –”Täppa till hålen” i remove steg för steg Break i for-loopar lika illa som goto! MTFTable kan ärva från ListTable
isEmpty... public boolean isEmpty() { if (first.getNextElement() == null) { return true; } else { return false; } } public boolean isEmpty() { return first.getNextElement() == null; }
Skriv om till while utan break! ListItem pos = head; while (pos != null) { if (k.compareTo(pos.getKey()) == 0) { break; } pos = pos.getNext(); } ListItem pos = head; while ((pos != null) && (k.compareTo(pos.getKey())!= 0))){ pos = pos.getNext(); } Så här:
Skriv om till for utan break! for(int i = 0; i<max; i++){ if(table[i] != null){ if(k.compareTo(table[i].getKey()) == 0){ table[i] = new Element(k,val); break; } else{ table[i] = new Element(k,val); break; }
Så här: boolean inserted = false; int i = 0; while (i<max && !inserted){ if(table[i] != null){ if(k.compareTo(table[i].getKey()) == 0){ table[i] = new Element(k,val); inserted = true; } else{ table[i] = new Element(k,val); inserted = true; } i++; }
”Ja, men en jämförelse till blir ju så ineffektivt – break rules!” Blir det mer inneffektivt? Låt oss göra en komplexitetsanalys... Vi associerar en kostnad till varje operation i pseudokoden. Följande operationer har kostnaden 1: –Funktions-/metodanrop. –Returnera från en funktion/metod. –Utföra aritmetiska operationer (+,−,×, /). –Jämförelse mellan tal. –Referera till ett objekt eller en variabel. –Indexera i en array. –Tilldelning
Värstafallskomplexitet (arrayen full men k finns ej där) for(int i = 0; i<n; i++){ 1 + (n+1)*(1+1+1) + n*([]+2) (init, villkor, loop) if(table[i] != null){ (index + table[i] + jämf) if(k.compareTo(table[i].getKey()) == 0){ table[i] = new Element(k,val); break; 1 } } else{ table[i] = new Element(k,val); break; } } T max (n) = 1 + 3(n+1) + n*( ) = 1 + 3n n = n För n ≥ n 0 ska n ≤ 21n n 0 = 4, dvs T max (n) är O(n) för c = 21 och n 0 = 4
Värstafallskomplexitet (arrayen full men k finns ej där) boolean inserted = false; 1 int i = 0; 1 while (i<n && !inserted){ (n+1)*( ) + n*[] if(table[i] != null){ (index + jämf + null) if(k.compareTo(table[i].getKey()) == 0){ table[i] = new Element(k,val); inserted = true; 1 } } else{ table[i] = new Element(k,val); inserted = true; } i++; 1+1 } T max (n) = (n+1) + n*( ) = 2 + 6n n = n För n ≥ n 0 ska n ≤ 24n n 0 = 8, dvs T max (n) är O(n) för c = 24 och n 0 = 8