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

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

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

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

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

Föreläsning 3. Stack

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

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

Föreläsning 3. Stack

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

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

Föreläsning 2 Datastrukturer (DAT037)

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

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

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

OOP Objekt-orienterad programmering

DAT043 - föreläsning 8

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 5 Innehåll

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

Repetition av OOP- och Javabegrepp

Sökning och sortering

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

Repetition av OOP- och Javabegrepp

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 4 Innehåll

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

Arrayer. results

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

Datastrukturer. föreläsning 3. Stacks 1

Länkade strukturer. (del 2)

Generisk klass med typparameter Inre klass - ListIterator

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

Länkade strukturer, parametriserade typer och undantag

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

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

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

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

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

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

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

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

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Tentamen Datastrukturer, DAT037 (DAT036)

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

Samlingar Collection classes

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

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

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

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Föreläsning 7. Träd och binära sökträd

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

Objektorienterad programmering i Java

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Laboration A Objektsamlingar

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

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

TDDC30 Programmering i Java, datastrukturer och algoritmer

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 5. Rekursion

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

Samlingar Collection classes

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

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

Övningsuppgifter. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Dugga Datastrukturer (DAT036)

Algoritmer. Två gränssnitt

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

Objektorienterad programmering med Java, Generics

Tentamen Datastrukturer (DAT037)

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Tentamen i Algoritmer & Datastrukturer i Java

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Grundläggande datalogi - Övning 4

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

Objektsamlingar i Java

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

Abstrakta datastrukturer

Föreläsning REPETITION & EXTENTA

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, 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 2 Innehåll

Föreläsning 8. Klassen String Mer om fält Klassen ArrayList

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

Föreläsning Datastrukturer (DAT036)

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Tentamen , Introduktion till Java, dtaa98, dtea53

Transkript:

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

Föreläsning 1 Välkomna! - Presentation av kursen (Kurs-PM) Datastrukturer Abstrakta DataTyper ADT Lista Lista och Java Collections Framework (ArrayList) Lista implementerad med en array Analys av algoritmers effektivitet och Big-O Varför? Vad? - T(n) och O(f(n)) Exempel Formell definition av Ordo (Big-O) Exempel Empirisk analys Vanliga tillväxthastigheter Analys av vår lista implementerad med en array Läsanvisningar Uppgifter

Kurs-PM Gå igenom PM Kursen och föreläsningarna kommer av pedagogiska skäl att följa kursboken (Koffman and Wolfgang, Data Structures: Abstraction and Design Using Java 2Ed) när det är möjligt. För att det ska bli tydligt kommer jag ofta att använda mig av exempel och kod liknande eller samma som i boken. För att slippa att vid varje tillfälle ge referens så hoppas jag att det räcker att jag här ger denna mycket bra boken kredit för detta. Tidigare använde kursen Håkan Strömbergs kompendium som du kan nå från förra kursomgångens sida på kth-social. Från detta lånar jag också idéer och uppgifter.

Algoritmer och datastrukturer En algoritm är ett begränsat antal instruktioner/steg för att lösa en uppgift, som från givna indata med säkerhet leder till korrekta utdata. En datastruktur är en struktur som organiserar data Ett elementärt exempel är en array Val av datastruktur ska göras så att vi effektivt kan lagra, organisera och processa data För vissa problem är val av rätt datastruktur mer än halva lösningen!

Abstrakta datatyper ADT En abstrakt datatyp definierar operationerna vi kan utföra på de data den skall lagra. Den definierar inte implementationen. I ett objektorienterat språk implementerar man gärna en ADT som en klass men det går också att implementera en ADT i exempelvis C. Ex på ADT: lista, stack, kö Kan implementeras med en array eller en länkad lista som intern datastruktur.

ADT Lista Grundprinciper: I en lista har varje element en position eller ett index Vi kan nå elementen i godtycklig ordning och sätta in eller ta bort element på godtycklig plats Precis som för alla ADT varierar det exakt vilka operationer man har med i definitionen. Nedan är ett minimum av operationer: create() size() get(index) add(index, element) remove(index)

JCF Java samlar avancerade datastrukturer i Java Collection Framework (alla inteface + klasser finns i java.util) Här finns flera implementationer av ADT Lista: Klassen ArrayList implementerar en lista mha en array Klassen LinkedList implementerar en lista mha en länkad lista För att det ska gå att byta dessa enkelt implementerar de båda interface:t List och kan därmed båda behandlas såsom ett objekt av typen List.

ArrayList Använder en array för att lagra elementen i listan: + enkelt och effektivt att nå godtyckligt element via index - tar upp onödigt minne då arrayen inte är full - kostsamt när en ny array måste allokeras och alla element flyttas över då den gamla arrayen blivit full - kostsamt då många element måste flyttas när man sätter in eller tar bort ett element mitt i listan

ArrayList JCF java.lang.object java.util.abstractcollection<e> java.util.abstractlist<e> java.util.arraylist<e> All Implemented Interfaces: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

Class Arraylist<E> Arraylist finns som generic vilket betyder att vi kan välja när vi skapar en arraylist vad det ska gå att lagra i denna: List<String> mylist = new ArrayList<String>(); mylist.add("hej"); mylist.add("på"); mylist.add("dig"); Vill vi lagra en primitiv datatyp måste vi använda motsvarande wrapper klass: List<Integer> mylist = new ArrayList<Integer>(); mylist.add(3); Vi kan också använda en non-generic variant som då lagrar element av typen Object vilket är alla klasser i Java. Detta är mycket sämre då vi inte får någon typchecking utan vi måste veta vilken typ av objekt vi tar ut och casta om det : List mylist = new ArrayList(); mylist.add("hej"); String s = (String)myList.get(0);

ArrayList några metoder boolean add(e e) Appends the specified element to the end of this list. void add(int index, E element) Inserts the specified element at the specified position in this list. E get(int index) Returns the element at the specified position in this list. int indexof(object o) Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element. E remove(int index) Removes the element at the specified position in this list. E set(int index, E element) Replaces the element at the specified position in this list with the specified element. int size() Returns the number of elements in this list.

Uppgift Skriv en static-metod som returnerar hur många gånger en viss sträng förekommer i en ArrayList<String>: public static int count(list<string> list, String s)

Lösningsförslag public static int count(list<string> list, String s) { int number=0; for(int i=0;i<list.size();i++){ if(list.get(i).equals(s)) { number++; return number;

Implementera en lista med en array package imparraylist; import java.util.arrays; public class NArrayList<E> { private E[] data; private int nrelements; private int maxsize; public NArrayList(){ nrelements = 0; maxsize = 10; data = (E[]) new Object[maxSize];

public boolean add(e element){ if(nrelements==maxsize) reallocate(); data[nrelements++]=element; return true; public E get(int index){ if(0<=index && index < nrelements) return data[index]; throw new ArrayIndexOutOfBoundsException(index); private void reallocate(){ maxsize*=2; data=arrays.copyof(data,maxsize);

add(int index, E entry) public void add(int index, E element){ if(0<=index && index <= nrelements) { if(nrelements==maxsize) reallocate(); for(int i=nrelements;i>index;i--) data[i]=data[i-1]; data[index]=element; nrelements++;

Analys av algoritmers effektivitet Varför? Vad? - T(n) och O(f(n)) Exempel Formell definition av Ordo (Big-O) Exempel Empirisk analys Vanliga tillväxthastigheter Analys av vår lista implementerad med en array

Varför? Behöver vi verkligen analysera algoritmer med dagens och morgondagens snabba datorer? Om tiden för en algoritm växer som n 2 kommer en 100 gånger så snabb dator bara att hinna med 10 gånger så stort problem. Om ett problem växer som 2 n är n = 100 olösligt (2 100 10 30 ). En 100 gånger så snabb dator gör att problemet bara tar lika lång tid som 10 28 skulle gjort på den gamla datorn. Kan man inte bara testa algoritmerna? Förvisso en mycket bra ide som man inte bör glömma bort. Den har några problem (och en del fördelar): Man måste koda algoritmen (och göra det bra/rättvist) Vilka indata ska vi använda? typiska/slumpmässiga/extrema Med fel algoritm tar problemet för lång tid att testa Det gäller att tänka på overhead om vi använder små dataset.

Vad? - T(n) och O(f(n)) När vi ska analysera en algoritm är vi intresserade av hur problemet som algoritmen ska lösa växer när problemets storlek växer Problemets storlek kan vara mängden data i ett dataset eller antalet input eller antalet värden vi vill räkna ut eller Storheten som växer betecknar vi med bokstaven n (om problemet kan växa i två oberoende dimensioner betecknar vi dessa n och m) Oftast är vi intresserade av hur tiden det tar att lösa problemet växer med n men det kan också vara hur minneskraven växer vi intresserar oss av. Den faktiska tiden det tar är svårmätt (overhead), hårdvaruberoende och även operativsystemberoende och därför inte så intressant. Istället är det intressanta hur många gånger enkla satser (ej beroende av n) exekveras som funktion av n. Denna funktion benämns komplexitetsfunktionen och betecknas T(n). Det händer att T(n) används för att beteckna tiden men det gör inte så stor skillnad då vi oftast inte är intresserade av den exakta funktionen utan bara hur den växer för mycket stora n. Vi säger att T(n)=4n 2 +2n är O(n 2 ) (ordostorleksordning).

Linjär tillväxt O(n) public static int search(int[] x, int target) { for(int i=0; i < x.length; i++) { if (x[i]==target) return i; return -1; // target not found //Exempel 2.4

O(n m) public static boolean aredifferent(int[] x, int[] y) { for(int i=0; i < x.length; i++) { if (search(y, x[i])!= -1) return false; return true; //Exempel 2.5

Kvadratisk tillväxt O(n 2 ) public static boolean areunique(int[] x) { for(int i=0; i < x.length; i++) { for(int j=0; j < x.length; j++) { if (i!= j && x[i] == x[j]) return false; return true; //Exempel 2.6

O(log n) for(i=1; i < x.length; i *= 2) { // Do something with x[i] i = 1, 2, 4,, 2 k-1 < x.length 2 k, där k är antal gånger loopen exekverar log 2 k-1 < log(x.length) log 2 k (log betyder log 2 ) k-1 < log(x.length) k Alltså får vi O(log n)

Formell definition av Ordo (Big-O) T(n) = O(f(n)) omm det existerar en positiv konstant c och ett heltal n 0 sådant att för alla n > n 0 gäller att cf(n) T(n) cf(n) är alltså en övre gräns för T(n) för stora n Vi vill då hitta en funktion f(n) som växer så långsamt som möjligt men ändå uppfyller definitionen av ordo

Exempel - Ordo enligt definition for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { Simple Statement 1 Simple Statement 2 for (int i = 0; i < n; i++) { Simple Statement 3 Simple Statement 4 Simple Statement 5 Simple Statement 6 Simple Statement 7 Simple Statement 8 Simple Statement 9... Simple Statement 32 T(n) = 2n 2 + 5n + 25

T(n) = 2n 2 + 5n + 25 Vi väljer f(n) = n 2, och vill då hitta c och n 0 så att 2n 2 + 5n + 25 c n 2 för alla n > n 0. Låt oss välja n = 5 och lösa ut c I motsvarande likhet: 50 + 25 + 25 = 25c ger c = 4 Alltså: T(n) = O(n 2 ) vilket kan visas med n 0 = 5 och c = 4.

Exempel 2 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { 3 simple statements T(n) = 3(n 1) + 3 (n 2) + + 3 = = 3(n 1 + n 2 + n 3 + + 1) = = 3(1 + 2 + 3 + + n-1) = = 3(n-1)(1+n-1)/2 = = 1.5n(n-1) = =1.5n 2-1.5n = O(n 2 ) (kan visas med n 0 = 1, c = 1.5)

Exempel 3 - empirisk analys int r=0,n=10; for(int i=1;i<n-1;i++) for(int j=i+1;j<=n;j++) for(int k=1;k<=j;k++) r++;//enkel sats n 0 1 2 3 4 5 6 7 8 9 10 T(n) 0 0 2 8 20 40 70 112 168 240 330 Låt ett matematikprogram anpassa en tredjegradare: T(n) = 0,3333n 3-0,3333n = O(n 3 )

Vanliga tillväxthastigheter i ökande ordning

Låt oss anta att den enkla satsen tar 10-9 s

Analys av vår lista implementerad med en array n antal element i listan, T antal enkla satser set(index), get(index) O(1) add(e) O(1) utan anrop till reallocate(); O(n) med anrop då vi måste flytta n element O(1) i genomsnitt eftersom vi dubblar storleken! Antag att vi fyller en tom lista som startar med storleken m add(index, E), remove(index) O(n) Antal add Antal kopieringar <m 0 <2m m <4m 3m <8m 7m <16m 15m

Läsanvisning och uppgifter Läs: KW 1.1 (1.2-1.8 vid behov), 2.1-2.4 När du läser boken bör du programmera och testa exempel och det du läser om för att se att du förstått. Då och då stöter du på uppgifter. Du bör då själv fundera på vilka du behöver göra och vilka du kan hoppa över. I början av kursen kommer jag föreslå en del uppgifter som är ett minimum men senare måste du själv helt ta ansvar för detta. Till varje föreläsningar finns också uppgifter till momentet LAB1 (dessa följs av antal poäng de ger). Dessa har deadline på sista övningen inom 10 dagar efter föreläsningen. Försök att göra dessa kontinuerligt och helst redan till nästa övningstillfälle. Uppgifter: (SC Self Check, P Programing, PP Programing Projects, NB se sist i föreläsningen) Avsnitt 2.1: SC 1, P 2.1, 2.2 Avsnitt 2.2: NB 1(1p) Avsnitt 2.3: SC 1, NB 2(2p) Avsnitt 2.4: SC 1, 2, 3, NB 3(2p)

Uppgifter NB 1 (1p) På sidan 70 i KW diskuteras en Phone Directory applikation. Där diskuteras hur man kan använda indexof för att hitta telefonnumret till ett visst namn. På KTH-social kan du hitta ett Phone Directory projekt där man först får lägga in namn och telefonnummer och sedan kan söka upp telefonnummer. Det enda som saknas är metoden equals i DirectoryEntryklassen. Lägg till denna så att applikationen fungerar. Det räcker att skriva ut denna metod till redovisningen.

NB 2 (2p) När vi använder de färdiga klasserna för lista för att lagra t.ex. heltal tappar vi lite i effektivitet. Om detta är viktigt får man skapa en egen lista specifikt för heltal. Skapa en klass IntList som implementerar en lista som lagrar heltal mha en array. Den skall alltså inte använda någon av klasserna i JCF utan endast en array. Den ska implementera metoderna: IntLIST(int initialcapacity) add(int element) add(int index, int element) get(int index) indexof(int element) remove(int index) set(int index, int element) size() och kommer precis som vår lista behöva en del hjälpmetoder såsom reallocate. Skriv också en kort main-klass som testar alla metoder.

NB 3 (2p) Använd ett matematikprogram för att göra en empirisk analys och ta reda på T(n) och Ordo för följande kodsnutt: int r=0, n=10; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) for(int k=j;k<=i+j;k++) for(int m=1;m<=i+j-k;m++) r++;//enkel sats Redovisa denna uppgift inte med kod utan en graf över anpassningen och med ditt svar för T(n) och Ordo.