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

Relevanta dokument
Föreläsning 5 Innehåll

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

Föreläsning 2 Datastrukturer (DAT037)

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

Föreläsning REPETITION & EXTENTA

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Sökning och sortering

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

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

Föreläsning 2 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Asymptotisk komplexitetsanalys

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Programkonstruktion och Datastrukturer

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Föreläsning 3-4 Innehåll

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

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Föreläsning 11 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 13 Innehåll

Föreläsning 1. Introduktion. Vad är en algoritm?

Saker du ska kunna Föreläsning 13 & 14

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 12 Innehåll

Föreläsning 9-10 Innehåll

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 12 Innehåll

Algoritmer, datastrukturer och komplexitet

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Seminarium 13 Innehåll

Algoritmer, datastrukturer och komplexitet

Tentamen Datastrukturer D DAT 036/INN960

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 13 Innehåll

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

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

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Tentamen Datastrukturer D DAT 036/INN960

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

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

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

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

Datastrukturer och algoritmer

Lösning av några vanliga rekurrensekvationer

Datastrukturer D. Föreläsning 2

Algoritmer. Två gränssnitt

Föreläsning 8 Innehåll

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

Magnus Nielsen, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Föreläsning Datastrukturer (DAT037)

Programmering fortsättningskurs

Datastrukturer. föreläsning 2

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 036/DIT960

Tommy Färnqvist, IDA, Linköpings universitet

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

Fredag 10 juni 2016 kl 8 12

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

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

Tentamen Datastrukturer (DAT037)

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

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 14 Innehåll

Tentamen kl Uppgift 4. Uppgift 5

Tentamen, EDA501 Programmering M L TM W K V

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

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 4 Innehåll

Föreläsning 13 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

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

Algoritmteori - effektivitet

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 1. Introduktion och sökning i graf. Vad är en algoritm?

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Teoretisk del. Facit Tentamen TDDC (6)

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

Föreläsning 9. Sortering

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Vad har vi pratat om i kursen?

Lösningar Datastrukturer TDA

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning 9 Innehåll

Rekursion och induktion för algoritmkonstruktion

Transkript:

Föreläsning 5 Innehåll Val av algoritm och datastruktur Algoritmer och effektivitet Att bedöma och jämföra effektivitet för algoritmer Begreppet tidskomplexitet Det räcker inte med att en algoritm är korrekt den måste även producera resultat inom rimlig tid. Både val av algoritm och datastruktur påverkar effektiviteten. Vi måste kunna beräkna effektiviteten (tidsåtgången). Datavetenskap (LTH) Föreläsning 5 HT 2017 1 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 2 / 38 Analys av algoritmer Tidsåtgång och problemets storlek Effektivitet (tidsåtgång) tidskomplexitet - ett mått på hur exeveringstiden växer med problemets storlek Minneskrav rumskomplexitet Svårighetsgrad Ju mer komplicerad desto svårare att översätta till program och underhålla. Tiden det tar att lösa ett problem är oftast en strängt växande funktion av problemets storlek. Det tar längre tid att summera 100 000 tal än att summera 100 tal. Vissa enkla problem kan dock lösas på konstant tid oavsett storleken. Om vi t.ex. har en vektor med n tal kan vi alltid ta reda på det i:e talet i vektorn på konstant tid oavsett hur stort n är. Exempel: int nbr = a[i]; Datavetenskap (LTH) Föreläsning 5 HT 2017 3 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 4 / 38

Tidskomplexitet Beräkna tidskomplexitet Tidskomplexitet T(n) är ett mått på hur tidsåtgången växer med problemets storlek n. Tidskomplexiteten uttrycks som en funktion av problemets storlek. Med tidskomplexitet kan vi jämföra olika algoritmers effektivitet. Tidskomplexiteten uttrycks så att vi är oberoende av vilken dator som exekverar algoritmen. Vi behöver inte exekvera algoritmerna för att kunna jämföra deras effektivitet. låg tidskomplexitet () effektiv () billig, låg kostnad hög tidskomplexitet () dålig effektivitet () dyr, hög kostnad Räkna (ungefär) hur många basala operationer som utförs i algoritmen. Med basal operation menas en operation som tar konstant tid på en dator, t.ex. en aritimetisk operation eller en jämförelseoperation. Exempel: Antag att vektorn a innehåller n tal som ska summeras. sum += a[i]; Satsen sum += a[i]; utförs n gånger och algoritmen får då T (n) =n. Datavetenskap (LTH) Föreläsning 5 HT 2017 5 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 6 / 38 Tidskomplexitet och verklig tidsåtgång Diskutera Vilken tidskomplexitet får följande metod: Vi har räknat ut att tidskomplexiteten T (n) för summeringen av n tal är n (linjär tidskomplexitet). Verklig tidsåtgång t(n) blir då c n eller c T (n), där c är tidsåtgången för additionerna och tilldelningarna på den dator där summeringen exekveras. Exekveringstiden växer linjärt med antal element som ska summeras. Vi har olika verklig tid på olika datorer, men tidskomplexiteten beräknad på detta sätt är densamma för alla. public static int max(int[] a) { int max = Integer.MIN_VALUE; if (a[i] > max) { max = a[i]; return max; Antag att det vid en provkörning tog 17 ms att exekvera metoden med en vektor med 1000000 tal. Uppskatta hur lång tid det skulle ta att exekvera metoden om man fördubblar antal element i vektorn. Datavetenskap (LTH) Föreläsning 5 HT 2017 7 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 8 / 38

Beräkna tidskomplexitet Exempel Beräkna tidskomplexiteten för att summera talen i en kvadratisk matris m: for (int i = 0; i < m.length; i++) { for (int k = 0; k < m[i].length; k++) { sum += m[i][k]; Antag att matrisen innehåller n n element. De satser som utförs flest gånger är de som finns i den innersta for-loopen. Satsen sum += m[i][k]; utförs n n gånger och algoritmen får då T (n) =n 2 (kvadratisk tidskomplexitet). Diskutera Metoden nedan undersöker om alla element i vektorn a är unika. Exempel: Om a = {1, 4, 2, 9, 7 ska resultatet bli true. Om a = {1, 4, 2, 9, 2 ska resultatet bli false. public static boolean allunique(int[] a) { boolean unique = true; for (int i = 0; i < a.length - 1; i++) { for (int k = i + 1; k < a.length; k++) { if (a[i] == a[k]) { unique = false; return unique; Tidskomplexitet? Datavetenskap (LTH) Föreläsning 5 HT 2017 9 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 10 / 38 Tidskomplexitet Undersök om alla element är unika Aritmetisk summa Repetition från matematiken i-värde för yttre for-loopen Antal ggr satserna i inre for-loopen utförs 0 n 1 1 n 2...... n 4 3 n 3 2 n 2 1 Totalt antal gånger satserna i inre for-satsen utförs är: 1 + 2 + 3 +...+ n 1 = n(n 1)/2 Antag att skillnaden mellan två på varandra följande tal i en följd är konstant. Då kan vi beräkna summan av talen genom formeln: Då blir och a 1 + a 2 + a 3 +...+ a n = n(a 1 + a n )/2 1 + 2 + 3 +...+ n = n(1 + n)/2 1 + 2 + 3 +...+ n 1 =(n 1)(1 + n 1)/2 =(n 1)n/2 D.v.s. T (n) =n 2 /2 n/2 vilket är n 2 /2förstoran-värden Datavetenskap (LTH) Föreläsning 5 HT 2017 11 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 12 / 38

Förbättrad algoritm Undersök om alla element är unika Vi bör avbryta algoritmen så fort vi hittat en dubblett: public static boolean allunique(int[] a) { for (int i = 0; i < a.length - 1; i++) { for (int k = i + 1; k < a.length; k++) { if (a[i] == a[k]) { return false; return true; Nu blir det svårare att beräkna exakt hur många gånger jämförelsen (a[i] == a[k] utförs. Det beror på indata. Enklast är att räkna på värsta fallet som här inträffar då inga dubbletter finns. Vi får samma tidskomplexitet som för den oförbättrade algoritmen. Datavetenskap (LTH) Föreläsning 5 HT 2017 13 / 38 Tidskomplexitet Undersök om alla element är unika För (den oförbättrade) algoritmen fick vi fram uttrycket T (n) =n(n 1)/2 = n 2 /2 n/2 förtidskomplexiteten. För stora värden på n dominerar den kvadratiska termen. T (n) n 2 /2förstoravärdenpån. n T (n) =n(n 1)/2 n 2 /2 T (n)/(n 2 /2) 10 45 50 0.9 100 4950 5000 0.99 1000 499 500 500 000 0.999 10 000 49 995 000 50 000 000 0.9999 Datavetenskap (LTH) Föreläsning 5 HT 2017 14 / 38 Uttrycka tidskomplexitet med hjälp av Ordo Ordobegreppet För att uttrycka hur en algoritms tidskomplexitet uppför sig vid stora värden på n kan vi använda Ordo-notation. Beräkna tidskomplexiteten genom att räkna hur många gånger de dominerande operationerna utförs. Exempel: T (n) =n 2 /2 n/2 Stryk sedan allt utom den dominerande termen. Stryk även ev. konstanter på den dominerande termen. Exempel: T (n) =O(n 2 ) Detta ger en övre gräns för tidskomplexiteten. T (n) =O(n 2 ) betyder att för stora värden på n understiger den verkliga exekveringstiden cn 2. Ordo-begeppet från matematiken ger oss möjlighet att begränsa en funktion uppåt. En funktion T (n) är O(f (n)) (uttalas T är ordo f ) om det finns konstanter n 0 och c så att För alla polynom T(n) av grad k: gäller att de är O(n k ). T (n) apple cf (n) för alla n > n 0 T (n) =a k n k + a k 1 n k 1 +... Datavetenskap (LTH) Föreläsning 5 HT 2017 15 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 16 / 38

Tidskomplexitet Ordobegreppet Vi har tidigare räknat fram T (n) genom att beräkna hur många gånger de dominerande operationerna utförs. För att ange storleksordningen på T (n) med ordonotation kan allt utom den dominerande termen strykas. T (n) = dominant term + mindre termer =) T (n) = O(dominant term). T (n) =2n 2 + n =) T (n) =O(2n 2 ) Eventuell konstant på den dominerande termen kan också strykas. I komplexitetsberäkningar förutsätts att man inte ger en större övre gräns än nödvändigt: Om T (n) =2n 2 + n är T (n) =O(n 2 ) men det är även sant att T (n) =O(n 3 ) eller O(n 4 ) eller... T (n) =O(2n 2 )=) T (n) =O(n 2 ) Datavetenskap (LTH) Föreläsning 5 HT 2017 17 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 18 / 38 Asymptotisk tidskomplexitet Diskutera tidskomplexitet och verklig tidsåtgång För stora värden på n gäller att verklig tidsåtgång t(n) =c T (n) När man i stället för att ange ett exakt uttryck på tidskomplexiteten använder ordonotation brukar man tala om algoritmens asymptotiska tidskomplexitet. Problem: En algoritm har tidskomplexiteten T (n) =O(n 2 ). Antag att då man undersöker om elementen i en vektor med 10000 element är unika får en exekveringstid på 20 ms. Ungefär hur lång tid tar det att exekvera programmet för n = 1000000? Man anger ju hur den asymptotiskt uppför sig för stora värden på n (problemets storlek). Datavetenskap (LTH) Föreläsning 5 HT 2017 19 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 20 / 38

Storleksordning för funktioner Tidskomplexitet för några algoritmer När en algoritm har tidskomplexiteten T (n) =O(1), så säger man att tidskomplexiteten är konstant. På samma sätt används namn på vanligt förekommande storleksordningar för T (n) =O(f (n)), enligt tabellen: f(n) namn 1 konstant log n logaritmisk n linjär n log n log-linjär n 2 kvadratisk n 3 kubisk 2 n exponentiell Sätta in ett element först i en lista med n element: O(1) Söka med binärsökning bland n sorterade element: O(log n) Söka bland n osorterade element: O(n) Sortera med bättre metoder som Mergesort, Heapsort och Quicksort (som kommer senare i kursen): O(n log n) Sortera n tal med urvalssortering, bubbelsortering eller insättningssortering: O(n 2 ) Multiplicera två n n-matriser med den vanliga metoden: O(n 3 ) Vissa dekrypteringsalgoritmer (n=antal bitar i nyckeln): O(2 n ) Datavetenskap (LTH) Föreläsning 5 HT 2017 21 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 22 / 38 Tidskomplexitet olika storleksordningar i praktiken Tidskomplexitet hur mycket hjälper en snabbare dator? Största värde på n för exekveringstiden t om den dominerande operationen tar 1/1 000 000 sek: T(n) t = 1 sekund t = 24 timmar t=1år n 1000000 86.4 10 9 31.5 10 12 n log n 62 746 2.8 10 9 8 10 11 n 2 1000 293 938 5.6 10 6 n 3 100 4421 31 593 2 n 19 36 44 En algoritm behandlar 1000 element på 1 sek på vår dator idag. Inför framtiden hoppas vi på en 10 gånger så snabb dator. Hur många element kan vi behandla på samma tid då? Svaret beror på algoritmens tidskomplexitet. T(n) idag framtiden n 1000 10 000 n log n 1000 7717 n 2 1000 3162 n 3 1000 2154 2 n 1000 1003 Datavetenskap (LTH) Föreläsning 5 HT 2017 23 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 24 / 38

Tidskomplexitet kan bero på indata Tidskomplexitet värsta fall och medelfall /** Undersök om talet x finns i heltalsvektorn a. */ public static boolean contains(int[] a, int x) { if (a[i] == x) { return true; return false; // kommer vi hit fanns ej x i vektorn Det som görs inuti for-satsen dominerar. Komplikation: Går inte att säga exakt hur många gånger den utförs. Det beror på indata. För algoritmer vars tidskomplexitet beror på indata brukar man ställa två frågor: Vad är den i värsta fall för instanser av storlek n? Vad är den i medeltal för alla instanser av storlek n? Tidskomplexitet i värsta fall för instanser av storlek n brukar betecknas W (n). W står för Worst case. Tidskomplexitet i medelfall för instanser av storlek n brukar betecknas A(n). A står för Average. Datavetenskap (LTH) Föreläsning 5 HT 2017 25 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 26 / 38 Värsta fall och medelfall formella definitioner Värsta fall för linjärsökning Om det finns k olika instanser av storlek n och tidskomplexiteten för den i:e instansen är T i (n) och sannolikheten för denna instans är P i gäller: W (n) =max T i (n) A(n) = X P i T i (n) W (n) är ofta lika lätt att beräkna som T (n). A(n) ofta svårare. För en del algoritmer okänt på grund av svårigheten att ge värden åt sannolikheter för de olika instanserna av storlek n. Problemets storlek = vektorns längd. Kalla denna n, d.v.s. n = a.length. Ivärstafallblirjämförelsenalltidfalseochfor-satsenutförsdåföralla i-värden från 0 till och med n 1. Satserna inuti for-satsen utförs då n gånger. Alltså: W (n) =n = O(n). Datavetenskap (LTH) Föreläsning 5 HT 2017 27 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 28 / 38

Medelfall för linjärsökning Medelfall för linjärsökning Komplikation: Det finns ett oändligt antal instanser av storlek n. Om vi antar följande villkor kan vi enkelt beräkna medelfallstiden: 1 x finns i vektorn. 2 Det är lika sannolikt att x finns på var och en av platserna. D.v.s. sannolikheten är 1/n att x finns på plats i för i = 0, 1,...,n 1. 3 Alla elementen i vektorn är olika. Vi har då minskat antal möjliga instanser av problemet till n: x finns på plats 0, x finns på plats 1,..., x finns på plats n 1. i instans p i T i (n) 0 x==a[0] 1/n 1 1 x==a[1] 1/n 2............ i x==a[i] 1/n i + 1............ n 1 x==a[n 1] 1/n n A(n) = X p i T i (n) = 1 (1 + 2 +... + n) =(n + 1)/2 = O(n) n Datavetenskap (LTH) Föreläsning 5 HT 2017 29 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 30 / 38 Tidskomplexitet för algoritmer som anropar operationer Tidskomplexitet för algoritmer som anropar operationer De flesta algoritmer uttrycker sig inte enbart med basala O(1)-operationer som +,,... utan unyttjar mera kraftfulla operationer. Exempel: Sortera en vektor och undersök sedan om alla element är unika. public static boolean allunique(int[] a) { Arrays.sort(a); for (int i = 0; i < a.length - 1; i++) { if (a[i] == a[i + 1]) { return false; return true; Tidskomplexitet? Antag att vektorn innehåller n element. Algoritmen gör ett anrop av metoden sort som inte är O(1) och gör i värsta fall n 1jämförelsersomärO(1). Metoden sort innehåller en effektiv sorteringsalgoritm med T (n) =O(n log n). De n 1jämförelsernakostarsammanlagt(n 1) O(1) =O(n). Sammanlagd kostnad för algoritmen blir O(n log n)+o(n). T (n) =O(n log n) D.v.s. den operation som anropas minst antal gånger dominerar i detta fall och bestämmer tidskomplexiteten. Datavetenskap (LTH) Föreläsning 5 HT 2017 31 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 32 / 38

Tidskomplexitet för algoritmer som anropar operationer Tidskomplexitet för algoritmer som anropar operationer Antag att en algoritm anropar operationerna o 1, o 2,...,o k. Operationen o i anropas m i gånger. Operationen o i har värstafalltidskomplexiteten W i (n). Då blir kostnaden för algoritmen i värsta fall: m 1 W 1 (n)+m 2 W 2 (n)+... + m k W k (n) Deltermer som inte dominerar detta uttryck kan sedan strykas om man bara vill ha en ordo-uppskattning. Exempel: Antag att en vektor a innehåller n tal. I följande algoritm läggs alla unika tal från a in i en lista. List<Integer> list = new ArrayList<Integer>(); if (! list.contains(a[i])) { list.add(a[i]); Vad får algoritmen för tidskomplexitet? Datavetenskap (LTH) Föreläsning 5 HT 2017 33 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 34 / 38 Tidskomplexitet för algoritmer som anropar operationer Bättre datastruktur för att lagra en samling unika element if (! list.contains(a[i])) { list.add(a[i]); Antag att n = a.length. I värsta fall innehåller listan då n element. Inuti contains söks i värsta fall alla element igenom. Denna sökning har tidskomplexiteten O(n). De n anropen av contains kostar då O(n 2 ). I add läggs elementet till sist. Denna operation har tidskomplexiteten O(1). I värsta fall anropas add n gånger vilket kostar O(n). Sammanlagd kostnad för algoritmen blir O(n 2 )+O(n) vilket innebär att T (n) =O(n 2 ). En mängd (eng. Set) passar bättre än en lista om man ska lagra unika element. Set<Integer> list = new HashSet<Integer>(); list.add(a[i]); Dubblettkontroll sker inuti add. Metoden add i klassen HashSet har i medelfall (och i praktiken) tidskomplexiteten O(1). Mängder och klassen HashSet behandlas senare under kursen. Datavetenskap (LTH) Föreläsning 5 HT 2017 35 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 36 / 38

Diskutera Vad får följande algoritm för tidskomplexitet? List<Integer> list = new LinkedList<Integer>();... int s = 0; for (int i = 0; i < list.size(); i++) { s += list.get(i); System.out.println(s); Ovanstående sätt att iterera genom en länkad lista är ineffektivt. Istället bör man använda en iterator. Vilken tidskomplexitet får algoritmen då? for (int nbr : list) { s += nbr; Exempel på vad du ska kunna Förklara begreppet tidskomplexitet. Beräkna tidskomplexiteten T (n) för enkla algoritmer. Uttrycka tidskomplexitet med O (ordo). Förstå vad olika storleksordningar på tidskomplexiteten innebär för algoritmers användbarhet (konstant, logaritmisk, linjär, kvadratisk, exponentiell,...). Förstå och kunna använda sambandet mellan verklig tidsåtgång och teoretiskt beräknad tidskomplexitet, t(n) c T (n). Avgöra när en algoritms tidskomplexitet beror på indata och i sådana fall kunna beräkna tidskomplexitet för värsta fall, W (n). Beräkna tidskomplexitet för algoritmer som använder färdiga operationer. Datavetenskap (LTH) Föreläsning 5 HT 2017 37 / 38 Datavetenskap (LTH) Föreläsning 5 HT 2017 38 / 38