Föreläsning 1 Datastrukturer (DAT037)

Relevanta dokument
Föreläsning Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

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

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 13 Datastrukturer (DAT037)

Sökning och sortering

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 14 Innehåll

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

Föreläsning Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

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

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

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

Tentamen Datastrukturer (DAT036)

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

Föreläsning 3 Datastrukturer (DAT037)

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

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 5 Innehåll

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

Tentamen Datastrukturer (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 11 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen, Algoritmer och datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

Exempeltenta GruDat 2002/2003

Föreläsning 5 Datastrukturer (DAT037)

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

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

Tentamen i Algoritmer & Datastrukturer i Java

Algoritmer. Två gränssnitt

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

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

Föreläsning Datastrukturer (DAT036)

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

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

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

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Tommy Färnqvist, IDA, Linköpings universitet

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 9 Innehåll

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

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

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

Föreläsning 6 Datastrukturer (DAT037)

Rebecka Geijer Michaeli, IDA, Linköpings universitet. 1 Administrativ information Upplägg... 2

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

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

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

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT037)

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

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

Abstrakta datastrukturer

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

Föreläsning 3. Stack

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Tentamen i Algoritmer & Datastrukturer i Java

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

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Algoritmer, datastrukturer och komplexitet

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Facit Tentamen TDDC (7)

Tentamen Datastrukturer för D2 DAT 035

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

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

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

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

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Programkonstruktion och Datastrukturer

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

Innehåll. Mina målsättningar. Vad krävs för att nå dit? Obligatoriska uppgifter. Websajten. Datastrukturer och algoritmer

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

Teoretisk del. Facit Tentamen TDDC (6)

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

Tentamen Datastrukturer D DAT 035/INN960

Transkript:

Föreläsning 1 Datastrukturer (DAT037) Fredrik Lindblad 1 30 oktober 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 Introduktion Dynamiska arrayer Asymptotisk komplexitet Programanalys del 1 Ordo-notation del 1

Datastrukturer 3 Organisering av data Inte bara korrekt, utan effektivt (framförallt hastighet men även minneskrav) Abstrakt datatyp (ADT) vissa vanliga tillämpningar av datasamlingar (lista, stack, kö, prioritetskö, mängd, avbildning, graf) Vanliga datastrukturer som implementerar dessa ADTer dynamisk array, länkad lista, heap, sökträd, m.m. Plus några klassiska algoritmer sortering, grafalgoritmer

Exempel public class Bits { public static void main(string[] args) { int n = Integer.parseInt(args[0]); String bits = new String(); for (int i = 0; i < n; i++) { bits += i & 1; System.out.print(bits); 4

5 Hur lång tid tar det att köra java Bits 100000, jämfört med java Bits 50000? Lika snabbt, 2 eller 4 ggr långsammare?

5 Hur lång tid tar det att köra java Bits 100000, jämfört med java Bits 50000? Lika snabbt, 2 eller 4 ggr långsammare? Svar : Ungefär 4 ggr långsammare?

Dåligt val av datastruktur public class Bits { public static void main(string[] args) { int n = Integer.parseInt(args[0]); String bits = new String(); for (int i = 0; i < n; i++) { bits += i & 1; System.out.print(bits); 6

Bättre val av datastruktur public class FastBits { public static void main(string[] args) { int n = Integer.parseInt(args[0]); StringBuffer bits = new StringBuffer(); for (int i = 0; i < n; i++) { bits.append(i & 1); System.out.print(bits); 7

8 8 6 Sekunder 4 2 0 0 50000 100000 150000 200000 n Bits FastBits

9 8 6 Sekunder 4 2 0 0 1000000 2000000 n Bits FastBits

Tillbaka till exemplet += motsvarar för strängar append private char[] string; public void append(char c) { char[] temp = new char[string.length + 1]; for (int i = 0; i < string.length; i++) { temp[i] = string[i]; temp[string.length] = c; string = temp; Antag att varje primitiv operation tar en viss konstant tid. 10

Tillbaka till exemplet Analysera koden och räkna hur många sådana tidsenheter som går åt. private char[] string; public void append(char c) { char[] temp = new char[string.length + 1]; // n for (int i = 0; i < string.length; i++) { // 3n temp[i] = string[i]; temp[string.length] = c; // 1 string = temp; // 1 Totalt (för n = string.length): 4n + 2. 11

Tillbaka till exemplet 12 private char[] string; public void append(char c) { char[] temp = new char[string.length + 1]; // n for (int i = 0; i < string.length; i++) { // 3n temp[i] = string[i]; temp[string.length] = c; // 1 string = temp; // 1 Vi kommer använda ett mått som låter oss säga totalt (för n = string.length): n.

Detta mått bortser från konstanta termer och koefficienter, vilket gör att vi abstraherar bort vad som sker för små indata/låga tal (det är de stora körningarna som tar tid och är intressanta) och den faktiska exekveringstiden (vilken beror på hårdvara, kompilator, etc.). 13

Tillbaka till exemplet 14 String bits = new String(); // 1 for (int i = 0; i < n; i++) { //??? bits += i & 1; // i System.out.print(bits); // n

??? 15 n 1 i = 0 + 1 + 2 + + (n 1) i=0 = n n 1 2 n 2

Tillbaka till exemplet 16 String bits = new String(); // 1 for (int i = 0; i < n; i++) { // n 2 bits += i & 1; // i System.out.print(bits); Totalt: n 2. // n

Tillbaka till exemplet 16 String bits = new String(); // 1 for (int i = 0; i < n; i++) { // n 2 bits += i & 1; // i System.out.print(bits); Totalt: n 2. // n Anta att vi kan utföra 10 6 instruktioner /s. n = 10 5 3 timmar n = 10 6 10 dagar n = 10 7 3 år

Analys 17 Verkar onödigt att kopiera arrayen varje gång. När vi kopierar kan vi lägga till några extra tomma element i slutet av arrayen, så att vi inte behöver kopiera lika ofta. Låt oss göra arrayen dubbelt så stor.

Dubbelt så stor private char[] string; private int length; public void append(char c) { if (length == string.length) { char[] temp = new char[2 * string.length]; for (int i = 0; i < string.length; i++) { temp[i] = string[i]; string = temp; string[length++] = c; 18

Dubbelt så stor 19 StringBuffer bits = new StringBuffer(); // 1 for (int i = 0; i < n; i++) { // n +??? bits.append(i & 1); System.out.print(bits); // n

??? 20 Anta att n är en jämn tvåpotens, n = 2 k (k N): k 2 i = 1 + 2 + 4 + + 2 k i=0 = 2 1+k 1 = 2n 1 n

Dubbelt så stor 21 StringBuffer bits = new StringBuffer(); // 1 for (int i = 0; i < n; i++) { bits.append(i & 1); // n System.out.print(bits); Totalt: n. Anta att vi kan utföra 10 6 instruktioner /s. n = 10 6 1 sekund n = 10 9 20 minuter n = 10 12 10 dagar // n

Datastrukturer 22 String: append kopierar varje gång. Kan ej ändras: immutable. StringBuffer: append kopierar sällan. Dynamisk array.

Blir programmet effektivt om vi lägger till 10 element istället för att göra arrayen dubbelt så stor? 23

23 Blir programmet effektivt om vi lägger till 10 element istället för att göra arrayen dubbelt så stor? Svar: Knappt 10 gånger snabbare, men fortfarande är tidsåtgången n 2.

Dynamiska arrayer med remove 24 Har add och remove amorterade tidskomplexiteten O(1) om man halverar arrayen när den blir Varför? halvfull? kvartsfull?

Dynamiska arrayer med remove Har add och remove amorterade tidskomplexiteten O(1) om man halverar arrayen när den blir Varför? halvfull? kvartsfull? Svar: Inte för halvfull, men för kvartsfull. Om storleken halveras vid halvfull och dubbleras vid full så tar varje operation n om man gör varannan append och varannan remove och storleken är sådan att arrayen krymper och växer varje gång. 24

Asymptotisk komplexitet 25 Kursen fokuserar på asymptotisk komplexitet: vad händer när storleken går mot oändligheten? 8n + 3 O(n) 4n 2 + 3n + 6 O(n 2 )

Ordo-notation (en variant) 26 T (n) = O(f(n)) om och endast om det finns ett naturligt tal n 0 och ett reellt tal c > 0 så att T (n) cf(n) för alla n n 0.

Ω 27 T (n) = Ω(f(n)) om och endast om det finns ett naturligt tal n 0 och ett reellt tal c > 0 så att T (n) cf(n) för alla n n 0.

Θ 28 T (n) = Θ(f(n)) om och endast om T (n) = O(f(n)) och T (n) = Ω(f(n))

Exempel 29 Kan använda Θ för att uttrycka resultatet av tidigare analyser: Bits: Θ(n 2 ), kvadratisk asymptotisk tidskomplexitet. FastBits: Θ(n), linjär asymptotisk tidskomplexitet.