Programkonstruktion och Datastrukturer

Relevanta dokument
Sökning och sortering

Programkonstruktion och Datastrukturer, lektion 7

Programkonstruktion och. Datastrukturer

Asymptotisk komplexitetsanalys

Programmering för språkteknologer II, HT2014. Rum

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Övningsuppgifter #11, Programkonstruktion och datastrukturer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 5 Innehåll

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Algoritmer, datastrukturer och komplexitet

Programkonstruktion och. Datastrukturer

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Lösning av några vanliga rekurrensekvationer

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 5: Kardinalitet. Funktioners tillväxt

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Datastrukturer och algoritmer

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Algoritmer, datastrukturer och komplexitet

Dekomposition och dynamisk programmering

Programmering II (ID1019) :00-11:00

Dugga Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Pseudokod Analys av algoritmer Rekursiva algoritmer

Tentamen Datastrukturer D DAT 035/INN960

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Datastrukturer. föreläsning 2

Föreläsning 1 Datastrukturer (DAT037)

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Tentamen Datastrukturer för D2 DAT 035

TDDC74 Lab 02 Listor, sammansatta strukturer

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Föreläsning 7: Syntaxanalys

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer D. Föreläsning 2

Föreläsning 9 Datastrukturer (DAT037)

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Programmering II (ID1019) :00-17:00

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

Exempeltenta GruDat 2002/2003

Föreläsning 4 Datastrukturer (DAT037)

Ekvivalensrelationer

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Övningshäfte 2: Induktion och rekursion

Programmering II (ID1019) :00-12:00

Föreläsning 11 Datastrukturer (DAT037)

samt lite algoritmer en kortfattad introduktion för studenter på Intro:DV

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

DD1361 Programmeringsparadigm. Carina Edlund

Övning 2. (Länkade) Listor, noder

Programmering II (ID1019) :00-11:00

Några svar till TDDC70/91 Datastrukturer och algoritmer

DAI2 (TIDAL) + I2 (TKIEK)

Tentamen Datastrukturer D DAT 035/INN960

TDDC74 Programmering, abstraktion och modellering. Tentamen

Vad har vi pratat om i kursen?

Tentamen Datastrukturer (DAT036)

Rekursion och induktion för algoritmkonstruktion

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Programmering II (ID1019) :00-12:00

Föreläsning 2 Datastrukturer (DAT037)

Rekursion och induktion för algoritmkonstruktion

Algoritmer, datastrukturer och komplexitet

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Procedurer och villkor

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 5. Rekursion

Algoritmer, datastrukturer och komplexitet

Kryptokorsordslösare Programmeringsmetodik DV (period 2) Inlämningsuppgift 1

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 6: Introduktion av listor

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Lösningsförslag till tentamen Datastrukturer, DAT037,

Algoritmer, datastrukturer och komplexitet

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning Datastrukturer (DAT037)

Tentamen i Introduktion till programmering

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Transkript:

Programkonstruktion och Datastrukturer VT 2012 Tidskomplexitet Elias Castegren elias.castegren.7381@student.uu.se

Problem och algoritmer Ett problem är en uppgift som ska lösas. Beräkna n! givet n>0 Räkna antalet vokaler i en textsträng Lös ett kryptokorsord, givet en ordlista med möjliga ord En algoritm är en steg-för-steg-beskrivning för hur man löser ett problem. 1. Sätt p till 1 2. Är n = 0? Returnera p, annars gå till steg 3 3. Sätt p := p n och n := n-1. Gå till steg 2

Tidskomplexitet Tidskomplexitet är ett mått på hur körtiden för en algoritm förändras när storleken på problemet ändras. Teoretiskt mått på hur komplicerat ett problem är beräkningsmässigt. Inte låst till programmering. Säger ingenting om hur lång tid det tar att köra algoritmen!

Exempelproblem Utgå från en lista av godtyckliga heltal och beräkna samma lista med alla dubletter borttagna. [1,1,2,2,2,3] ==> [1,2,3] [3,1,4,1,5,9,2,6,5,3,5,8,9] ==> [3,1,4,5,9,2,6,8] Algoritm 1 1. Finns det element i listan? Om nej är man klar. 2. Ta bort varje förekomst av det första elementet utom den första. 3. Börja om från steg 1 med alla element förutom det första.

Algoritm 1, analys Exempelproblem Om det fi nns n element i listan måste vi i värsta fall jämföra det första elementet med (n-1) element, det andra med (n-2) osv. Körtiden T för n element blir blir: där är tiden för att jämföra och eventuellt ta bort ett element.

Algoritm 2 Exempelproblem 1. Skapa en tom hash-tabell h. 2. Finns det element i listan? Om nej är man klar. 3. Finns det första elementet i h? Om nej, lägg in det i h. Om ja, ta bort elementet ur listan. 4. Börja om från steg 2 med resten av listan.

Algoritm 2, analys Exempelproblem För varje element gör vi en sökning och eventuellt en insättning i en hashtabell. Båda operationerna tar konstant tid. Körtiden T för n element blir: där är tiden för att söka efter och eventuellt sätta in ett element i en hashtabell, samt eventuellt ta bort ett element ur listan.

Två exempel på komplexitet För en dubbelt så lång lista tar det ungefär fyra gånger så lång tid med algoritm 1, men dubbelt så lång tid med algoritm 2. Algoritm 1 har alltså högre komplexitet än algoritm 2. Hur ska man uttrycka den här skillnaden? Matematiken ger oss Theta-notationen!

Theta-notationen Uttrycker begränsningar för tillväxten hos matematiska funktioner. Det fi nns så att för Informellt: För tillräckligt stora växer ungefär lika snabbt som För tillräckligt stora : Asymptotisk analys

Theta-notationen För tillräckligt stora : Asymptotisk analys Bara den snabbast växande termen i är intressant, de andra kan strykas. Om är ett polynom är man bara intresserad av termen med högst grad Koeffi cienter påverkar bara och (se föregående slide) och kan också strykas:

Theta-notationen Variationer: Omega och Omicron ( Big Oh ) Informellt: För tillräckligt stora begränsas underifrån, respektive ovanifrån av

Tillbaka till dublettborttagningen Algoritm 1 Algoritmen har kvadratisk komplexitet Algoritm 2 Algoritmen har linjär komplexitet

Källa: Pierre Flener Olika komplexiteter För problem av storlek n. k är en konstant. Komplexitetsfunktion Tillväxthastighet 1 Konstant log n Logaritmisk Sub-linjär log² n n n log n log-squared Linjär n² Kvadratisk n³ Kubisk Polynomisk k n Exponentiell Exponentiell n! n n Superexponentiell

Från kod till komplexitet Antag att vi har en rekursiv funktion vars tidskomplexitet vi vill analysera. Avgör vilket/vilka argument som påverkar körtiden T. Storleken på detta argument är problemstorleken n. Värdet av ett heltal Längden på en sträng/lista Höjden av ett träd...

Från kod till komplexitet Avgör hur körtiden för varje rekursivt steg beror av problemstorleken n. En lista av längd n traverseras Vägen till ett löv i ett träd hittas Problemstorleken spelar ingen roll (konstant körtid)... Avgör antalet rekursiva anrop och problemstorleken för dessa Ett anrop med en sträng ett tecken kortare (T(n-1)) Två anrop med hälften av alla element i listan (2T(n/2))...

Från kod till komplexitet Ställ upp en rekursion som beskriver körtiden för funktionen givet problemstorleken n. Har ofta formen T(n) = {Körtiden för basfallet, n=0 Körtiden för det allmänna fallet plus de rekursiva anropen, n>0 Hitta den slutna formen för rekursionen T och bevisa att den stämmer. Gissa/Prova/Rita/Slå upp formler (Alla medel tillåtna!) Master Theorem...

Från kod till komplexitet Betrakta nedanstående funktion som räknar antalet förekomster av x i en lista l: fun countoccurences(_, []) = 0 countoccurences(x, (f::r)) = if x = f then else 1 + countoccurences(x, r) countoccurences(x, r);

Från kod till komplexitet Hitta problemstorleken En längre lista tar längre tid att genomsöka Värdet på x spelar ingen roll för körtiden n = längden på listan l fun countoccurences(_, []) = 0 countoccurences(x, (f::r)) = if x = f then 1 + countoccurences(x, r) else countoccurences(x, r);

Från kod till komplexitet Hur påverkar n körtiden i varje steg? Funktionen genomför en heltalsjämförelse och eventuellt en addition. Den nuvarande längden på listan spelar ingen roll Körtiden i varje rekursivt steg är alltså konstant fun countoccurences(_, []) = 0 countoccurences(x, (f::r)) = if x = f then 1 + countoccurences(x, r) else countoccurences(x, r);

Från kod till komplexitet Undersök de rekursiva anropen Det allmänna fallet gör exakt ett rekursivt anrop I varje rekursivt anrop är listan ett element kortare Varje anrop där n>0 ger alltså upphov till exakt ett anrop med körtiden T(n-1) fun countoccurences(_, []) = 0 countoccurences(x, (f::r)) = if x = f then 1 + countoccurences(x, r) else countoccurences(x, r);

Från kod till komplexitet Ställ upp en rekursion och fi nn en sluten formel T(n) = { k, n = 0 0 T(n-1) + k 1, n > 0 T(n) = nk 1 + k 0 = Θ(n) fun countoccurences(_, []) = 0 countoccurences(x, (f::r)) = if x = f then 1 + countoccurences(x, r) else countoccurences(x, r);

Från kod till komplexitet Ett till exempel (funktionens syfte är oviktigt) fun gizmo [] = 0 gizmo (f::r) = let val v = countoccurences(f,r) in v + gizmo r end;

Från kod till komplexitet Problemstorleken n är listans längd I varje steg anropas countoccurences (som vi vet har linjär komplexitet) med en lista av längd n-1. Arbetsmängden i varje steg är alltså Θ(n-1) = Θ(n). Ett rekursivt anrop T(n-1) fun gizmo [] = 0 gizmo (f::r) = let val v = countoccurences(f,r) in v + gizmo r end;

Från kod till komplexitet Rekursion och sluten formel T(n) = { O(1), n = 0 T(n-1) + Θ(n), n > 0 T(n) = n Θ(n) + O(1) = Θ(n²) fun gizmo [] = 0 gizmo (f::r) = let val v = countoccurences(f,r) in v + gizmo r end;

Från kod till komplexitet Avgör vilket/vilka argument som utgör problemstorleken Avgör hur körtiden för varje rekursivt steg beror av problemstorleken n. Avgör antalet rekursiva anrop och problemstorleken för dessa Ställ upp en rekursion T(n) Hitta en sluten form för T(n) och bevisa den

Master Theorem Löser rekursioner på formen: Den intressanta termen är Tre fall: (+ regularity condition)

Master Theorem Vad betyder allt det här då? Jo: Om alltid är större än för något och tillräckligt stora, så är den slutna formen för rekursionen Vi säger att dominerar. Tänk på att kvoten mellan och måste vara polynomial (alltså i, för något ), annars är inte MT applicerbar!

Master Theorem Löser rekursioner på formen: Den intressanta termen är Tre fall: dominerar : växer som : dominerar : (+ regularity condition)

Övningar Hitta tidskomplexiteten för följande funktioner: fun foo([]) = 0 foo(f::r) = 1 + foo(r); fun bar([]) = 2 bar(f::r) = foo(r) + bar(r); fun baz(0) = 42 baz(n) = baz(n div 2) + baz(n div 2);