Föreläsning 6 Länkade lista Komplexitet Linjärsökning & binärsökning Datalogi, Föreläsning 6 2017-04-06 Föreläsning 6 Länkade lista Komplexitet Linjärsökning & binärsökning Vahid Mosavat, Nada, KTH
Datalogi, Föreläsning 6 2017-04-06 Länkad lista … Där varje post har en länk till en annan post av samma typ. Exempel: varuvagnar, tåg-vagnar o.s.v. … En post Vahid Mosavat, Nada, KTH
Länkad lista i Python Följande är definition av en klass som kan användas för att skapa en länkad lista. class Nod : value = None nextPost =None def __init__(self,v): self.value = v
Exempel Konstruera en klass som representerar en person, varje instans av klassen person ska ha ett namn och möjligtvis ett barn.
Exempel Använd klassen i föregående exemplet i ett program för släktforskning.
Att gå igenom listan top 1 10 7 p p=top while p!=None : print p.value null p p=top while p!=None : print p.value p = p.nextPost
Att ta bort första posten ur listan top 1 10 7 null top=top.next;
Att lägga till en post i början av listan top 1 10 7 null n=Nod(3) n.nextPost = top top = n
Algoritm En detaljerad beskrivning som kan lösa ett visst problem kallar man algoritm. En korrekt algoritm är en algoritm som fungerar för alla instans av problemet. En algoritm är inte korrekt om det finns en instans av problemet som inte går att lösa med algoritmen.
Komplexitet Det finns oftast många olika algoritmer för att lösa ett problem. Då är det intressant att analysera algoritmen för att t.ex se vilken av de är mest eller minst effektiv. När man pratar om effektivitet hos en algoritm menar man hur mycket tid eller minne krävs för att lösa en instans av problemet. När det är minne vi är intresserad av så är det rumskomplexitet. När det är tid vi intresserad av så är det tidskomplexitet.
Komplexitet Vilken är man oftast mest intresserad av tidskomplexitet eller rumskomplexitet ?
Komplexitet för summera alla tal i en lista length=len(tallistan) while i<length: sum=sum+tallistan[i] i++
Komplexitet för summera … Om det finns N tal i listan så har vi följande: Operation antal Tilldelning till sum N+1 Additioner N Tilldelning till i N+1 i < length N+1 length=len(tallistan) 1
Komplexitet för summera … Vi antar följande tidsenheter för varje operation: Tilldelning tar t Addition tar a Jämförelse tar j i++ tar i Då får vi följande: 3*t+N*t+(N-1)*j+N*(s+i)=N(j+t+s+i)+3t-j=N*K1+K2 Där K1 & K2 är konstanter
Komplexitet för summera … För att beräkna komplexiteten: Strunta i konstanter och multiplikation med konstanter Ta bara den term som växer snabbare än andra termer Med avseende på ovanstående kommer komplexiteten bli N från N*K1+K2
Vad är komplexitet för en linjärsökning Det är nästan alltid värsta fallskomplexitet som är intressant
Vad är komplexitet för binärsökning