Övningar, Algoritmer och datastrukturer (EDA690)

Storlek: px
Starta visningen från sidan:

Download "Övningar, Algoritmer och datastrukturer (EDA690)"

Transkript

1 LUNDS TEKNISKA HÖGSKOLA Algoritmer och datastrukturer Institutionen för datavetenskap HT 2013 Övningar, Algoritmer och datastrukturer (EDA690) I kursen ingår sex frivilliga övningar. Övningarnas syfte är att ge en fördjupad förståelse för de begrepp som tas upp under kursen samt att ge träning i problemlösning med hjälp av olika algoritmer och datastrukturer. Uppgifterna är av tre olika slag: Hemuppgifter (H) - korta instuderingsuppgifter som lämpligen löses före övningen. Lösningsförslag finns på kursens hemsida. Diskussionsuppgifter (D) - att lösa på övningen. Dessa uppgifter ska ge tillfälle till repetition av viktiga begrepp. De ger bäst utbyte om du löser dem tillsammans med en eller flera kamrater. Övningsuppgifter (U) - att lösa på övningen. Lösningsförslag delas ut i slutet av varje övning. Om du inte hinner lösa alla uppgifter på övningen så fortsätt med dem hemma. Läs (repetera) de avsnitt i läroboken som anges under Litteratur inför varje övning. Lös också H- uppgifterna. Om du fastnar på någon uppgift eller har frågor så får du gärna kontakta kursens lärare. Uppgifterna består av en blandning av teorifrågor och av uppgifter där du ska skriva programkod. Vill du hellre lösa några av uppgifterna på dator istället för på papper går det naturligtvis bra. Det finns också övningar i kursens lärobok, dels kortare uppgifter ( Self check ) och dels längre uppgifter ( Programming ) som med fördel kan lösas på dator. Innehåll 1 Övning 1 viktiga begrepp inom objektorienterad programmering Övning 2 listor, köer och stackar Övning 3 algoritmers effektivitet, rekursion Övning 4 mer om rekursion, binära träd Övning 5 hashtabeller, heapar, prioritetsköer Övning 6 grafer, grafalgoritmer och sortering

2

3 Övning 1 viktiga begrepp inom objektorienterad programmering 3 Övning 1 viktiga begrepp inom objektorienterad programmering Tema: Viktiga grundläggande begrepp inom objektorienterad programmering. Du ska repetera och befästa dina kunskaper om viktiga begrepp såsom arv, parameteröverföring, statiska attribut och metoder i Java. Dessa begrepp har behandlats i grundkursen. Du ska också fördjupa dina kunskaper om polymorfism, skuggning och överlagring av metoder. Därför ingår det en hel del text att läsa i just den här övningen. Dessutom behandlas interface och iteratorer. Litteratur: I uppgifterna H1 till H8 behandlas begrepp som ingått i grundkursen. Om du stöter på svårigheter får du repetera relevanta delar i läroboken från grundkursen. Alternativt kan du läsa relevanta delar av kapitel 1 i läroboken. Uppgifterna H9 till H11 går lite djupare in på begreppen polymorfism, överlagring och skuggning. För att lösa dessa bör du först läsa den text som finns senare i denna övning. Avsnitten i vår lärobok är också relevanta för dessa uppgifter. Läs också OH-bilderna från föreläsning 1 och 2. Hemarbete I några av uppgifterna nedan används klasserna Person, Student och FacultyMember. Klasserna har följande utformning: public class Person { protected String name; public Person(String name) { this.name = name; public void setname(string name) { this.name = name; public String tostring() { return name; public class Student extends Person { protected String program; protected int credits; public Student(String name, String program) { super(name); this.program = program; credits = 0; public String tostring() { return name + ", " + program;... public class FacultyMember extends Person { protected String department;

4 4 Övning 1 viktiga begrepp inom objektorienterad programmering public FacultyMember(String name, String department) { super(name); this.department = department; public String tostring() { return name + ", " + department; Arv H1. Antag att vi har gjort följande deklarationer: Person p; Student s; FacultyMember f; Avgör för var och en av följande satser om de är korrekta eller ej: p = new Person("Lisa Svensson"); p = new Student("Lisa Svensson", "D"); s = new Person("Kalle Karlsson"); s = new Student("Kalle Karlsson","C"); s = new FacultyMember("Per Holm", "Computer Science"); p = s; s = p; f = s; H2. Antag att vi deklarerat en variabel String info. Ange vilket värde info får i var och en av de satser där den förekommer i en tilldelning i följande programrader: Person p = new Person("Lisa Svensson"); info = p.tostring(); p = new Student("Lisa Svensson","D"); info = p.tostring(); Student s = new Student("Kalle Karlsson","C"); info = s.tostring(); FacultyMember f = new FacultyMember("Per Holm", "Computer Science"); p = f; info = p.tostring(); H3. Föregående uppgift handlade om polymorfism och metodanrop. Om vi deklarerar att en referensvariabel ref har en viss typ C enligt C ref; så får ref referera till objekt av klassen C eller till objekt av eventuella subklasser till C. Antag att det i både denna subklass och i klassen C finns en metod p(). Problemet som behandlades i föregående uppgift var att avgöra vilken av metoderna p() som exekveras vid ett anrop: ref.p(); Formulera i egna ord hur detta avgörs.

5 Övning 1 viktiga begrepp inom objektorienterad programmering 5 Parameteröverföring H4. Givet en klass C med en metod incr enligt följande: public class C { public void incr(int i) { i++;... Vad skrivs ut när följande programrader exekveras? int j = 2; C c = new C(); c.incr(j); System.out.println(j); H5. Antag att vi har en klass C med en metod m enligt följande: public class C { public void m(person p) { p = new Person("Kalle"); Vad skrivs ut när följande programrader exekveras: Person p = new Person("Lisa"); C c = new C(); c.m(p); System.out.println(p); H6. Antag att metoden m i klassen C i stället har följande utformning: public void m(person p) { p.setname("kalle"); Vad skrivs då ut om samma rader som i föregående uppgift exekveras? H7. Givet följande metod i någon klass C: public static void changeelement(int[] a, int index, int newvalue) { a[index] = newvalue; Vad skrivs ut när följande rader exekveras? int[] a = {1, 2, 3, 4, 5; C.changeElement(a, 3, 10); System.out.println(a[3]);

6 6 Övning 1 viktiga begrepp inom objektorienterad programmering Statiska attribut och metoder H8. Antag att vi i klassen Person lägger till ett attribut och två metoder enligt följande: protected static int seniorcitizenage = 67; public static void setseniorage(int i) { seniorcitizenage = i; public static int getseniorage() { return seniorcitizenage; Attributet representerar lagstadgad pensionsålder. a) Motivera vad det innebär att attributet och metoderna deklarerats som static. Förklara också varför man valt att deklarera attributet seniorcitizenage och de båda nya metoderna som static. b) Vilka av metodanropen nedan är korrekta? Person.setSeniorAge(65); Person p = new Person(...); p.setseniorage(65); c) Vad skrivs ut när följande rader exekveras? Person p = new Person(...); Person q = new Person(...); p.setseniorage(65); System.out.println(q.getSeniorAge()); Fördjupning om polymorfism och överlagring Uppgifterna i resten av denna övning går djupare in på polymorfism i samband med överlagring av metoder. Läs avsnitt 1.3 i läroboken och den text som finns i resten av detta dokument som en förberedelse. Begreppen typ, subtyp och supertyp När vi deklarerar variabler anger vi vilken typ de har. Typen anger vilka värden som kan tilldelas variabeln. För referensvariabler används klassnamn (eller interfacenamn) för att ange typen: Person p; Set set; // Person är en klass // Set är ett interface Begreppen supertyp och subtyp är viktiga att känna till. Supertyper till en viss klass C är alla de klasser från vilka C ärver och alla de interface klassen implementerar. Supertyper till ett interface I är alla de interface från vilka I ärver. En klass C eller ett interface I är subtyp till alla sina supertyper. Varje objekt tillhör någon klass, den klass som används när objektet skapades. Om en referensvariabel deklareras ha en viss typ (klass eller interface) så får den referera till objekt av denna typ eller dess subtyper. Om ett interfacenamn har använts i deklarationen innebär detta speciellt att referensvariablen får referera till objekt av någon klass som implementerar detta interface. För variablerna p och s, deklarerade ovan, gäller därför att p kan referera till objekt

7 Övning 1 viktiga begrepp inom objektorienterad programmering 7 av klasserna Person, Student och FacultyMember. Referensvariablen set kan referera till objekt av t ex klasserna TreeSet och HashSet som finns i java.util och som båda implementerar interfacet Set. Det är alltså tillåtet att skriva: set = new TreeSet(); set = new HashSet(); H9. Ange alla subtyp supertyp-relationer som gäller när följande deklarationer gjorts: class A {.. interface I {.. class B extends A implements I {.. interface J extends I {.. class C extends B implements J {.. H10. Antag att följande deklarationer gjorts: interface IA {..; interface IB extends IA {.. class C implements IA {.. Vilka av tilldelningssatserna i följande kod är då korrekta? IA a = new C(); IB b = new C(); a = b; b = a; C c = new C(); c = a; c = b; Metodsignaturer och metodanrop Antag att vi har en metod, deklarerad enligt följande mönster: public void m(type 1 param 1, Type 2 param 2,...); där Type i anger en klass eller ett interface. Metodens signatur är dess namn tillsammans med antalet parametrar och deras typer. Två metoder m1 och m2 har samma signatur om de har samma namn, samma antal parametrar och om den i:e parametern för m1 har samma typ som den i:e parametern för metoden m2 för alla i. För att ett anrop, m(act 1, act 2,..);, ska vara korrekt krävs att varje aktuell parameter act i har en sådan deklarerad typ att tilldelningssatsen param i = act i är korrekt. Detta innebär att den deklarerade typen för act i måste vara Type i eller en subtyp till denna typ. H11. Ange, för var och en av metodanropen i det följande om de är korrekta eller felaktiga: public class C { public void m(person p, Student s) {..... Person p1 = new Person(...); Student s1 = new Student(...); C c = new C();

8 8 Övning 1 viktiga begrepp inom objektorienterad programmering c.m(p1, s1); c.m(p1, p1); c.m(s1, p1); c.m(s1, s1); p1 = new Student(...); c.m(p1, p1); Metodanrop, skuggning och överlagring Vi kan inte deklarera två metoder med samma signatur i en klass. Däremot kan det finnas metoder med samma signatur i en klass och i någon av dess superklasser eller subklasser. Det är detta som kallas att skugga metoder (eng: override). Om det i en klass C och i en subklass D till C finns metoder med samma signatur så säger vi att metoden i D skuggar (eng:overrides) metoden i klassen C. Metoder som har samma namn men olika signatur (t. ex olika antal parametrar eller olika typer på sina parametrar) sägs överlagra (eng: overload) varandra. Det är tillåtet att ha flera överlagrade metoder i samma klass. Överlagring inträffar också om en klass har en metod med samma namn men olika signatur som någon metod i en super- eller subklass. Då man gör ett metodanrop x.m(a,b) kommer någon metod med namnet m och med formella parametrar av en sådan typ att anropet är korrekt med hänsyn till typerna hos de aktuella parametrarna a och b att exekveras. I allmänhet är det inte svårt att avgöra vilken metod det blir. Ofta har vi bara en metod med rätt namn och rätt antal parametrar. Vid vissa typer av överlagring kan dock tveksamhet uppstå. Betrakta följande exempel: class BaseClass { public void foo(person p) {... public void foo(student s) { BaseClass bc = new BaseClass(); Person p = new Student(...); bc.foo(p); Vilken av foo-metoderna kommer att exekveras? De deklarerade typerna för bc respektive p används av kompilatorn för att avgöra detta. bc är av typen BaseClass och p är av typen Person. Kompilatorn undersöker därför om klassen BaseClass har en metod som heter foo och som har en formell parameter av en sådan typ att den kan anropas med en aktuell parameter av typen Person. Det finns bara en sådan, nämligen den första foo-metoden. bc skulle under exekvering kunna referera till ett objekt av en subklass till BaseClass om sådan finns. Exempel: class DerivedClass extends BaseClass { public void foo(person p) { BaseClass bc = new DerivedClass(); Person p = new Student(...); bc.foo(p); Nu blir det metoden foo i klassen DerivedClass som exekveras. Kompilatorn gör samma beslut som i föregående exempel och fastlägger signaturen på metoden till att vara namnet foo och en parameter av typen Person. Under exekvering kommer klassen för det objekt till vilket bc då refererar att utgöra den virtuella maskinens startpunkt för sökandet efter metod med denna

9 Övning 1 viktiga begrepp inom objektorienterad programmering 9 signatur. Finns ingen sådan metod där fortsätter sökandet i superklassen etc. I detta fall startar alltså sökandet i DerivedClass där det finns en metod med rätt signatur. Ett ytterligare exempel där överlagrade metoder är definierade i olika klasser i en klasshierarki: class BaseClass { public void foo(person p) {... class DerivedClass extends BaseClass { public void foo(student s) {..... DerivedClass dc = new DerivedClass(); Person p = new Student(...); dc.foo(p); dc har typen DerivedClass som har två överlagrade metoder med namnet foo. Men bara en av dessa, den som är definierad i superklassen BaseClass passar för anropet eftersom dess parameter är av typen Person. Metoden i DerivedClass har ju formell parameter av typen Student och denna kan inte tilldelas en aktuell parameter av typen Person. Det blir alltså metoden foo i BaseClass som exekveras. Sammanfattning Nedan sammanfattas vad som sker vid kompilering respektive exekvering av ett metodanrop x.m(a,b); 1. Den deklarerade typen för x används av kompilatorn för att bestämma i vilken klass sökandet efter metoder som har rätt signatur för anropet ska starta. Kalla denna klass C1. 2. I C1 och dess eventuella superklasser lokaliseras alla metoder som matchar metodanropet, dvs. har rätt namn och har sådana typer på sina formella parametrar att de kan tilldelas variabler av respektive aktuell parameters deklarerade typ. Om ingen sådan metod finns, genereras ett kompileringsfel. Om det bara finns en sådan metod, fortsätt med steg 3. I komplicerade fall med många överlagrade metoder kan det finnas flera som passar in. I så fall försöker kompilatorn få fram den metod som är "mest specifik" enligt vissa regler, som vi inte går in på här. Slutar denna process med att det finns mer än en möjlig metod får vi ett kompileringsfel (ambiguous method call). 3. En metod är nu utvald och det är en metod av dess exakta signatur som kommer att exekveras. Vilken det blir beror på klassen för det objekt x refererar till under exekvering. Kalla denna klass C2. Den virtuella maskinen startar sökandet efter metod att exekvera i C2 och fortsätter eventuellt i superklasser tills man hittar en med rätt signatur. I normala fall är det säkert att vi har en metod med rätt signatur någonstans i denna kedja, annars hade kompileringsfel genererats i steg 2 ovan. Bara om vi ändrat någonting som har med inblandade metoder att göra och glömt kompilera om vissa klasser kan sökandet misslyckas. I så fall får man ett exekveringsfel. Anmärkning till punkt 1: Metodanropet kan göras inifrån en annan metod och x kan vara en av de formella parametrarna till denna enligt följande: public void p(someclass x) { x.m(a,b);...

10 10 Övning 1 viktiga begrepp inom objektorienterad programmering Den deklarerade typen för x är då SomeClass. Anmärkningar till punkt 2: Det räcker här inte med att en metod har rätt namn och rätt typ på sina parametrar. Den måste också vara möjlig att anropa med hänsyn till sin skyddsnivå (private, public etc.). Den som vill veta mera om hur det går till att bestämma mest specifika metod när man har flera kandidater kan gå till avsnitt i Javas språkdefinition som finns på adressen Anmärkningar till punkt 3: Att man först under exekvering bestämmer exakt vilken metod som exekveras brukar kallas dynamisk bindning (eng: dynamic binding eller late binding). Ibland kan man dock redan under kompileringen bestämma vilken metod som ska exekveras. Metoder som är deklarerade final får inte omdefinieras i subklasser. Om steg 2 slutar med att man hittat en metod och denna är final så vet man alltså att det måste bli denna som ska exekveras. Att lösa på övningen D1. Vad ingår i en metods signatur? D2. Vad menas med överskuggning? Ge exempel. D3. Vad menas med överlagring? Ge exempel. D4. Vad är ett interface och hur ser ett interface ut i stora drag? Vad innebär det att man implementerar ett interface? D5. I kursen arbetar vi bland annat med klasser och interface från Java Collections Framework. Ett exempel på en sådan klass är ArrayList. Där finns bland annat metoder för att hitta ett element i listan. Hur avgörs om två element är lika? Vem bestämmer vad som menas med lika (den som implementerat ArrayList eller den som använder klassen) och hur gör man det? U1. I ett klassbibliotek finns det en generisk klass som representerar en samling element. I implementeringen har man använt en vektor för att representera samlingen enligt följande implementeringsskiss: public class ArrayCollection<E> implements Collection<E> { private E[] thecollection; private int size; /** Constructs an empty list with an initial capacity of ten. */ public ArrayCollection() { thecollection = (E[]) new Object[10]; /** Appends the specified element to the end of this list. Returns true if this collection changed as a result of the call. */ public boolean add(e x) { if (size == thecollection.length) { doublearray(); thecollection[size] = x; size++; return true;

11 Övning 1 viktiga begrepp inom objektorienterad programmering 11 /** Returns true if this collection contains the specified element. */ public boolean contains(object x) {... /* Creates an new array that is twice the size of the current array and copies the content of the current array into the new one. */ private void doublearray() { Implementera metoderna contains och doublearray U2. En användare av klassen har implementerat en klass Person enligt följande: public class Person { private String name;... public boolean equals(person p) { return name.equals(p.name); public String tostring() { return name; Följande kod exekveras: ArrayCollection<Person> coll = new ArrayCollection<Person>(); coll.add(new Person("Lisa Svensson")); if (coll.contains(new Person("Lisa Svensson")) ){ System.out.println("Lisa Svensson found"); else { System.out.println("Lisa Svensson not found"); Utskriften blir Lisa Svensson not found. Förklara varför. Vad ska vi göra för att Lisa ska hittas? U3. Klassen ArrayCollection från uppgift U1 implementerar interfacet Collection<E> som är ett subinterface till interfacet Iterable<E>. Alltså måste klassen ArrayCollection även implementera metoden iterator(). Antag att detta är gjort och att vi har lagt in ett antal personer i samlingen ArrayCollection<Person> coll. a) Skriv programrader som med hjälp av en iterator skriver ut alla personerna i coll. b) Lös samma problem som i deluppgift a men använd en foreach -sats.

12 12 Övning 2 listor, köer och stackar Övning 2 listor, köer och stackar Tema: Listor, listimplementeringar och iteratorer, köer, stackar. Litteratur: Listor behandlas i läroboken avsnitt , , Stackar och köer behandlas i avsnitt respektive Läs också OH-bilderna från relevanta föreläsningar. Hemarbete Enkellänkad lista I några av uppgifterna används klasserna SingleLinkedList och ListNode: public class SingleLinkedList<E> { private ListNode<E> first; /** Creates an empty list. */ public SingleLinkedList() { first = null; /** Inserts the specified element at the beginning of this list. */ public void addfirst(e e) { ListNode<E> n = new ListNode<E>(e); n.next = first; first = n;... /* Nested class. Represents a node which contains an element of type E. */ private static class ListNode<E> { private E element; private ListNode<E> next; /* Creates a listnode which contains e. */ private ListNode(E e) { element = e; next = null; H1. Skriv programrader som skapar ett lista av typen SingleLinkedList för att lagra heltal samt ser till att listan innehåller talen 1, 2, 3. H2. a) Lägg till följande metod i klassen SingleLinkedList: /** Returns the first element in this list. Throws NoSuchElementException if this list is empty. */ E getfirst(); b) Lägg till följande metod i klassen SingleLinkedList: /** Returns the last element from this list. Throws NoSuchElementException if this list is empty. */ E getlast();

13 Övning 2 listor, köer och stackar 13 H3. Lägg till följande metod i klassen SingleLinkedList: /** Returns true if this collection contains the specified element. */ public boolean contains(object x); H4. Lägg till följande metod i klassen SingleLinkedList: /** Removes the first occurrence of the specified element from this list, if it is present. If this list does not contain the element, it is unchanged. Returns true if this list contained the specified element (or equivalently, if this list changed as a result of the call). */ boolean remove(object e); Ledning: Utgå från din lösning på uppgift H3. Tänk på att du för att kunna ta bort ett element måste ha en referens till föregående element i listan. Håll därför reda både på aktuellt element och dess föregångare när du går framåt i listan under sökningen. Tänk på specialfallen (tom lista, det är första elementet som ska tas bort...). Skugga metoden equals H5. Antag att vi ska lagra böcker i en lista av typen SingleLinkedList från uppgift H1 (eller i en lista av typen java.util.arraylist eller java.util.linkedlist). En bok beskrivs av följande klass: public class Book { private String isbn; private String title; private String author; public Book(String isbn, String title, String author) { this.isbn = isbn; this.title = title; this.author = author; En bok identifieras av sitt ISBN-nummer. Gör de förändringar i klassen Book som behövs för att metoderna contains och remove ska fungera som förväntat. Implementering genom delegation H6. I läroboken, kapitel 2, finns en implementering av en klass OrderedList som representerar en följd av element, sorterad i växande ordning. Klassen har följande utformning: public class OrderedList<E extends Comparable<E> implements Iterable<E> { private LinkedList<E> thelist; public OrderedList() { thelist = new LinkedList<E>();

14 14 Övning 2 listor, köer och stackar public void add(e obj) { ListIterator<E> itr = thelist.listiterator(); while (itr.hasnext()) { if (obj.compareto(itr.next()) < 0) { itr.previous(); itr.add(obj); return; itr.add(obj); public E get(int index) { return thelist.get(index); public Iterator<E> iterator() { return thelist.iterator(); public int size() { return thelist.size(); I metoden add ser man till att listan blir sorterad i storleksordning genom att leta upp rätt position för objektet obj. Övriga metoder utför sin uppgift genom att delegera till motsvarande operation i klassen LinkedList (som visas i koden ovan för metoderna get, iterator och size). Varför implementerar man inte OrderedList genom att ärva från klassen LindkedList<E> enligt följande mönster? public class OrderedList<E extends Comparable<E>> extends LinkedList<E> H7. I klassen OrderedList i uppgift H6 anges typparametern på följande sätt: <E extends Comparable<E>> Vad innebär det? Skulle man istället kunna skriva bara <E>? H8. Lägg till metoden remove i klassen OrderedList. Tänk på utnyttja att listan är sorterad så att du inte undersöker onödigt många element. /** Removes the first occurrence of the specified element from this list, if it is present. If this list does not contain the element, it is unchanged. Returns true if this list contained the specified element (or equivalently, if this list changed as a result of the call). */ boolean remove(e obj); Implementera interfacet Comparable H9. Antag att vi ska använda klassen OrderedList i uppgift H6 för att hålla reda på patienter som väntar på en akutmottagning. Varje patient tilldelas en prioritet, som är ett heltal. Ett lågt värde på detta attribut motsvarar hög prioritet. Patienter representeras av följande klass:

15 Övning 2 listor, köer och stackar 15 public class Patient { private String firstname; private String lastname; private int prio; public Patient(String firstname, String lastname, int prio) { this.firstname = firstname; this.lastname = lastname; this.prio = prio;... Se till att klassen implementerar gränssnittet Comparable<T>. Det är prioriteterna som ska jämföras här och inte namnen. Tänk också på att det är en god regel att också omdefiniera metoden boolean equals(object x) som finns i superklassen Object så att dessa båda metoder är ense om när två objekt av klassen är lika. H10. Hur ska metoden compareto implementeras om man istället för prioritet ska jämföra namnen? Antag att man i första hand ska sortera efter efternamn. Att lösa på övningen D1. I klassen OrderedList från uppgift H6 förekommer interfacen Iterator<E> och Iterable<E>. De har snarlika namn och är därför lätta att blanda ihop. Red ut begreppen genom att diskutera vad de används till och vad de innehåller för metoder. D2. Eftersom man i klassen OrderedList delegerar till klassen LinkedList ät det enkelt att låta OrderedList implementera interfacet Iterable<E>. Lite besvärligare blir det om man också vill att klassen SingleLinkedList från uppgift H1 ska implementera interfacet Iterable<E>. Sammanfatta med ett par meningar hur man ska göra detta. D3. I OrderedList finns det en metod iterator som returnerar en Iterator för listan. Varför finns det inte också en metod listiterator som returnerar en ListIterator? D4. Beskriv (i ord) hur man kan implementera den abstrakta datatypen stack genom att delegera till LinkedList använda en enkellänkad lista använda en vektor Implementeringen ska inte vara onödigt ineffektiv. D5. Ett annat sätt att skaffa sig en stack är att helt enkelt skapa ett LinkedList-objekt och använda lämpliga metoder i den klassen. Vilka fördelar/nackdelar finns det med detta? D6. I Javas klassbibliotek finns det en klass Stack som ärver klassen Vector. Klassen Vector är en klass, som innehåller ungefär samma operationer som ArrayList. Varför är detta en dålig design? U1. Alla interface och klasser som representerar en samling (Collection) har i Javas klassbibliotek en operation iterator() som returnerar ett objekt av en klass som implementerar interfacet Iterator. I interfacet Iterator finns bl.a. metoderna hasnext och next som kan användas för att traversera (iterera över) samlingens element. Varför lägger man inte i stället in metoderna hasnext och next i samlingsklasserna?

16 16 Övning 2 listor, köer och stackar U2. Givet en kö q. Visa hur man kan använda en stack för att vända kön bak och fram. Gör detta genom att skriva kod. Du kan utgå från följande gränssnitt för kö respektive stack samt anta att det finns en klass MyStack<E> som implementerar Stack<E>. public interface Queue<E> { public E poll(); public E peek(); public void offer(e x); public boolean isempty(); public interface Stack<E> { public E pop(); public E peek(); public void push(e x); public boolean isempty(); // tar bort och returnerar första elementet // returnerar första elementet, utan att ta bort det // lägger in x sist i kön // undersöker om kön är tom // tar bort och returnerar översta elementet // returnerar, men tar inte bort översta elementet // lägger in x överst på stacken // undersöker om stacken är tom U3. En dequeue (eng: double-ended queue) är en följd av element där det är tillåtet att ta bort första och sista elementet och att lägga in nya element först och sist. Implementera en dequeue med en enkellänkad lista enligt följande: public class Dequeue<E> { private Node<E> first; private Node<E> last; // reference to the first element // reference to the last element /** Creates an empty dequeue. */ public Dequeue() { first = last = null; /** Inserts the specified element at the beginning of this dequeue. */ public void addfirst(e x) {... /** Inserts the specified element at the end of this dequeue. */ public void addlast(e x) {... /** Removes and returns the first element in this dequeue. Returns null if this dequeue is empty. */ public E removefirst() {... /** Removes and returns the last element in this dequeue. Returns null if this dequeue is empty. */ public E removelast() {... private static class Node<E> { private E element; private Node<E> next; private Node(E element) { this.element = element; next = null;

17 Övning 2 listor, köer och stackar 17 U4. I föregående uppgift representeras noderna i kön av en statisk klass Node<E> som är deklarerad i klassen Dequeue. a) Om vi stryker static i deklarationen av nodklassen blir den en s.k. inre klass. (En inre klass är en icke-statisk klass deklarerad i en annan klass). Vad blir skillnaden? b) Kan vi låta nodklassen vara en inre klass? U5. Tänk ut lämpliga testfall för den klass som implementerades i föregående uppgift. Det räcker att du formulerar dem i ord, men om du vill kan du alternativt formulera dem som testmetoder i JUnit.

18 18 Övning 3 algoritmers effektivitet, rekursion Övning 3 algoritmers effektivitet, rekursion Tema: Enkla tekniker för att uppskatta effektiviteten hos algoritmer. Rekursion. Litteratur: Effektivitet hos algoritmer behandlas i avsnitt 2.4 i läroboken samt i OH-bilderna från föreläsning. Om rekursion kan du läsa i avsnitt samt i OH-bilder. Hemarbete Algoritmers effektivitet H1. I de fyra deluppgifterna i denna uppgift ska följande frågor besvaras: hur många gånger kommer satsen SimpleStatement att utföras? vad är tidskomplexiteten (ordo-notation)? a) for (int i = 1; i <= n; i++) { for (int j = 1; j <= 2; j++) { SimpleStatement; b) for (int i = 1; i <= n; i++) { for (int j = 1; j <= n/2; j++) { SimpleStatement; c) for (int i = 1; i <= n; i++) { for (int j = n; j >= i; j--) { SimpleStatement; d) for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == j) { SimpleStatement; H2. En s.k. dequeue (double-ended queue) är en följd av element där man får ta bort första eller sista elementet och sätta in nya element längst fram eller längst bak. a) Vad blir kostnaden för de fyra operationerna om en dequeue representeras av en referens till det första elementet i enkellänkad datastruktur? b) Vad blir kostnaden för operationerna om man använder en enkellänkad struktur och låter en dequeue representeras av en referens till första elementet och en till det sista? c) Finns det någon representation i vilken alla operationer får kostnaden O(1)? H3. Man har analyserat en algoritm med avseende på tidskomplexitet och kommit fram till att den är O(n). Man har också implementerat algoritmen och mätt exekveringstiden. För

19 Övning 3 algoritmers effektivitet, rekursion 19 n = 100 tog det 1 ms. Hur lång tid kommer det att ta för n = 1000 om körningen sker på samma dator? H4. Man har analyserat en algoritm med avseende på tidskomplexitet och kommit fram till att den är O(2 n ). Man har också implementerat algoritmen och mätt exekveringstiden. För n = 10 tog det 1 ms. Hur stort problem kan man lösa med algoritmen (på samma dator) om man har en sekund på sig? H5. I Javas klassbibliotek finns två klasser som implementerar interfacet List. Den ena klassen ArrayList använder ett fält (vektor) för att representera listan. Den andra LinkedList använder en dubbellänkad lista med referens till första och sista elementet. a) Vad blir tidskomplexiteten för metoden get(int index) i respektive implementering? b) Vad blir tidskomplexiteten för metoden indexof(object x) i respektive implementering? c) Vad blir tidskomplexiteten för metoden add(int index, E element) i respektive implementering? d) Vad blir tidskomplexiteten för metoden remove(int index) i respektive implementering? e) Betrakta följande kod: int sum = 0; for (int i = 0; i < list.size(); i++) { sum = sum + list.get(i); Vad är tidskomplexiteten om list är av typ ArrayList<Integer> respektive Linked- List<Integer>? f) Finns det något sätt att skriva om koden i föregående deluppgift så att den blir lika effektiv oavsett vilken av de två typerna list har? Rekursion H6. Man kan definiera potensfunktionen x n (n heltal 0) rekursivt enligt: x 0 = 1 x n = x x n 1 a) Skriv en rekursiv metod public static double power(double x, int n) som beräknar x n enligt denna definition. b) Beräkningen kan göras effektivare om man i stället gör följande definition: x 0 = 1 x n = (x n/2 ) 2 om n>0 och jämnt x n = x (x n/2 ) 2 om n>0 och udda Gör en ny implementering av metoden i a enligt denna definition. (Med n/2 avses här heltalsdivision.) c) Ändra lösningen från uppgift b så att den även klarar negativa värden på n. Ledning: Skriv en metod som kontrollerar om värdet på n är negativt eller ej och sedan anropar den rekursiva metoden från b. Tänk på att x n = 1 x n. H7. Antag att ett antal kanonkulor är staplade i en pyramid. Överst finns en ensam kanonkula som vilar på fyra andra kanonkulor. Dessa vilar i sin tur på ett lager av nio kanonkulor

20 20 Övning 3 algoritmers effektivitet, rekursion etc. Skriv en rekursiv funktion som räknar ut hur många kanonkulor en pyramid med n lager innehåller. Ledning: Börja med att fundera ut basfallet. Dvs. välj en tillräckligt liten pyramid där du direkt kan ange antal kanonkulor. Ta sedan hand om rekursiva steget: I botten av pyramiden finns n n kanonkulor. Dessa ska adderas till antal kanonkulor i en pyramid med n 1 lager. Rekursiva algoritmer effektivitet H8. I denna uppgift behandlas problemet att beräkna största talet i en vektor med n heltal (n 1). Följande implementering föreslås: /** Tag reda på vilket av de n första elementen i v som är störst. */ public static int findmax(int[] v, int n) { if (n == 1) { return v[0]; else if (v[n-1] > findmax(v, n-1)) { return v[n-1]; else { return findmax(v, n-1); Denna algoritm är mycket ineffektiv. Förklara varför. Det går att göra en väsentligt effektivare rekursiv implementering genom en enkel ändring. Utför ändringen och ange sedan tidskomplexiteten. Kritisk granskning av rekursiva lösningsförslag I Proceedings of The 7th Annual Conference on Innovation and Technology in Computer Science Education Aarhus, Denmark June 2002 finns en artikel med titeln The Case of Base Cases: Why are They so Difficult to Recognize? Student Difficulties with Recursion av Bruria Haberman och Haim Averbuch. Genom att samla in studenters rekursiva lösningar på olika problem beskrivs hur författarna försökte göra sig en bild av vilka misstag som var vanligast. Inte bara felaktiga lösningar var i detta sammanhang intressanta utan också sådana som är onödigt komplicerade. I en del av studien lät man också andra studenter titta på lösningarna för att evaluera dem. Låt oss knyta an till detta genom att studera de rekursiva lösningsförslagen (pseudokod) till några problem i uppgifterna H9 10. Försök i första hand för varje lösning avgöra om den är korrekt eller ej. För lösningar som du anser korrekta kan du sedan gå vidare och ge ytterligare synpunkter t ex om de kan förenklas eller göras elegantare. H9. I denna uppgift ska fyra förslag för att rekursivt beräkna n! granskas: a) fac(n) om n == 0 return 1 annars return n*fac(n-1) b) fac(n) om n==0 return 1 annars om n == 1 return 1 annars return n*fac(n-1)

21 Övning 3 algoritmers effektivitet, rekursion 21 c) fac(n) om n==1 return 1 annars return n*fac(n-1) d) fac(n) return n*fac(n-1) H10. Granska följande två förslag till att undersöka om elementet x ingår i en lista. (list.tail() används för att beteckna den lista som består av alla element utom det första i list): a) ismember(x,list) om list är tom return false annars om x == första elementet i list return true annars return ismember(x,list.tail()) b) ismember(x,list) om x == första elementet i list return true annars return ismember(x,list.tail()) Att lösa på övningen D1. Vad är tidskomplexitet? Hur räknar man ut tidskomplexitet? D2. Varför använder man tidskomplexitet istället för att helt enkelt mäta exekveringstiden? Hur förhåller sig den verkliga tidsåtgången till tidskomplexiteten? Vad innebär det till exempel att en algoritm har tidskomplexiteten O(n 2 )? D3. Den här uppgiften behandlar frågan "Hur fungerar rekursion egentligen"? Börja med att diskutera vad en aktiveringspost är och vad som händer vid ett metodanrop. Rita de aktiveringsposter som ett anrop av metoden i uppgift H6 a ger upphov till. D4. Följande båda algoritmer (pseudokod) föreslås för att skriva ut elementen i en enkellänkad lista i omvänd ordning. Jämför algoritmerna med avseende på enkelhet (att förstå och implementera) och effektivitet. Algoritm1 : (letar först upp sista elementet, sedan näst sista etc...) leta upp sista noden i listan och låt q referera till denna så länge q!= null skriv ut innehållet i q; om q = första noden i listan, avbryt p = första noden i listan: så länge p.next!= q p = p.next; q = p; Algoritm2 (rekursiv, skriver ut innehållet i den lista som n refererar till i omvänd ordning) public void printreverse(listnode n) om (n!= null) printreverse(n.next); skriv ut innehållet i n;

22 22 Övning 3 algoritmers effektivitet, rekursion D5. Vad är dynamisk programmering och vad har man det till? U1. I början av en kurs tänker kursansvarig lärare göra ett upprop. Läraren har tillgång till en osorterad lista med anmälda studenter, n st. Det finns n+k studenter i lokalen vid start (flera har nämligen glömt anmäla sig). k är litet i förhållande till n. Läraren väljer nu mellan två tillvägagångssätt: 1. Alla studenterna presenterar sig en efter en. För varje student letar läraren på sin lista. Om studenten finns på listan antecknas närvaro, annars skrivs studenten in sist på listan. 2. Läraren läser upp namnen på sin lista. Studenterna ombeds svara om de är närvarande. Närvaro registreras på listan. När hela listan lästs ombeds de (ungefär k) vars namn inte lästs upp presentera sig och de skrivs in på listan. Vilken algoritm är effektivast? Vad är tidskomplexiteten för algoritmerna i ordo-notation? U2. Det finns ett problem som brukar kallas kändisproblemet och som går ut på att ta reda på om det finns en kändis i en samling med n personer. För att en person p ska vara kändis i en mängd krävs att alla personer i mängden känner p och att p inte känner någon av de andra i mängden. a) Av definitionen av en kändis följer att det kan finnas högst en kändis i en mängd. Förklara varför! b) En algoritm för att ta reda på om det finns en kändis i en mängd är att numrera personerna 1,2,...n och använda en boolesk matris med n rader och n kolumner. Plats (i,j) i matrisen får värdet true om person nummer i uppger att hon/han känner person nummer j, annars false. Matrisen fylls i enligt följande algoritm: for (p = 1; p <= n; p++) { for (q = 1; q <= n; q++) { fråga person nummer p om hon/han känner person nummer q fyll i resultatet på plats (p,q) i matrisen for (row = 1; row <= n, row++) { om alla element i raden row, utom diagonalelementet, är false // i så fall känner person nummer row inte någon (utom sig själv) om alla element i kolumn row är true // i så fall känner alla person nummer row returnera true; returnera false Att vi undantar diagonalelementet på raden i algoritmen ovan beror på att alla (inklusive kändisar) får antas känna sig själva. Vad är kostnaden för denna algoritm? c) En alternativ algoritm bygger på att man ur mängden tar ut två godtyckliga personer p och q. Därefter frågar man p: Känner du q?. Om svaret är ja kan p uteslutas som kändis. Om svaret är nej kan q uteslutas. Den av personerna som inte kunde uteslutas placeras åter i mängden. Sedan fortsätter man på samma sätt tills mängden bara består av en enda person, x. x är den enda kvarvarande kandidaten till att vara kändis. Men det är inte säkert att x är kändis. (Varför?). Till sist frågar man därför x om hon/han känner de andra n-1 personerna och man frågar de andra n-1 personerna om de känner x. Sedan vet man om x var en kändis. Vad är tidskomplexiteten för denna algoritm?

23 Övning 3 algoritmers effektivitet, rekursion 23 U3. En student har analyserat en sorteringsalgoritm och kommit fram till att dess tidskomplexitet är O(n 2 ). Nu vill studenten kontrollera att detta är rätt genom att implementera algoritmen och mäta exekveringstiden för olika storlek på problemet. Beskriv hur man kan göra detta så att det verifieras att analysen är korrekt. U4. Vid implementeringen av en klass för listhantering har man tänkt använda följande klasser: public class SingleLinkedList<E> { private ListNode<E> first; public SingleLinkedList() { first = null;... private static class ListNode<E> { private E element; private ListNode<E> next; private ListNode(E e) { element = e; next = null; Listan ska alltså implementeras med en enkellänkad struktur. Den första metod som implementeras i listklassen är en metod för insättning. Följande rekursiva utformning föreslås: public void add(e x) { add(first, x); private void add(listnode<e> node, E x) { if (node == null) { node = new ListNode<E>(x); else { add(node.next, x); Vid test visar det sig att detta inte fungerar alls. Förklara varför. Ändra också implementeringen så att den blir korrekt (och fortfarande är rekursiv). U5. En palindrom är ett ord eller en mening som kan läsas på samma sätt både fram- och baklänges. Exempel: DALLASSALLAD, NITALARBRALATIN. Skriv en metod med rubriken public static boolean ispalindrome(string s) som med rekursiv teknik undersöker om en sträng är en palindrom. Ledning: Låt ispalindrome anropa en annan rekursiv metod som förutom strängen har två heltalsparametrar som anger index för första och sista tecken i den delsträng som ska undersökas.

24 24 Övning 4 mer om rekursion, binära träd Övning 4 mer om rekursion, binära träd Tema: Rekursion. Träd och binära sökträd. Litteratur: Repetera rekursion som behandlas i avsnitt Om träd och binära sökträd kan du läsa i avsnitt och Läs också OH-bilderna från föreläsningarna. Hemarbete Rekursion H1. Betrakta följande class: public class MysteryClass { public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); public static void main(string[] args) { MysteryClass.mystery(3); Vad skrivs ut när man kör programmet? Binära sökträd H2. Visa hur ett binärt sökträd ser ut efter insättning av element med följande nycklar: 2, 5, 1, 7, 9, 6, 3, 0, 8, 4. H3. I vilken ordning besöks noderna i trädet från uppgift H2 om man traverserar det preorder, inorder repektive postorder. Vilken traverseringordning ska man använda om man vill behandla noderna i växande ordning? H4. Vilken är den minsta möjliga resp. största möjliga höjden i ett binärt sökträd med n stycken noder? Rekursiva algoritmer för träd I några av uppgifterna nedan använder vi följande klasser för att representera ett binärt sökträd: public class BinarySearchTree<E extends Comparable<? super E>> { private Node<E> root;...metoder för insättning, borttagning,... private static class Node<E extends Comparable<? super E>> { private E element; private Node<E> left; private Node<E> right;...operationer...

25 Övning 4 mer om rekursion, binära träd 25 H5. a) Antag att följande metoder finns i klassen BinarySearchTree. Implementera färdigt den privata, rekursiva metoden printinorder. /** Skriver ut trädets noder i inorder. */ public void printinorder() { printinorder(root); private void printinorder(node<e> n) {... b) Hur förändras lösningen till uppgift a om man istället vill skriva ut elementen i preorder respektive postorder? H6. Lägg till en metod tostring() i klassen BinarySearchTree. Metoden ska returnera en sträng med innehållet i trädet i växande ordning. Elementen i trädet ska i strängen separeras med ett newline-tecken ( \n ). H7. a) Lägg till en metod nbrleaves() i klassen BinarySearchTree som returnerar antal löv i trädet. Låt den publika metoden nbrleaves anropa en privat rekursiv metod nbrleaves(node<e> n) som returnerar antal löv i det träd där n är rot. b) Lös samma uppgift som i deluppgift a men placera den rekursiva metoden i nodklassen. Implementera interfacet Comparable H8. Antag att vi ska lagra böcker i ett binärt sökträd av typen BinarySearchTree från uppgift H5. En bok beskrivs av följande klass: public class Book { private String isbn; private String title; private String author; public Book(String isbn, String title, String author) { this.isbn = isbn; this.title = title; this.author = author; a) Vad händer om vi försöker deklarera och skapa ett binärt sökträd enligt följande: BinarySearchTree<Book> books = new BinarySearchTree<Book>(); b) En bok identifieras av sitt ISBN-nummer. Ändra i klassen Book så att den implementerar interfacet Comparable. Att lösa på övningen D1. I rekursiva metoder ska det finnas minst ett basfall. Förklara begreppet basfall. Förklara också varför det måste vara med.

26 26 Övning 4 mer om rekursion, binära träd D2. Jämför följande två förslag att räkna antal noder i ett binärt träd med roten n. Är de korrekta eller ej. Kan de förenklas? a) count(n) om n == null return 0 annars om n.left == null && n.right == null return 1 annars om n.left == null return 1 + count(n.right) annars om n.right == null return 1 + count(n.left) annars return 1 + count(n.left) + count(n.right) b) count(n) om n == null return 0 annars return 1 + count(n.left) + count(n.right) D3. Beskriv hur man kan gå tillväga för att behandla noderna i ett binärt träd nivå- för nivå (dvs. först roten, sedan rotens barn, barnbarn...)? Tips! Använd en kö. D4. Kan man använda ett binärt sökträd som hjälp för att sortera ett stort antal element? U1. Antag att vi vet att en funktion f (x) har ett nollställe i ett visst intervall [x1, x2]. Då kan vi beräkna detta nollställe med en teknik som liknar binärsökning. Vi ska alltså stänga in nollstället genom upprepade halveringar av intervallet [x1, x2] tills intervallet är tillräckligt litet (mindre än eps som t ex kan vara lika med ). En intervallhalvering går till så att man först beräknar mittpunkten, m, och därefter ersätter x1 eller x2 med m. För att avgöra om det är x1 eller x2 om ska ersättas jämförs tecknen på f (m) med f (x1) och f (x2). Om f (m) har samma tecken som f (x1) ska mittpunkten ersätta x1, annars ska mittpunkten ersätta x2. Exempel: i figuren nedan är f (x1) och f (m) båda negativa och sökningen fortsätter i högra halvan av interfallet. f(x) f(x) x1 m x2 x x1 m x2 x

27 Övning 4 mer om rekursion, binära träd 27 Metoden getzero i klassen Bisection löser problemet ovan: public class Bisection { /** Beräknar nollstället för funktionen f i intervallet [low, high] med precisionen eps. Förutsätter att det finns ett nollställe i intervallet. */ public static double getzero(double low, double high, double eps, Function f) {... Function är ett interface med en metod för att beräkna ett funktionsvärde: public interface Function { double evaluate(double x); a) Implementera metoden getzero med rekursiv teknik. b) Skriv en klass som implementerar interfacet Function och som motsvarar funktionen e x 1 + cos(x). c) Skriv programrad/rader som beräknar nollstället för funktionen e x 1 + cos(x) i intervallet [0, 1.6] med noggrannheten U2. Ett aritmetiskt uttryck som består av tal och de fyra binära operatorerna +, -, * och / kan representeras av ett binärt träd där löven innehåller talen och övriga noder innehåller operatorer. Exempel: + * Följande klasser representerar ett binärt uttrycksträd. För enkelhets skull har vi i den här uppgiften låtit både operatorer och heltal representeras av en teckensträng. public class ExprTree { private ExprNode root; // refererar till roten i trädet // konstruktor och övriga metoder /** Returnerar en teckensträng som representerar uttrycket. Teckensträngen innehåller parenteser runt alla deluttryck, utom runt talen. */ public String fullparen(); private static class ExprNode { String element; // nodens innehåll ExprNode left; // refererar till vänster barn ExprNode right; // refererar till höger barn // konstruktor och övriga metoder Implementera metoden fullparen med rekursiv teknik. Om uttrycksträdet ser ut som i exemplet ska följande teckensträng returneras: ((5*(9-2))+7)

28 28 Övning 4 mer om rekursion, binära träd U3. Här är ett annat exempel på ett träd. En katalog (eng: directory) är en fil som kan innehålla andra filer och kataloger. Se exempel: ~dt08nn Mail kurser dokument fil progr pfk fil1 fil2 fil3 Din uppgift är att implementera metoden /** Returnerar en lista med alla vanliga filer i file som är större än size bytes. */ public static List<File> biggerthan(file file, int size) { File är en klass i Java som representerar en fil eller en katalog. Klassen har bland annat följande metoder: /** Returnerar true om filen är en vanlig fil. */ boolean isfile(); /** Returnerar true om filen är en katalog. */ boolean isdirectory(); /** Returnerar längden (i bytes) om aktuell fil är en vanlig fil. I annat fall returneras ett ospecificerat värde. long length(); /** Returnerar en vektor med filer om aktuell fil är en katalog. Om aktuell fil är en vanlig fil returneras null. File[] listfiles(); U4. Lägg till följande metod i klassen BinarySearchTree: public void printpart(e min, E max); Metoden ska skriva ut innehållet i de noder som är större än eller lika med min och mindre än eller lika med max i växande ordning. Använd rekursiv teknik och undvik att besöka fler noder än nödvändigt.

29 Övning 5 hashtabeller, heapar, prioritetsköer 29 Övning 5 hashtabeller, heapar, prioritetsköer Tema: Hashtabeller. Interfacen Set och Map. Heapar. Prioritetsköer. Litteratur: Interfacen Set och Map samt hashtabeller behandlas i avsnitt avsnitt Heapar, deras representation och användning behandlas i avsnitt 6.5. Läs också bilderna från föreläsningar. Hemarbete Hashtabeller H1. Ett antal objekt med ett heltalsattribut nbr ska sättas in i en hashtabell av storlek 10. Objekten har följande värden på nbr: 4371, 1323, 6173, 4199, 4344, 9679, Använd hashfunktionen h(x) = (x.nbr) % 10. Visa tabellens utseende efter insättningarna i följande tre fall genom. Ange alltså för varje upptagen plats i tabellen nbr-värdet för det objekt som placerats där. a) Linjär teknik används vid kollisioner b) Kvadratisk teknik används vid kollisioner c) En öppen hashtabell används (separate chaining) Interfacen Set och Map H2. Antag att vi ska använda en av klasserna i Java Collections Framework för att hålla reda på böcker. En bok beskrivs av följande klass: public class Book { private String isbn; private String title; private String author; public Book(String isbn, String title, String author) { this.isbn = isbn; this.title = title; this.author = author; a) Vi vill snabbt snabbt kunna hitta en bok med hjälp av dess ISBN-nummer och väljer klassen HashMap. Skriv programrader för att skapa ett HashMap-objekt att lagra böcker i och för att sätta in ett par (påhittade) böcker i bokregistret. Gör också de eventuella förändringar som behövs i klassen Book. b) I ett annat sammanhang vill man lagra böcker i ett HashSet-objekt. Skriv programrader som skapar ett HashSet-objekt att lagra böcker och sätter in ett par (påhittade) böcker i mängden. Gör också de eventuella förändringar som behövs i klassen Book. H3. Beskriv kort vad som händer vid sökning efter en bok i hashtabellen i uppgift H2b, dvs. vad som görs i metoden contains i klassen HashSet. Redogör i beskrivningen för hur metoderna equals och hashcode används vid sökningen.

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } } Rekursion 25 7 Rekursion Tema: Rekursiva algoritmer. Litteratur: Avsnitt 5.1 5.5 (7.1 7.5 i gamla upplagan) samt i bilderna från föreläsning 6. U 59. Man kan definiera potensfunktionen x n (n heltal 0)

Läs mer

1 Repetition av viktiga begrepp inom objektorienterad programmering

1 Repetition av viktiga begrepp inom objektorienterad programmering Repetition av viktiga begrepp inom objektorienterad programmering 3 1 Repetition av viktiga begrepp inom objektorienterad programmering Tema: Arv, parameteröverföring, statiska attribut och metoder. Litteratur:

Läs mer

Repetition av viktiga begrepp inom objektorienterad programmering

Repetition av viktiga begrepp inom objektorienterad programmering Repetition av viktiga begrepp inom objektorienterad programmering Tema: Arv, parameteröverföring, statiska attribut och metoder. Arv U 1. Betrakta följande klasser: public class Person { protected String

Läs mer

Övningsuppgifter, EDAA01 Programmeringsteknik fördjupningskurs

Övningsuppgifter, EDAA01 Programmeringsteknik fördjupningskurs LUNDS TEKNISKA HÖGSKOLA EDAA01 Programmeringsteknik fördjupningskurs Institutionen för datavetenskap HT 2015 Övningsuppgifter, EDAA01 Programmeringsteknik fördjupningskurs Övningsuppgifternas syfte är

Läs mer

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

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp Föreläsning 4 Innehåll Abstrakta datatypen lista Definition Abstrakta datatypen lista egen implementering Datastrukturen enkellänkad lista Nästlade klasser statiska nästlade klasser inre klasser Listklasser

Läs mer

Föreläsning 4 Innehåll

Föreläsning 4 Innehåll Föreläsning 4 Innehåll Abstrakta datatypen lista Datastrukturen enkellänkad lista Nästlade klasser statiskt nästlade klasser inre klasser Listklasser i Java Implementera abstrakta datatyperna stack och

Läs mer

Föreläsning 9 Innehåll

Föreläsning 9 Innehåll Föreläsning 9 Innehåll Binära sökträd algoritmer för sökning, insättning och borttagning, implementering effektivitet balanserade binära sökträd, AVL-träd Abstrakta datatyperna mängd (eng. Set) och lexikon

Läs mer

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 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande: Föreläsning 7 Innehåll Rekursion Rekursivt tänkande: Hur många år fyller du? Ett år mer än förra året! Rekursion Rekursiv problemlösning Binärsökning Generiska metoder Rekursiv problemlösning: Dela upp

Läs mer

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

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet Föreläsning 13 Innehåll Algoritm 1: Sortera Exempel på problem där materialet i kursen används Histogramproblemet Schemaläggning Abstrakta datatyper Datastrukturer Att jämföra objekt Om tentamen Skriftlig

Läs mer

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

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition Seminarium 4 Köer och Stackar Innehåll ADT:erna Kö och Stack Definitioner Operationer Exempel på användning Givna klasser i Java Interfacet Queue Klassen Stack Klassen LinkedList Klassen PriorityQueue

Läs mer

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg 2013 12 19, 8.00 13.00 Anvisningar: Denna tentamen består av 4 uppgifter. Preliminärt

Läs mer

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

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet. -Algoritmer och Datastrukturer- Abstrakt datatyp Datatyp för en variabel Betecknar i ett programmeringsspråk den mängd värden variabeln får anta. T ex kan en variabel av typ boolean anta värdena true och

Läs mer

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Tentamen, EDAA01 Programmeringsteknik fördjupningskurs 2014 03 10, 8.00 13.00 Anvisningar: Denna tentamen består av 5 uppgifter. Preliminärt

Läs mer

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs 2013 12 19 1. a) En samling element där insättning och borttagning

Läs mer

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

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist. Seminarium 2 Introduktion till Java Collections Framework Innehåll Generik Bakgrund Generik används för att få typsäkra datastrukturer Java Collections Framework Standardbibliotek med datastrukturer i

Läs mer

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg 2013 12 19 1. a) En samling element där insättning och borttagning

Läs mer

Föreläsning 14 Innehåll

Föreläsning 14 Innehåll Föreläsning 14 Innehåll Abstrakta datatyper, datastrukturer Att jämföra objekt övriga moment i kursen Om tentamen Skriftlig tentamen både programmeringsuppgifter och teoriuppgifter Hitta fel i fingerade

Läs mer

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

Föreläsning 2. Länkad lista och iterator Föreläsning 2 Länkad lista och iterator Föreläsning 2 Länkad-lista Lista implementerad med en enkellänkad lista Iterator Implementering av en Iterator Dubbellänkad lista och cirkulär lista LinkedList JCF

Läs mer

1 Repetition av viktiga begrepp inom objektorienterad programmering

1 Repetition av viktiga begrepp inom objektorienterad programmering Repetition av viktiga begrepp inom objektorienterad programmering 1 1 Repetition av viktiga begrepp inom objektorienterad programmering U 1. U 2. U 3. U 4. U 5. En referensvariabel har en viss deklarerad

Läs mer

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

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna Föreläsning Innehåll Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Klassen PriorityQueue i java.util Implementering med lista ar Implementering av prioritetskö med heap Sortering

Läs mer

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

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist. Seminarium 3 Introduktion till Java Collections Framework Innehåll Generik Bakgrund Java Collections Framework interface och klasser för samlingar av element interfacen Iterator och Iterable och foreach-sats

Läs mer

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

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd Föreläsning 8 Innehåll Datastrukturer i kursen Träd, speciellt binära träd egenskaper användningsområden implementering Undervisningsmoment: föreläsning 8, övningsuppgifter 8, lab 4 Avsnitt i läroboken:

Läs mer

13 Prioritetsköer, heapar

13 Prioritetsköer, heapar Prioritetsköer, heapar 31 13 Prioritetsköer, heapar U 101. En prioritetskö är en samling element där varje element har en prioritet (som används för att jämföra elementen med). Elementen plockas ut i prioritetsordning

Läs mer

Länkade strukturer. (del 2)

Länkade strukturer. (del 2) Länkade strukturer (del 2) Översikt Abstraktion Dataabstraktion Inkapsling Gränssnitt (Interface) Abstrakta datatyper (ADT) Programmering tillämpningar och datastrukturer 2 Abstraktion Procedurell abstraktion

Läs mer

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

Föreläsning 2. Länkad lista och iterator Föreläsning 2 Länkad lista och iterator Föreläsning 2 Länkad-lista Lista implementerad med en enkellänkad lista Iterator Implementering av en Iterator Dubbellänkad lista och cirkulär lista LinkedList JCF

Läs mer

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

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar Föreläsning 1 Innehåll ADT Prioritetskö Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Klassen PriorityQueue i java.util ar Implementering av prioritetskö med heap Sortering med hjälp

Läs mer

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 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Föreläsning 4 Kö Föreläsning 4 ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista ADT Kö Grundprinciper: En kö fungerar som en kö. Man fyller på den längst bak och

Läs mer

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander F12 - Collections ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se Collections (samlingar) En collection är ett objekt som fungerar som en samling av andra objekt En collection erbjuder

Läs mer

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass EDAA20 Föreläsning 11-12 Klassen ArrayList Klassen ArrayList Skriva program som läser data från en textfil och skriver data till en textfil Repetition inför delmålskontroll 2 är en standardklass (i paketet

Läs mer

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

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010 Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010 interface, motivation och bakgrund Antag att vi gör en generell listklass: public class List { protected static class ListNode { public

Läs mer

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 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel Föreläsning 3 Innehåll Generiska klasser Implementera generiska klasser Exceptions Dokumentationekommentarer javadoc Enhetstestning - junit Man kan deklarera en eller flera typparametrar när man definierar

Läs mer

Tentamen, Algoritmer och datastrukturer

Tentamen, Algoritmer och datastrukturer UNDS TEKNISKA ÖGSKOA (6) Institutionen för datavetenskap Tentamen, Algoritmer och datastrukturer 23 8 29, 8. 3. Anvisningar: Denna tentamen består av fem uppgifter. Totalt är skrivningen på 36 poäng och

Läs mer

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

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar Föreläsning 1 Innehåll Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Klassen PriorityQueue i java.util Heapar Implementering av prioritetskö med heap Sortering med hjälp av heap

Läs mer

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

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9 Listor Koffman & Wolfgang kapitel 2, avsnitt 2.1 2.3, 2.5 2.6 och 2.9 Figur 2.1, sid 63 java.util.list, med dess implementeringar 2 List och primitiva typer En array kan innehålla primitiva typer: int[],

Läs mer

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition Föreläsning Innehåll Diskutera Binära sökträd algoritmer för sökning, insättning och borttagning implementering effektivitet balanserade binära sökträd, AVL-träd Jämföra objekt interfacet Comparable Interfacet

Läs mer

Seminarium 13 Innehåll

Seminarium 13 Innehåll Seminarium 13 Innehåll Prioritetsköer och heapar Prioritetsköer ADTn Klassen PriorityQueue i java.util Implementering med lista Heapar ADTn För implementering av prioritetskö För sortering Efter seminariet

Läs mer

Övningsuppgifter, EDAA30 Programmering i Java - fortsättningskurs

Övningsuppgifter, EDAA30 Programmering i Java - fortsättningskurs LUNDS TEKNISKA HÖGSKOLA EDAA30 Programmering i Java - fortsättningskurs Institutionen för datavetenskap HT 2016 Övningsuppgifter, EDAA30 Programmering i Java - fortsättningskurs Övningsuppgifternas syfte

Läs mer

Föreläsning 9 Innehåll

Föreläsning 9 Innehåll Föreläsning 9 Innehåll Träd, speciellt binära träd egenskaper användningsområden implementering Datavetenskap (LTH) Föreläsning 9 HT 2017 1 / 31 Inlämningsuppgiften De föreläsningar som inlämningsuppgiften

Läs mer

Föreläsning 10 Innehåll

Föreläsning 10 Innehåll Föreläsning 10 Innehåll Binära sökträd algoritmer för sökning, insättning och borttagning implementering effektivitet balanserade binära sökträd, AVL-träd Jämföra objekt interfacet Comparable Interfacet

Läs mer

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. 1 (8) TENTMEN: lgoritmer och datastrukturer Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. örja varje uppgift på ett nytt blad. Skriv inga lösningar i tesen. Skriv ditt idnummer

Läs mer

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Algoritmer & Datastrukturer i Java Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2007-03-13 Skrivtid: 4 timmar Kontakt person: Nicolina Månsson, tel. 035-167487 Poäng / Betyg:

Läs mer

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd Föreläsning Innehåll Diskutera Binära sökträd algoritmer för sökning, insättning och borttagning implementering effektivitet balanserade binära sökträd, AVL-träd Jämföra objekt interfacet Comparable Interfacet

Läs mer

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga

Läs mer

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 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 4 Kö 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 ADT Kö Grundprinciper: En kö fungerar som en kö. Man

Läs mer

DAT043 - föreläsning 8

DAT043 - föreläsning 8 DAT043 - föreläsning 8 Paket, generics, Java collections framework 2017-02-07 Paket och tillgänglighet Ovanför klasser finns en hierarkisk namespace med paket. Filer som inte deklareras i något paket finns

Läs mer

Föreläsning 5 Innehåll

Föreläsning 5 Innehåll Föreläsning 5 Innehåll Algoritmer och effektivitet Att bedöma och jämföra effektivitet för algoritmer Begreppet tidskomplexitet Datavetenskap (LTH) Föreläsning 5 VT 2019 1 / 39 Val av algoritm och datastruktur

Läs mer

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

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen Föreläsning 9 Innehåll Inlämningsuppgiften De föreläsningar som inlämningsuppgiften bygger på är nu klara. Det är alltså dags att börja arbeta med inlämningsuppgiften. Träd, speciellt binära träd egenskaper

Läs mer

Länkade strukturer, parametriserade typer och undantag

Länkade strukturer, parametriserade typer och undantag Länkade strukturer, parametriserade typer och undantag Programmering för språkteknologer 2 Sara Stymne 2013-09-18 Idag Parametriserade typer Listor och länkade strukturer Komplexitet i länkade strukturer

Läs mer

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Prioritetskö Heap Representation som

Läs mer

Interfacen Set och Map, hashtabeller

Interfacen Set och Map, hashtabeller Föreläsning 0 Innehåll Hashtabeller implementering, effektivitet Interfacen Set och Map ijava Interfacet Comparator Undervisningsmoment: föreläsning 0, övningsuppgifter 0-, lab 5 och 6 Avsnitt i läroboken:

Läs mer

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2 Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket 1 Länkade listor Likadant som i Ada-kursen. 2 Stack MyStack MyStack

Läs mer

Programmering fortsättningskurs

Programmering fortsättningskurs Programmering fortsättningskurs Philip Larsson 2013 03 09 Innehåll 1 Träd 1 1.1 Binära träd........................................ 1 1.2 Strikt binärt träd..................................... 1 1.3 Binärt

Läs mer

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Algoritmer & Datastrukturer i Java Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2010-03-16 Skrivtid: 4 timmar Kontaktperson: Nicolina Månsson Poäng / Betyg: Max 44 poäng

Läs mer

Föreläsning 2 Datastrukturer (DAT037)

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

Läs mer

Föreläsning 2 Innehåll

Föreläsning 2 Innehåll Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga

Läs mer

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor Abstrakta datatyper 1 Primitiva vektorer Vektorer kan skapas av primitiva datatyper, objektreferenser eller andra vektorer. Vektorer indexeras liksom i C från 0. För att referera en vektor används hakparenteser.

Läs mer

Datastrukturer. föreläsning 3. Stacks 1

Datastrukturer. föreläsning 3. Stacks 1 Datastrukturer föreläsning 3 Stacks 1 Abstrakta datatyper Stackar - stacks Köer - queues Dubbeländade köer - deques Vektorer vectors (array lists) All är listor men ger tillgång till olika operationer

Läs mer

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

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer Arrayer Samling av data Datastrukturer int[] minatelnummer = new int[30]; // allokering av tillräckligt // stort minnesutrymme Element refereras genom indexering ringa = minatelnummer[25]; // indexering

Läs mer

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

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material) Objektorienterad Programmering DAT043 Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material) 1 Metoden clone() Skapa kopior av existerande objekt. Interface Cloneable Deep vs.

Läs mer

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1) Föreläsning 10 STRING OCH STRINGBUILDER; VARIABLERS SYNLIGHET Att deklarera och att använda variabler När vi deklarerar en variabel, t ex int x; inför vi en ny variabel med ett namn och en typ. När namnet

Läs mer

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036) Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-25 Idag Starkt sammanhängande komponenter Duggaresultat Sökträd Starkt sammanhängande komponenter Uppspännande skog Graf, och en möjlig

Läs mer

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

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 Tentamen Programmeringsteknik II 2017-10-23 Skrivtid: 14:00 19:00 Inledning Skrivningen innehåller ett antal bilagor: Bilagan listsandtrees innehåller fyra klasser: Klassen List med några grundläggande

Läs mer

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

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande: Föreläsning 6 Innehåll Rekursion Begreppet rekursion Rekursiv problemlösning Samband mellan rekursion och induktion Söndra-och-härska-algoritmer Dynamisk programmering Undervisningsmoment: föreläsning

Läs mer

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna Seminarium inära sökträd Innehåll inära sökträd inära sökträd Definition Implementering lgoritmer Sökning Insättning orttagning Effektivitet alanserade binära sökträd Eempel på vad du ska kunna Förklara

Läs mer

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll Mera om generik Begreppet subtyp/supertyp i Java Innehåll Wildcards Vektorer och generik Supertyper för en viss klass C är alla klasser från vilka C ärver och alla interface som klassen implementerar.

Läs mer

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList. Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar

Läs mer

Föreläsning REPETITION & EXTENTA

Föreläsning REPETITION & EXTENTA Föreläsning 18 19 REPETITION & EXTENTA Programmeringsteknik på 45 minuter Klasser och objekt Variabler: attribut, lokala variabler, parametrar Datastrukturer Algoritmer Dessa bilder är inte repetitionsbilder

Läs mer

Föreläsning 3-4 Innehåll

Föreläsning 3-4 Innehåll Föreläsning 3-4 Innehåll Skriva egna metoder Logiska uttryck Algoritm för att beräkna min och max Vektorer Datavetenskap (LTH) Föreläsning 3-4 HT 2017 1 / 36 Diskutera Vad gör programmet programmet? Föreslå

Läs mer

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037) Föreläsning Datastrukturer (DAT07) Fredrik Lindblad 27 november 207 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/20/course/dat07 Innehåll 2

Läs mer

Diskutera. Hashfunktion

Diskutera. Hashfunktion Föreläsning 1 Innehåll Diskutera Hashtabeller implementering, effektivitet Metoden hashcode i Java Abstrakta datatyperna mängd (eng. Set) och lexikon (eng. Map) Interfacen Set och Map i Java Tidigare har

Läs mer

Föreläsning 3. Stack

Föreläsning 3. Stack Föreläsning 3 Stack Föreläsning 3 ADT Stack Stack JCF Tillämpning Utvärdera ett postfix uttryck Stack implementerad med en array Stack implementerad med en länkad lista ADT Stack Grundprinciper: En stack

Läs mer

Föreläsning 13 Innehåll

Föreläsning 13 Innehåll Föreläsning 13 Innehåll Prioritetsköer och heapar Prioritetsköer och heapar ADT prioritetskö Heapar Implementering av prioritetskö med heap Klassen PriorityQueue i java.util Programexempel LPT-algoritmen

Läs mer

EDAA01 Programmeringsteknik - fördjupningskurs

EDAA01 Programmeringsteknik - fördjupningskurs EDAA01 Programmeringsteknik - fördjupningskurs Läsperiod lp 1+2 (Ges även lp 3) 7.5 hp anna.axelsson@cs.lth.se sandra.nilsson@cs.lth.se http://cs.lth.se/edaa01ht Förkunskapskrav: Godkänd på obligatoriska

Läs mer

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

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod Föreläsning 3-4 Innehåll Diskutera Vad gör programmet programmet? Föreslå vilka satser vi kan bryta ut till en egen metod. Skriva egna metoder Logiska uttryck Algoritm för att beräkna min och max Vektorer

Läs mer

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

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek Föreläsning 5 Innehåll Val av algoritm och datastruktur Algoritmer och effektivitet Att bedöma och jämföra effektivitet för algoritmer Begreppet tidskomplexitet Det räcker inte med att en algoritm är korrekt

Läs mer

Föreläsning 3-4 Innehåll

Föreläsning 3-4 Innehåll Föreläsning 3-4 Innehåll Listor, stackar, köer Abstrakta datatypen lista listklasser i Java, egen implementering Datastrukturen enkellänkad lista Jämföra element metoden equals, interfacet Comparable Abstrakta

Läs mer

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad F5: Debriefing OU2, repetition av listor, träd och hashtabeller Carl Nettelblad 2017-04-24 Frågor Kommer nog inte att täcka 2 timmar Har ni frågor på OU3, något annat vi har tagit hittills på kursen, listor

Läs mer

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

Föreläsning 7. Träd och binära sökträd Föreläsning 7 Träd och binära sökträd Föreläsning 7 Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning Det är extra mycket

Läs mer

Föreläsning 10 Innehåll

Föreläsning 10 Innehåll Föreläsning 10 Innehåll Hashtabeller implementering, effektivitet Metoden hashcode i Java Abstrakta datatyperna mängd (eng. Set) och lexikon (eng. Map) Interfacen Set och Map i Java Undervisningsmoment:

Läs mer

Föreläsning 2 Innehåll

Föreläsning 2 Innehåll Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga

Läs mer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 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 TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Abstrakta datatyper Listor Stackar

Läs mer

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

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2 Laboration 2 Datastrukturer En liten uppgift Frågor 1 Laboration 2 - Datastrukturer Länkade datastrukturer Stack Kö (En. Queue) Lista

Läs mer

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen Programmeringsteknik II Inledning. Anmälningskod: Tentamen Programmeringsteknik II 2016-01-11 Inledning I bilagan finns ett antal mer eller mindre ofullständiga klasser. Några ingår i en hierarki: List, SortedList, SplayList och ListSet enligt vidstående

Läs mer

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp ArrayList Repetition av OOP- och Javabegrepp En lista i vilken man kan lagra objekt Implementerar List-interfacet Skiljer sig från ett vanligt endimensionellt fält: Dynamisk expanderar när den blir

Läs mer

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund Föreläsning 2 Innehåll Generiska klasser Javas samlingsklasser är generiska. Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element metoden equals En generisk

Läs mer

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 3 Datastrukturer (DAT037) Föreläsning 3 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-07 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat037 Förra

Läs mer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 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 TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Abstrakta datatyper Listor Stackar

Läs mer

Samlingar Collection classes

Samlingar Collection classes Samlingar Collection classes Sven-Olof Nyström Uppsala Universitet 17 mars 2005 Skansholm: Kapitel 9, 19 Se även Suns tutorial om Collections Olika slag av samlingar i Java Arrayer (Till exempel: int[])

Läs mer

Tentamen Programmeringsteknik II och NV2 (alla varianter) 2008-12-10. Skriv bara på framsidan av varje papper.

Tentamen Programmeringsteknik II och NV2 (alla varianter) 2008-12-10. Skriv bara på framsidan av varje papper. Tentamen Programmeringsteknik II och NV2 (alla varianter) 2008-12-10 Skrivtid: 0800-1300 Inga hjälpmedel. Tänk på följande Maximal poäng är 40. För betygen 3 krävs 18 poäng. För betygen 4, 5 kommer något

Läs mer

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Algoritmer & Datastrukturer i Java Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2008-05-27 Skrivtid: 4 timmar Kontakt person: Nicolina Månsson, tel. 035-167487 Poäng / Betyg:

Läs mer

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp ArrayList Repetition av OOP- och Javabegrepp En lista i vilken man kan lagra objekt Implementerar List-interfacet Skiljer sig från ett vanligt endimensionellt fält: Dynamisk expanderar när den blir

Läs mer

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga

Läs mer

Lösningsförslag till exempeltenta 1

Lösningsförslag till exempeltenta 1 Lösningsförslag till exempeltenta 1 1 1. Beskriv hur binärsökning fungerar. Beskriv dess pseudokod och förklara så klart som möjligt hur den fungerar. 2 Uppgift 1 - Lösning Huvudidé: - Titta på datan i

Läs mer

Föreläsning 11 Innehåll

Föreläsning 11 Innehåll Föreläsning 11 Innehåll Hashtabeller implementering, effektivitet Metoden hashcode i Java Abstrakta datatyperna mängd (eng. Set) och lexikon (eng. Map) Interfacen Set och Map i Java Datavetenskap (LTH)

Läs mer

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal) Föreläsning 0 Innehåll Diskutera Hashtabeller implementering, effektivitet Metoden hashcode i Java Abstrakta datatyperna mängd (eng. Set) och lexikon (eng. Map) Interfacen Set och Map ijava Undervisningsmoment:

Läs mer

Tommy Färnqvist, IDA, Linköpings universitet

Tommy Färnqvist, IDA, Linköpings universitet Föreläsning 9 Pekare, länkade noder, länkade listor TDDD86: DALP Utskriftsversion av föreläsning i Datastrukturer, algoritmer och programmeringsparadigm 25 september 2015 Tommy Färnqvist, IDA, Linköpings

Läs mer

Inlämningsuppgift och handledning

Inlämningsuppgift och handledning Inlämningsuppgift och handledning Inlämningsuppgiften redovisas i vecka 49/50. Hög tid att komma igång! Jourtider varje vecka (se http://cs.lth.se/edaa01ht/inlaemningsuppgift) Frågestunder på fredagluncher

Läs mer

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

Föreläsning 1. Abstrakta datatyper, listor och effektivitet Föreläsning 1 Abstrakta datatyper, listor och effektivitet Föreläsning 1 Datastrukturer Abstrakta DataTyper ADT Lista Lista och Java Collections Framework (ArrayList) Lista implementerad med en array Analys

Läs mer

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

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Johan Falkenjack johan.falkenjack@liu.se Linköpings universitet Sweden December 4, 2013 1 Innehåll Arv och andra viktiga begrepp Abstrakta

Läs mer

Föreläsning 3. Stack

Föreläsning 3. Stack Föreläsning 3 Stack Föreläsning 3 ADT Stack Stack JCF Tillämpning Utvärdera ett postfix uttryck Stack implementerad med en array Stack implementerad med en länkad lista Evaluate postfix expressions Läsanvisningar

Läs mer