Algoritmer. Två gränssnitt

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

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

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

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

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

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

Sökning och sortering

Tentamen i Algoritmer & Datastrukturer i Java

DAT043 Objektorienterad Programmering

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 11 Innehåll

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

Föreläsning 2 Datastrukturer (DAT037)

Teoretisk del. Facit Tentamen TDDC (6)

Föreläsning 14. Filhantering

Föreläsning 12 Innehåll

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

Föreläsning 12 Innehåll

Föreläsning REPETITION & EXTENTA

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

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.

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 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

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

Tentamen i Objektorienterad programmering

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 9. Sortering

Länkade strukturer, parametriserade typer och undantag

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

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

SORTERING OCH SÖKNING

Föreläsning 1 Datastrukturer (DAT037)

Föreläsning 3. Stack

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

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

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Föreläsning 3-4 Innehåll

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

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

Tentamen, EDAA20/EDA501 Programmering

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

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

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

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Föreläsning 5 Innehåll

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

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

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

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

Datastrukturer D. Föreläsning 2

Laboration 13, Arrayer och objekt

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

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

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

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 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

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

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

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

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

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

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

Lösningar för tenta 3 DAT043,

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

Tentamen i Algoritmer & Datastrukturer i Java

Lösningar för tenta 2 DAT043,

Instuderingsfrågor, del D

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

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

Typkonvertering. Java versus C

Föreläsning Datastrukturer (DAT037)

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

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Tentamen i Algoritmer & Datastrukturer i Java

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

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Föreläsning 3. Stack

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

Seminarium 13 Innehåll

Dugga i Grundläggande programmering STS, åk

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Föreläsnings 9 - Exceptions, I/O

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

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

OOP Objekt-orienterad programmering

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

Föreläsning 14 Innehåll

Objektorienterad Programmering (TDDC77)

Transkript:

Objektorienterad programmering E Algoritmer Sökning Linjär sökning Binär sökning Tidsuppskattningar Sortering Insättningssortering 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,... ). Ett exempel Två gränssnitt Telefonboken Vi vill skriva ett program för att lagra och slå telefonnummer för våra kontakter. Programmet ska ha ett textbaserat gränssnitt. Telefonbokens innehåll läses från fil, varefter man med enkla kommandon kan ge ett namn och begära telefonnummer. lägga till ett nytt par namn/telefonnummer. lista hela telefonbokens innehåll. avsluta programmet. Programmet demokörs på föreläsningen. Programmets design Programmet består av ett objekt book som lagrar data (par namn/telefonnummer) samt en main-rutin, som läser och analyserar användarens kommandon, anropar metoder i book samt skriver ut resultat. Vilka metoder behöver book tillhandahålla? Interfacet PhoneBook public interface PhoneBook extends Iterable<Entry> { public void put(string name, String number); public String get(string name); Interfacet Entry public interface Entry { public String getname(); public String getnumber();

main-rutinen prompt och readfile public static void main(string [] args) { PhoneBook book = new???; readfile(args[0], book); Scanner in = new Scanner(System.in); prompt(); while (in.hasnext()) { docommand(in, book); in.nextline(); prompt(); public static void prompt() { System.out.print("> "); public static void readfile(string file, PhoneBook book) { try { Scanner in = new Scanner(new File(file)); while (in.hasnext()) book.put(in.next(),in.next()); catch (IOException e) { System.out.println("Couldn t open file; book empty"); prompt och readfile public static void docommand(scanner in, PhoneBook book) { String cmd = in.next(); if ("put".equals(cmd)) { else if ("get".equals(cmd)) { else if ("list".equals(cmd)) { else if ("quit".equals(cmd)) { else { System.out.println("Command " + cmd + " unknown"); Att implementera Entry public class MyEntry implements Entry { String name; String phonenr; MyEntry(String name, String phonenr) { this.name = name; this.phonenr = phonenr; public String getname() {return name; public String getnumber() {return phonenr; Kommentar Klassen MyEntry kan med fördel i stället definieras som private static i den klass som implementerar PhoneBook.

Att implementera PhoneBook Tidskomplexitet En enkel implementation Vi börjar med en enkel implementation där Entry-objekten lagras i ett fält. För att definiera en iterator kommer vi att använda en biblioteksmetod som vi inte talat om och som ni inte förväntas känna till. 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? Nyckeln: håll telefonboken sorterad! Sökning 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 -1. 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-1; while (minindex <= maxindex) { int midindex = (minindex + maxindex)/2; if (a[midindex]==key) return midindex; else if (a[midindex] < key) minindex = midindex + 1; else maxindex = midindex - 1; return -1; 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. aslist, som skapar en listvy av ett fält. Lexikografisk jämförelse public class Comparable<T> { int compareto(t o); Klassen String implementerar Comparable<String>. s1.compareto(s2) är <0 om s1 kommer före s2, =0 om strängarna är lika och >0 om s2 kommer före. Hur snabb är binär sökning? Hur sorterar man ett fält? 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 ett söka i. Antalet jämförelser blir därför log 2 n. Exempel För 1 miljon element behövs högst 20 jämförelser. Binär sökning är 50000 gånger snabbare än linjär sökning. Idén med binär sökning är värd att känna till. Ett viktigt problem Sortering 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... ) Insättningssortering I dag betraktar vi en enkel (och i allmänhet inte så bra) metod: insättningssortering. Denna algoritm kan konkurrera om fältet är kort (upp till 10 element). fältet är nästan sorterat (inget element är långt från sin rätta plats).

Insättningssortering Insättningssortering, kod 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-1] redan är sorterat och sorterar in a[i] på rätt plats: sätt in tmp i=4; a[0].. a[3] sorterad 1 2 3 6 8 4 9 4 5 6 5 1 flytta upp stora element tmp=2 (flytta undan a[i]) public static void sort(int[] a) { for (int i=1; i < a.length; i++) { // Assume a[0]..a[i-1] is sorted int tmp = a[i]; int j = i-1; while (j >=0 && tmp < a[j]) { a[j+1] = a[j]; j ; a[j+1] = 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 1) 1 + 2 + 3 +... + (n 1) = 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.