Föreläsning 5 Innehåll

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

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

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

Föreläsning 2 Datastrukturer (DAT037)

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning REPETITION & EXTENTA

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

Sökning och sortering

Asymptotisk komplexitetsanalys

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)

Programkonstruktion och Datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 13 Innehåll

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

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

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

Föreläsning 3-4 Innehåll

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

Föreläsning 11 Innehåll

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 12 Innehåll

Föreläsning 13 Innehåll

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

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 12 Innehåll

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

Föreläsning 9-10 Innehåll

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

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.

Tentamen Datastrukturer D DAT 036/INN960

Föreläsning 11 Datastrukturer (DAT037)

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

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

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.

Seminarium 13 Innehåll

Tentamen Datastrukturer D DAT 036/INN960

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

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

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

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

Datastrukturer och algoritmer

Lösning av några vanliga rekurrensekvationer

Datastrukturer D. Föreläsning 2

Algoritmer. Två gränssnitt

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

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

Magnus Nielsen, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

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

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

Föreläsning Datastrukturer (DAT037)

Programmering fortsättningskurs

Föreläsning 8 Innehåll

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

Tentamen Datastrukturer (DAT037)

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

Föreläsning 4 Innehåll

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

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

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

Fredag 10 juni 2016 kl 8 12

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

Tentamen, EDA501 Programmering M L TM W K V

Tentamen kl Uppgift 4. Uppgift 5

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

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

Föreläsning 13 Datastrukturer (DAT037)

Algoritmteori - effektivitet

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Teoretisk del. Facit Tentamen TDDC (6)

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

Algoritmer, datastrukturer och komplexitet

Föreläsning 9. 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.

Föreläsning 14 Innehåll

Vad har vi pratat om i kursen?

DAI2 (TIDAL) + I2 (TKIEK)

Rekursion och induktion för algoritmkonstruktion

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer D DAT 035/INN960

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Transkript:

Föreläsning 5 Innehåll Algoritmer och effektivitet Att bedöma och jämföra effektivitet för algoritmer Begreppet tidskomplexitet Datavetenskap (LTH) Föreläsning 5 VT 2019 1 / 39

Val av algoritm och datastruktur 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 VT 2019 2 / 39

Analys av algoritmer 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. Datavetenskap (LTH) Föreläsning 5 VT 2019 3 / 39

Tidsåtgång och problemets storlek 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 VT 2019 4 / 39

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 Datavetenskap (LTH) Föreläsning 5 VT 2019 5 / 39

Beräkna tidskomplexitet 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. for (int i = 0; i < a.length; i++) { 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 VT 2019 6 / 39

Tidskomplexitet och verklig tidsåtgång 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. Datavetenskap (LTH) Föreläsning 5 VT 2019 7 / 39

Diskutera Vilken tidskomplexitet får följande metod: public static int max(int[] a) { int max = Integer.MIN_VALUE; for (int i = 0; i < a.length; i++) { 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 VT 2019 8 / 39

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). Datavetenskap (LTH) Föreläsning 5 VT 2019 9 / 39

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; Räkna antal jämförelser. Tidskomplexitet? Datavetenskap (LTH) Föreläsning 5 VT 2019 10 / 39

Tidskomplexitet Undersök om alla element är unika 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 D.v.s. T (n) = n 2 /2 n/2 vilket är n 2 /2 för stora n-värden Datavetenskap (LTH) Föreläsning 5 VT 2019 11 / 39

Aritmetisk summa Repetition från matematiken 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: a 1 + a 2 + a 3 +... + a n = n(a 1 + a n )/2 Då blir 1 + 2 + 3 +... + n = n(1 + n)/2 och 1 + 2 + 3 +... + n 1 = (n 1)(1 + n 1)/2 = (n 1)n/2 Datavetenskap (LTH) Föreläsning 5 VT 2019 12 / 39

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 då samma tidskomplexitet som för den oförbättrade algoritmen. Datavetenskap (LTH) Föreläsning 5 VT 2019 13 / 39

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ör tidskomplexiteten. För stora värden på n dominerar den kvadratiska termen. T (n) n 2 /2 för stora värden på n. n T (n) = n(n 1)/2 n 2 /2 T (n)/(n 2 /2) 10 45 50 0.9 100 4 950 5 000 0.99 1 000 499 500 500 000 0.999 10 000 49 995 000 50 000 000 0.9999 Datavetenskap (LTH) Föreläsning 5 VT 2019 14 / 39

Uttrycka tidskomplexitet med hjälp av Ordo 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. Datavetenskap (LTH) Föreläsning 5 VT 2019 15 / 39

Ordobegreppet 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 T (n) cf (n) för alla n > n 0 För alla polynom T(n) av grad k: gäller att de är O(n k ). T (n) = a k n k + a k 1 n k 1 +... Datavetenskap (LTH) Föreläsning 5 VT 2019 16 / 39

Tidskomplexitet 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. T (n) = O(2n 2 ) = T (n) = O(n 2 ) Datavetenskap (LTH) Föreläsning 5 VT 2019 17 / 39

Ordobegreppet 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... Datavetenskap (LTH) Föreläsning 5 VT 2019 18 / 39

Asymptotisk tidskomplexitet 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. Man anger ju hur den asymptotiskt uppför sig för stora värden på n (problemets storlek). Datavetenskap (LTH) Föreläsning 5 VT 2019 19 / 39

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) 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? Datavetenskap (LTH) Föreläsning 5 VT 2019 20 / 39

Storleksordning för funktioner 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 Datavetenskap (LTH) Föreläsning 5 VT 2019 21 / 39

Tidskomplexitet för några algoritmer 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 VT 2019 22 / 39

Tidskomplexitet olika storleksordningar i praktiken 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 1 000 000 86.4 10 9 31.5 10 12 n log n 62 746 2.8 10 9 8 10 11 n 2 1 000 293 938 5.6 10 6 n 3 100 4 421 31 593 2 n 19 36 44 Datavetenskap (LTH) Föreläsning 5 VT 2019 23 / 39

Tidskomplexitet hur mycket hjälper en snabbare dator? 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 1 000 10 000 n log n 1 000 7 717 n 2 1 000 3 162 n 3 1 000 2 154 2 n 1 000 1 003 Datavetenskap (LTH) Föreläsning 5 VT 2019 24 / 39

Tidskomplexitet kan bero på indata /** Undersök om talet x finns i heltalsvektorn a. */ public static boolean contains(int[] a, int x) { for (int i = 0; i < a.length; i++) { 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. Datavetenskap (LTH) Föreläsning 5 VT 2019 25 / 39

Tidskomplexitet värsta fall och medelfall För algoritmer vars tidskomplexitet beror på indata kan 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 VT 2019 26 / 39

Värsta fall och medelfall formella definitioner 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) = 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. Datavetenskap (LTH) Föreläsning 5 VT 2019 27 / 39

Värsta fall för linjärsökning Problemets storlek = vektorns längd. Kalla denna n, d.v.s. n = a.length. I värsta fall blir jämförelsen alltid false och for-satsen utförs då för alla 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 VT 2019 28 / 39

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. Datavetenskap (LTH) Föreläsning 5 VT 2019 29 / 39

Medelfall för linjärsökning 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) = p i T i (n) = 1 (1 + 2 +... + n) = (n + 1)/2 = O(n) n Datavetenskap (LTH) Föreläsning 5 VT 2019 30 / 39

Tidskomplexitet för algoritmer som anropar metoder 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? Datavetenskap (LTH) Föreläsning 5 VT 2019 31 / 39

Tidskomplexitet för algoritmer som anropar metoder 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 1 jämförelser som är O(1). Metoden sort innehåller en effektiv sorteringsalgoritm med T (n) = O(n log n). De n 1 jämförelserna kostar sammanlagt (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 VT 2019 32 / 39

Tidskomplexitet för algoritmer som anropar metoder 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>(); for (int i = 0; i < a.length; i++) { if (! list.contains(a[i])) { list.add(a[i]); Vad får algoritmen för tidskomplexitet? Datavetenskap (LTH) Föreläsning 5 VT 2019 33 / 39

Tidskomplexitet för algoritmer som anropar metoder for (int i = 0; i < a.length; i++) { if (! list.contains(a[i])) { list.add(a[i]); 1 Vilka metoder anropas? contains och add 2 Hur många gånger anropas var och en av dem? 3 Vad har de för tidskomplexitet i värsta fall? För att besvara fråga 2 och 3 behöver vi antal element i listan. Problemet är att listan är tom från början och att antalet element ökar efter hand. Vi räknar på det maximala antalet. Listan kan som mest innehålla a.length element (om inga dubbletter finns). Antag alltså att n = a.length. Datavetenskap (LTH) Föreläsning 5 VT 2019 34 / 39

Tidskomplexitet för algoritmer som anropar metoder for (int i = 0; i < a.length; i++) { if (! list.contains(a[i])) { list.add(a[i]); Antag att n = a.length. (I värsta fall innehåller listan a.length 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 ). Datavetenskap (LTH) Föreläsning 5 VT 2019 35 / 39

Tidskomplexitet för algoritmer som anropar metoder Allmänna fallet Antag att en algoritm anropar metoderna o 1, o 2,..., o k. Metoderna o i anropas m i gånger. Metoderna 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. Datavetenskap (LTH) Föreläsning 5 VT 2019 36 / 39

Bättre datastruktur för att lagra en samling unika element En mängd (eng. Set) passar bättre än en lista om man ska lagra unika element. Set<Integer> list = new HashSet<Integer>(); for (int i = 0; i < a.length; i++) { 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 VT 2019 37 / 39

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; Datavetenskap (LTH) Föreläsning 5 VT 2019 38 / 39

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 VT 2019 39 / 39