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 tentamen både programmeringsuppgifter och teoriuppgifter Problem: Givet en vektor a med n tal, tag reda på de k största. Ex: Talen är 4, 1, 9,, 2, 6 och k = 3 ger svaret, 6, 9 Algoritm: Lagra talen i en vektor och sortera dem. Sedan är det enkelt att avläsa de k största: 1, 2, 4,, 6, 9 Välj en lämplig sorteringsalgoritm. Tidskomplexitet? PFK (Föreläsning 13) VT 201 1 / 20 PFK (Föreläsning 13) VT 201 2 / 20 Algoritm 2: Håll reda på de k hittills största Histogramproblemet Gå igenom de n talen och försök hålla reda på de k största bland de tal vi hittills betraktat. Gå igenom k av talen i vektorn a och sätt in dem i R För varje tal t av de övriga (n - k) ur a om t > minsta talet i R tag bort minsta talet ur R sätt in t i R De k största talen finns nu att hämta i R Välj en lämplig datastruktur för R. Tidskomplexitet? Man har n element i en samling. Man vill veta vilka olika element som förekommer och hur många gånger de förekommer. Ex: En text med ord. Vi vill kartlägga vilka ord som förekommer och antal förekomster av resp. ord. Ex: Vi har ett register över hela befolkningen. Vi vill ta reda på vilka olika förnamn som förekommer och hur många som har dessa namn. Ex: Kasta tärning många gånger. Hur många 1:or, 2:or...? Namnet på problemet beror på att man kan presentera resultatet i form av ett histogram om man vill. Se nästa bild. PFK (Föreläsning 13) VT 201 3 / 20 PFK (Föreläsning 13) VT 201 4 / 20
Histogramproblemet Exempel: kasta tärning En tärning kastades 10 gånger: {4, 2, 3, 2, 4, 2, 2, 6, 2,4} Resultat som en lista av par (element,frekvens): (2,) (3,1) (4,3) (6,1) Resultat som histogram: frekvens 4 3 2 1 Histogramproblemet lösning för ett specialfall Specialfall: elementen är heltal i ett begränsat intervall 0..s. skapa en heltalsvektor a av storlek s + 1; för vart och ett av elementen e: a[e]++; a 0 1 2 3 4 6 0 0 1 3 0 1 1 2 3 4 6 element PFK (Föreläsning 13) VT 201 / 20 PFK (Föreläsning 13) VT 201 6 / 20 Histogramproblemet generell lösning Histogramproblemet generell lösning Lösning Iexempletmedtärningskastvardetenkeltattmappaetttärningskastmed ett index i vektorn. Antal 1:or lagras i a[1], antal 2:or i a[2] osv. Men elementen kan ha godtycklig typ, t.ex. typen String om det är namn som räknas. Hur ska vi göra i så fall? Algoritm 1: Sortera elementen element som är lika hamnar då intill varandra Iterera genom den sorterade samlingen och räkna frekvenser Algoritm 2: Använd en map, t.ex. HashMap. Hur ska mappen användas? PFK (Föreläsning 13) VT 201 7 / 20 PFK (Föreläsning 13) VT 201 8 / 20
Problemexempel: schemaläggning av maskiner Schemaläggning av maskiner Vi har m identiska maskiner och n jobb att utföra. Tiden för att utföra jobb i är t i. En maskin kan bara göra ett jobb i taget. Ett enskilt jobb kan inte delas mellan olika maskiner. Ett jobb som en maskin börjat utföra görs färdigt utan avbrott. Hur ska jobben allokeras till maskinerna för att tiden det tar att slutföra alla jobb ska bli så kort som möjligt? Man känner inte till någon effektiv algoritm som löser problemet: Att prova alla möjligheter går men kostar exponentiell exekveringstid. Approximativa algoritmer måste användas i praktiken för stora probleminstanser. En sådan är Longest Processing Time first. PFK (Föreläsning 13) VT 201 9 / 20 PFK (Föreläsning 13) VT 201 10 / 20 Jobben allokeras till maskiner efter avtagande tidsåtgång. Jobbet allokeras till den maskin som har minst att göra (blir ledig tidigast). Ger inte alltid den optimala lösningen Ex: 2 maskiner och jobb med tidskrav 6, 6,,,. Total tidsåtgång för att avsluta alla jobb blir 16: Ex: 3 maskiner M 1..M 3 och 7 jobb j 1..j 7 med tidsåtgång 2, 14, 4, 16, 6,, 3. M 1 16 ( j 4 ) M 2 M 3 14 ( j ) 2 3 ( j ) 7 6 ( j ) ( j 6 ) 4 ( j 3 ) 2 ( j 1 ) Total tidsåtgång för att avsluta alla jobb: 17 M 1 6 M 2 6 Men bättre lösning finns tidsåtgång 1: M 1 M 2 6 6 PFK (Föreläsning 13) VT 201 11 / 20 PFK (Föreläsning 13) VT 201 12 / 20
Implementering Man kan implementera med hjälp av prioritetskö. Maskinerna sätts in i prioritetskön. Maskinerna innehåller attributet prio = sammanlagda tiden för maskinens jobb (= tidpunkt då maskinen blir ledig). Alla maskiner är från början lediga. De har då prioritet = 0. Givet en vektor t med n element, där t[i] =tidsåtgångförjobbi. sortera vektorn t i avtagande ordning skapa en prioritetskö q låt alla maskiner få prioritet 0 och sätt in dem i q för i = 0..n-1 Machine m = q.poll(); m.prio = m.prio + t[i]; q.offer(m); Fallet antal jobb apple antal maskiner Ispecialfalletantaljobbapple antal maskiner (n apple m) kanalgoritmen förenklas: Alla jobb kan då sättas igång samtidigt på var sin maskin. Det blir det längsta jobbet som bestämmer tidsåtgången. Vi behöver alltså bara söka maximum av elementen i vektorn t. PFK (Föreläsning 13) VT 201 13 / 20 PFK (Föreläsning 13) VT 201 14 / 20 tidskomplexitet Allmänna fallet Vi antar att antal jobb > antal maskiner (n > m). Sortera jobben efter avtagande tidsåtgång kostar O(n log n) med en effektiv metod Bygga en heap och sätta in de m maskinerna kostar O(m) eftersom alla maskinernas prioritet är lika initialt poll n gånger och offer n gånger i heapen av storlek m kostnad O(n log m) Totalt: O(n log n) Abstrakt datatyp (ADT) En abstrakt modell tillsammans med de operationer man kan utföra på den. Ex: lista, stack, kö, mängd, lexikon (Eng. map), prioritetskö Datastruktur En samling variabler som hör ihop på något sätt. Ex: vektor, enkellänkad lista, balanserat binärt sökträd, hashtabell, heap Den abstrakta datatypen lexikon beskriver en samling nyckel-värdepar där nycklarna är unika. Viktiga operationer är insättning, sökning, borttagning. Lexikon kan effektivt implementeras med hjälp av ett balanserat binärt sökträd eller en hashtabell. Exempel på klasser i Java.util är TreeMap och HashMap. PFK (Föreläsning 13) VT 201 1 / 20 PFK (Föreläsning 13) VT 201 16 / 20
Skugga equals Implementera Comparable eller Comparator Inuti Javas samlingsklasser måste ibland element jämföras. Det ställer krav på den klass som beskriver de element som ska sättas in i samlingen. Exempel: Antag att vi skrivit en klass Book där två Book-objekt med samma isbn-nummer ska betraktas som lika. public class Book { Om vi sätter in Book-objekt i en lista av typen ArrayList<Book> eller LinkedList<Book> måste equals skuggas i klassen Book. Annars fungerar inte metoderna contains, remove,... som avsett. Ivissasammanhangjämförsomettelementärmindreän,likamed,större än ett annat. Detta görs i klasser med binära sökträd (TreeSet<Book>, TreeMap<Book,...>) ellerheapar(priorityqueueu<book>) samtvid sortering. Låt klassen Book implementera interfacet Comparable. public class Book implements Comparable<Book> { private int compareto(book other) {...} eller om det inte är lämpligt skriv en klass som implementerar interfacet Comparator. PFK (Föreläsning 13) VT 201 17 / 20 PFK (Föreläsning 13) VT 201 18 / 20 Skugga hashcode och equals I Javas klasser med hashtabeller används metoden hashcode (för att hitta rätt plats i vektorn) samt equals (för att söka efter en nyckel bland element med lika hashkod). Om man sätter in Book-objekt i en mängd av typen HashSet<Book> eller har nycklar av typen Book i en HashMap<Book,...>) så måste både hashcode och equals skuggas i klassen Book. public class Book { public int hashcode() {...} public boolean equals(object other) {...} Övrigt Förutom det som repeteras på föregående sidor har vi bland annat sysslat med Interface Exceptions Generiska klasser och metoder Tidskomplexitet Rekursion Grafiska användargränssnitt (kommer inte på tentan :) ) Sortering PFK (Föreläsning 13) VT 201 19 / 20 PFK (Föreläsning 13) VT 201 20 / 20