Föreläsning 2 Datastrukturer (DAT037)

Relevanta dokument
Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 5 Innehåll

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

Sökning och sortering

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 10 Datastrukturer (DAT037)

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

Föreläsning 2. Länkad lista och iterator

Föreläsning 2. Länkad lista och iterator

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

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

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

DAT043 - föreläsning 8

Lösningsförslag till tentamen Datastrukturer, DAT037,

Länkade strukturer, parametriserade typer och undantag

Föreläsning 4 Innehåll

Föreläsning 4 Datastrukturer (DAT037)

Asymptotisk komplexitetsanalys

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

Länkade strukturer. (del 2)

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

Algoritmer. Två gränssnitt

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

Tentamen Datastrukturer (DAT037)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 10. ADT:er och datastrukturer

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

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Laboration A Objektsamlingar

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

F4. programmeringsteknik och Matlab

Datastrukturer D. Föreläsning 2

Föreläsning 14 Innehåll

Tentamen Datastrukturer D DAT 036/DIT960

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

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

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Datastrukturer. föreläsning 2

Föreläsning 8: Exempel och problemlösning

Föreläsning 3 Datastrukturer (DAT037)

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

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

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

Tentamen Datastrukturer D DAT 035/INN960

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Algoritmer, datastrukturer och komplexitet

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Samlingar Collection classes

Föreläsning 12: Exempel och problemlösning

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

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

Stackar, köer, iteratorer och paket

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Exempeltenta GruDat 2002/2003

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Repetition av OOP- och Javabegrepp

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2, vecka 8: Repetition

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

TDDC77 Objektorienterad Programmering

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Objektorienterad Programkonstruktion

Transkript:

Föreläsning 2 Datastrukturer (DAT037) Fredrik Lindblad 1 1 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037 1

Innehåll 2 Ordo-notation del 2 Kostnadsmodeller Programanalys del 2 Amorterad tidskomplexitet Generics

3 Vilka påståenden är korrekta? A. n 2 = O(n) B. n 2 = Ω(n) C. n = O(n 2 ) D. n = Ω(n 2 ) E. 10n + 7 = Θ(3n + 1) F. 10n + 7 = Θ(13n + 12)

3 Vilka påståenden är korrekta? A. n 2 = O(n) B. n 2 = Ω(n) C. n = O(n 2 ) D. n = Ω(n 2 ) E. 10n + 7 = Θ(3n + 1) F. 10n + 7 = Θ(13n + 12) Svar: B, C, E och F

Ordonotation: regler 4 Notera: 1 = O(n) 1 = O(n 2 ) n = O(n log n) n = O(n 2 )

Ordonotation: regler 5 Om T (n) är ett polynom av grad k: T (n) = O(n k ). 7n 2 + 3n + 2 = O(n 2 ). 0.1n 3 + 1000 = O(n 3 ).

Ordonotation: regler 6 Om k > 0 är en konstant: (log 2 n) k = O(n), log 2 (n k ) = k log 2 n = O(log n). För konstant a > 1: log a n = log 2 n/ log 2 a = O(log 2 n) = O(log n). (log 2 n) 10000 = O(n). log 2 (n 10000 ) = O(log n).

Ordonotation: regler 7 Om T (n) = O(f(n)) och U(n) = O(g(n)): T (n) + U(n) = O(f(n) + g(n)) = O(max(f(n), g(n))), T (n)u(n) = O(f(n)g(n)). 7n 2 + 3n 2 = O(n 2 + n 2 ) = O(n 2 ). 2n 3 + (log 2 n) 1000 = O(n 3 + n) = O(n 3 ). 2n 3 log 7 5n 2 = O(n 3 log n).

Komplexitetsklasser 8 O(1) O(log n) O(n) O(n log n) O(n 2 ) O(n k ) O(l n ) där k > 2 och l > 1.

Tidskomplexitet 9 Hur analyserar man tidskomplexitet? Mäta. Nackdelar: Kan vara tidskrävande, kanske inget bra stöd för design. Räkna instruktioner. Nackdelar: Komplicerat. Förenklad modell. Nackdelar: Inte tillämpligt i alla lägen.

Uniform kostnadsmodell 10 Enkel dator. Varje instruktion tar en tidsenhet. Bara enkla instruktioner, men godtyckligt stora tal. Oändligt minne.

Uniform kostnadsmodell 10 Enkel dator. Varje instruktion tar en tidsenhet. Bara enkla instruktioner, men godtyckligt stora tal. Oändligt minne. Inte realistisk. Fungerar ganska bra om man är försiktig. Används ofta i kursen.

Logaritmisk kostnadsmodell 11 Enkel dator. Tid beräknas i termer av indatas storlek, räknat i antal bitar. Oändligt minne. Lite mer realistisk, lite krångligare.

Vad är den asymptotiska tidskomplexiteten? 12 public static void swap(int[] a, int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp;

Vad är den asymptotiska tidskomplexiteten? 12 public static void swap(int[] a, int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; Varje rad är en primitiv operation, O(1). O(1 + 1 + 1) = O(1)

Vad är den asymptotiska tidskomplexiteten? 13 public static void scalarprod(double[] v, double f) { for (int i = 0; i < v.length; i++) { v[i] *= f;

Vad är den asymptotiska tidskomplexiteten? public static void scalarprod(double[] v, double f) { for (int i = 0; i < v.length; i++) { v[i] *= f; Låt n = v.length. Initiering av loop: O(1), villkorskoll och inkremenering: O(1), loopens kropp: O(1) O(1 + n 1 i=0 (1 + 1)) = O(1 + 2n) = O(n) 13

Vad är tidskomplexiteten? 14 public static int countduplpair(int[] a) { int n = 0; for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] == a[j]) n++; return n;

Vad är tidskomplexiteten? public static int countduplpair(int[] a) { int n = 0; for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] == a[j]) n++; return n; Låt n = a.length. Alla atomiska satser: O(1) O(1 + n 1 (1 + n 1 (1 + 1))) = i=0 j=i+1 O(1+ n 1 (n i 1)) = O(n(n 1) n 1 i=0 i=0 i) = O(n(n 1) n(n 1)/2) = O(n(n 1)/2) = O(n 2 ) 14

Vad är tidskomplexiteten? 15 public static double f(double[] a) { int i = a.length - 1; if (i == -1) return 0.0; double x = 0; for (;;) { x += a[i]; if (i == 0) break; i /= 2; return x;

16 Vad är tidskomplexiteten? Alla enkla satser i koden på föregående slide tar konstant tid (O(1)). Det väsentliga är hur många gånger slingan upprepas. Låt n = a.length n 1 1 2 2 3 4 3 5 8 4 (2 k + 1) 2 k+1 k + 2 antel iterationer

Vad är tidskomplexiteten? 17 För n [(2 k + 1) 2 k+1 ] är antalet iterationer k + 2. Alltså är antalet iterationer log 2 (n 1) + 2 = O(log n). Komplexiteten för metoden är O(log n).

Värsta-, bästafallskomplexitet 18 Vad är tidskomplexiteten? boolean hasduplicate(int[] a) { for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] == a[j]) return true; return false;

Exekveringstiden beror inte alltid enbart på indatans storlek, utan kan bero av dess beskaffenhet i övrigt. Därför talar man om värsta- och bästa fallskomplexitet. För de två exemplen räknade vi med att det inte fanns dubletter så att slingorna skulle exekveras fullt ut. Det var alltså värstafallskomplexiteten. I bästa fall hittas en dublett med en gång, d.v.s. bästa fallskomplexiteten är O(1). Vanligast är att prata om värstafallskomplexiteten eftersom man använder O() och är intresserad av hur lång tid det tar som längst. 19

Värsta-, bästafallskomplexitet 20 boolean hasduplicate(int[] a) { for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] == a[j]) return true; return false; (Värstafalls)komplexiteten är O(n 2 ). Bästafallskomplexiteten är O(1).

Amorterad tidskomplexitet 21 Lägga till ett element till en dynamisk array: O(l), där l är antalet element i arrayen. I avsaknad av annan information: Lägga till n element till en tom dynamisk array: O(n 2 ). Vår analys från förra föreläsningen: Θ(n). O(l) ger inte tillräckligt mycket information.

Amorterad tidskomplexitet 21 Lägga till ett element till en dynamisk array: O(l), där l är antalet element i arrayen. I avsaknad av annan information: Lägga till n element till en tom dynamisk array: O(n 2 ). Vår analys från förra föreläsningen: Θ(n). O(l) ger inte tillräckligt mycket information. Vi kommer att använda amorterad tidskomplexitet för att hantera den här situationen på ett smidigt sätt.

Bokföringsmetoden 22 Man kan låta tidiga, billiga operationer betala för dyra, sena. Efter dubblering: n snabba insättningar, 1 dubblering. Insättning: Lägg ett mynt på cellen, och ett på en gammal cell. Kopiering: Har ett mynt på varje cell, kopieringen betald.

Bokföringsmetoden 23 Amorterad tidskomplexitet = faktisk tidskomplexitet + värdet av nya mynt värdet av sparade mynt som används.

Bokföringsmetoden 24 Amorterad tidskomplexitet för insättning utan kopiering: O(1) + 2m = O(1). Här är m värdet av ett mynt (en konstant > 0). Amorterad tidskomplexitet för kopiering: O(n) nm. Om m är tillräckligt stor: O(n) nm = O(1).

Bokföringsmetoden 25 Amorterad tidskomplexitet för att lägga till ett element till en dynamisk array: O(1). I avsaknad av andra operationer. En operation kan ges olika amorterad tidskomplexitet i olika analyser, beroende på hur mycket vi betalar, och hur många sparade mynt vi använder.

Amorterad tidskomplexitet 26 Vissa operationer långsamma: kan vara problematiskt i realtidssammanhang. (Värstafalls)komplexiteten för insättning i dynamisk array är O(n) för varje enskilt anrop. Notera att om man utför n operationer med komplexiteten O(f(n)) amorterat, så är komplexiteten för denna sekvens O(nf(n)) (ej amorterat).

Generics 27 Att återanvända kod är en princip som genomsyrar programmerandet och design av programspråk. Vi har sub-rutiner och klass-arv etc. som stöder detta. En sak som också främjar detta är generics/polymorfism. När data inte behöver vara en av specifik typ kan vi i java säga att den kan vara vad som helst.

28 Här är ett exempel på en generisk metod: static <E> void reverse(e[] arr) { E tmp; for (int i = 0; i < arr.length / 2; i++) { tmp = arr[i]; arr[i] = arr[arr.length-1-i]; arr[arr.length-1-i] = tmp;

Förutom generiska metoder kan man även definiera generiska interface och klasser. Generics kommer vi använda mycket eftersom datastrukturer handlar om att organisera många data-värden. Man vill förstås implementera datastrukturer för alla möjliga typer av data på en gång. Ofta kan inte de generiska typerna vara helt godtyckliga utan måste ha någon egenskap som används av metoden/klassen. 29

30 Här är ett exempel där jämförelse måste vara definierad för den okända typen: static <E extends Comparable<? super E>> E findmin(e[] arr) { if (arr.length == 0) return null; E min = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i].compareto(min) < 0) min = arr[i]; return min;

Abstrakt datatyp/datastruktur 31 Abstrakt datatyp (matematisk abstraktion): lista. Datastrukturer (implementation): Array. Enkellänkad lista.

ADT-er 32 Kan använda en datastruktur för en viss ADT för att implementera en annan ADT.

Samlingar (Collections) i Java 33 Java Collections Framework. ADT gränssnitt, datastruktur klass. Collection utökar Iterable, d.v.s. alla samlingar har metoden iterator som kan användas för att genomlöpa alla element. En Collection har också några andra metoder gemensamt, t.ex. add, remove, contains, size.

Iterator 34 En iterator genomlöper som regel själva underliggande datastrukturen, inte en kopia av den. Problem kan uppstå om man ändrar datastrukturen under tiden. Gränssnittet har tre metoder: boolean hasnext() E next() void remove() (denna är frivilligt att implementera)

Mängd (Set) 35 Den abstrakta datatypen mängd ska implementeras i labb 1. ADT Mängd Operationer (exkl konstruerare) add, remove, contains En mängd innehåller aldrig två instanser som är lika (enligt equals). En mängd är en samling. Vi återkommer senare i kursen till mängder och de gängse implementationerna av dem.

Exempel, mängd och iterator Set<String> s = new HashSet<>(); s.add("a"); s.add("b"); s.add("a"); s.remove("a"); System.out.println(s.contains("A")); // false System.out.println(s.contains("B")); // true s.add("c"); Iterator<String> iter = s.iterator(); while (iter.hasnext()) { System.out.println(iter.next()); // prints B and C (maybe not in that order) for (String e : s) { System.out.println(e); // this loop has same effect as iterator // creation and while loop. 36