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

Relevanta dokument
Algoritmer. Två gränssnitt

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

Föreläsning 2 Datastrukturer (DAT037)

Sökning och sortering

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 11 Datastrukturer (DAT037)

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

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

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

Föreläsning 11 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Föreläsning 12 Innehåll

Teoretisk del. Facit Tentamen TDDC (6)

Föreläsning 12 Innehåll

SORTERING OCH SÖKNING

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

Föreläsning 9. Sortering

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Tentamen i Algoritmer & Datastrukturer i Java

Programmering för språkteknologer II. OH-serie: Sökning och sortering. Algoritm

Föreläsning REPETITION & EXTENTA

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

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

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

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

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 5 Innehåll

DAT043 Objektorienterad Programmering

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

OOP Objekt-orienterad programmering

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

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

Länkade strukturer, parametriserade typer och undantag

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

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

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

Lösningar Datastrukturer TDA

Föreläsning 1 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Datastrukturer D. Föreläsning 2

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

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

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Typkonvertering. Java versus C

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

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

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

Tentamen Datastrukturer (DAT037)

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

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

Dugga Datastrukturer (DAT036)

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

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

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

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

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

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

Föreläsning 9 Innehåll

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

Tentamen Datastrukturer D DAT 036/DIT960

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

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

Laboration A Objektsamlingar

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

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

Tentamen, EDAA20/EDA501 Programmering

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

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

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

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

I ett program hantera man ofta samlingar av objekt av samma typ.

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

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

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Seminarium 13 Innehåll

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

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

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

DEL 1 För att få godkänt på tentan (betyg 3) måste du lösa minst fem av sju uppgifter i denna del.

Tentamen, EDA501 Programmering M L TM W K V

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Föreläsning Datastrukturer (DAT037)

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

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningsförslag till exempeltenta 1

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

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Instuderingsfrågor, del D

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Föreläsning Datastrukturer (DAT037)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Transkript:

Objektorienterad programmering E Algoritmer Linjär sökning Binär sökning Tidsuppskattningar Föreläsning 9 Vad behöver en programmerare kunna? (Minst) ett programspråk; dess syntax och semantik, bibliotek och programmeringsstil. Standardlösningar till standardproblem; hur tidskrävande är vanliga problem (för datorn)? Hittills har vi fokuserat på den första punkten; vi ska nu börja titta litet på den andra. Vi kan bara skumma på ytan; här finns material till flera kurser (Datastrukturer, Algoritmer, Avancerade algoritmer,... ). Telefonboken, påminnelse (och litet tillägg), Entry.java public class Entry { private String name; private String number; public Entry(String name, String number) { this.name = name; this.number = number; public String getname() {return name; public String getnumber() {return number; public String tostring() { return name + "_" + number; Telefonboken, påminnelse (och litet tillägg), 2 Phonebook.java public interface PhoneBook extends Iterable<Entry> { public void put(string name, String phonenr); public String get(string name); SimplePhoneBook.java, början public class SimplePhoneBook implements PhoneBook { private Entry[] entries; private int count; public SimplePhoneBook(int size) { entries = new Entry[size]; count = 0; private String get(string name) { for (int i=0; i < count; i++) if (entries[i].getname().equals(name)) return entries[i].getnumber(); return null;

Resten av programmet Tidskomplexitet main-rutinen Här läses kommandon från användaren och anropas get och put i telefonboken för att söka och lägga till telefonnummer. Hur bra eller dåligt är detta? Hur stora telefonböcker kan programmet hantera? En persons privata vänner? Ett företags anställda och kontakter? Sveriges befolkning? För att bedöma tidsåtgång för att köra programmet kan vi tänka så här: Antag att telefonboken innehåller n par. Hur många jämförelser (med equals) mellan strängar kan behövas för att sätta in ett nytt par? för att hitta ett nummer för ett givet namn? I bägge fallen kan vi behöva titta på alla par, dvs n jämförelser behövs. Kan vi göra något bättre? Lösningen: håll telefonboken sorterad! i heltalsfält Precis som i telefonkatalogen bör vi lagra paren sorterade efter namn. Vi måste implementera om klassen. Problem att lösa: Hur gör man insättning för att hålla boken sorterad? Hur söker man i en sorterad bok? Hur jämför man strängar för att avgöra vilken som ska komma först i boken (i lexikografisk ordning)? Ett enklare problem Vi börjar med sökning och med ett förenklat problem: Givet ett sorterat fält a av heltal och ett heltal key, finn den position i a som innehåller key. Vi definierar public static int search(int[] a, int key); Resultatet ska vara positionen, dvs index i fältet a. Om key inte alls finns, ska resultatet bli -. Förvillkor När vi skriver search, antar vi att fältets element är sorterade i växande ordning. Om fältet inte är sorterat är funtionens resultat ospecificerat; det är ett fel av användaren av search att anropa funktionen i sådana fall.

Binär sökning public static int binarysearch(int[] a, int key) { int minindex = 0; int maxindex = a.length-; while (minindex <= maxindex) { int midindex = (minindex + maxindex)/2; if (a[midindex]==key) return midindex; else if (a[midindex] < key) minindex = midindex + ; else maxindex = midindex - ; return -; Mer ur Java API Klassen Arrays Klassen Arrays är ett funktionsbibliotek. Det innehåller ett antal användbara (statiska) funktioner som arbetar på fält, däribland binarysearch för många olika typer av fält. sort, som sorterar ett fält, också för många olika typer. Lexikografisk jämförelse: java.lang.comparable public int Comparable<T> { int compareto(t o); Klassen String implementerar Comparable<String>. s.compareto(s2) är <0 om s kommer före s2, =0 om strängarna är lika och >0 om s2 kommer före. Binär sökning i telefonboken? Vad behövs? Vi har ett fält vars element har typ Entry. Vad menas med att ett sådant fält sorterat? Hur jämför man två objekt av typen Entry? Entry, förbättring public class Entry implements Comparable<Entry> { public int compareto(entry o) { return name.compareto(o.getname()); Hur definierar man put så att fältet fortsätter att vara sorterat? Hur snabb är binär sökning? Om ett sorterat fält innehåller n element, hur många jämförelser mellan element (med compareto) kan behövas för att hitta ett givet element? Varje jämförelse halverar det intervall man har att söka i. Antalet jämförelser blir därför log 2 n. Exempel För miljon element behövs högst 20 jämförelser. Binär sökning är då 0000 gånger snabbare än linjär sökning. Idén med binär sökning är värd att känna till!

Mer ur Arrays Avslutande kommentarer om telefonboken aslist, som skapar en lista av ett fält. copyof, som gör en kopia av en del av ett fält. Exempel (som ni inte behöver kunna) I telefonboken kan vi därför definiera public Iterator<Entry> iterator() { List list = Arrays.asList(Arrays.copyOf(entries,count)); return list.iterator(); Titta i lect9code.zip Här finns en variant av telefonboksprogrammet, med följande förbättringar: Två implementationer av PhoneBook: SimplePhoneBook, som använder linjär sökning. BetterPhoneBook, som använder binär sökning. En förbättrad Main: Ett filnamn tas som kommandoradsargument. Telefonboken läses från och skrivs till filen i början resp slutet av programmet. Nytt kommando: lista alla par. Ny datafil: engelsk-svenskt lexikon (2000 ord). Hur sorterar man ett fält? Ett viktigt problem behövs i otaliga sammanhang. Det är viktigt att kunna sortera effektivt. Det finns många kända algoritmer för sortering (quicksort, mergesort, heapsort... ) Arrays.sort använder sig av quicksort eller mergesort beroende på elementens typ. Idé Vi vill sortera fältet a. Vi gör detta genom att sortera längre och längre initialdelar av a. I steg i antar vi att delfältet a[0].. a[i-] redan är sorterat och sorterar in a[i] på rätt plats: i=; a[0].. a[3] sorterad I dag betraktar vi en enkel (och i allmänhet inte så bra) metod: insättningssortering. Denna algoritm kan konkurrera om 3 8 2 9 fältet är kort (upp till 0 element). fältet är nästan sorterat (inget element är långt från sin rätta plats). i=; a[0].. a[3] sorterad 3 8 9

, kod public static void sort(int[] a) { for (int i=; i < a.length; i++) { // Assume a[0]..a[i-] is sorted int tmp = a[i]; int j = i-; while (j >=0 && tmp < a[j]) { a[j+] = a[j]; j--; a[j+] = tmp; // Now a[0]..a[i] is sorted Tidskomplexitet för insättningssortering Om fältet har n element, hur många jämförelser mellan tal kan behövas för att sortera det? Värsta fallet är när fältet är sorterat i fel ordning. Antalet jämförelser blir då jämförelser. Standardbeteckning n(n ) + 2 + 3 +... + (n ) = 2 Vi säger att insättningssortering har komplexitet O(n 2 ). När fältet blir dubbelt så långt tar det fyra gånger så lång tid att sortera.