Föreläsning 12. Söndra och härska

Relevanta dokument
Föreläsning 12. Söndra och härska

Föreläsning 13. Dynamisk programmering

Magnus Nielsen, IDA, Linköpings universitet

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 11. Giriga algoritmer

Föreläsning 13. Dynamisk programmering

Föreläsning 9. Sortering

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Problemlösning och funktioner Grundkurs i programmering med Python

Föreläsning 5: Dynamisk programmering

Föreläsning 11. Giriga algoritmer

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Rekursion. Rekursiv lösningsstrategi. Algoritmkonstruktion. Exempelproblem Hitta största elementet i en sekvens v i där i 1... n.

Rekursion och induktion för algoritmkonstruktion

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

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

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Giriga algoritmer och dynamisk programmering

Rekursion och induktion för algoritmkonstruktion

Algoritmer, datastrukturer och komplexitet

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 8 Innehåll

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

Föreläsning 11 Datastrukturer (DAT037)

Sortering. Intern/ extern? Antaganden. Vad kan vi kräva? Rank sort. Rank sort. På en nod/ distribuerad? Jämförelsebaserad/ icke jämförelsebaserad?

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

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Tentamen TEN1 HI

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

Algoritmer, datastrukturer och komplexitet

Föreläsning 5. Rekursion

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

Uppgift 1 ( Betyg 3 uppgift )

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Datastrukturer och algoritmer

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

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

Tillämpad Programmering (ID1218) :00-13:00

Tentamen Datastrukturer D DAT 035/INN960

Vad har vi pratat om i kursen?

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Rekursion och induktion för algoritmkonstruktion

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Tentamen TEN1 HI

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

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Uppgift 1 ( Betyg 3 uppgift )

Föreläsning 5. Rekursion

Uppgift 1 (grundläggande konstruktioner)

Datastrukturer och algoritmer

Uppgift 1 ( Betyg 3 uppgift )

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

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

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Programkonstruktion och Datastrukturer

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Rekursiva algoritmer sortering sökning mönstermatchning

Vinjetter TDDC91 Datastrukturer och algoritmer

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Sökning och sortering

HI1024 Programmering, grundkurs TEN

Föreläsning Datastrukturer (DAT037)

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

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Konvexa höljet Laboration 6 GruDat, DD1344

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

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Datastrukturer och algoritmer

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Tildatenta Lösningsskiss

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

HI1024 Programmering, grundkurs TEN

Uppgift 1 ( Betyg 3 uppgift )

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

Föreläsning 4: Giriga algoritmer. Giriga algoritmer

Dekomposition och dynamisk programmering

Några svar till TDDC70/91 Datastrukturer och algoritmer

SORTERING OCH SÖKNING

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

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

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

Tentamen Datastrukturer för D2 DAT 035

Sätt att skriva ut binärträd

Transkript:

Föreläsning 12 Söndra och härska

Föreläsning 12 Söndra och härska Maximal delsekvens Skyline Closest pair Växel Uppgifter

Söndra och härska (Divide and conquer) Vi stötte på dessa algoritmer när vi tittade på sortering. Vi ska nu titta på en del andra problem där strategin är effektiv. Låt oss först repetera: En söndra och härska algoritm bryter ner ett problem i två eller fler subproblem av samma (eller närliggande) typ. Dessa i sin tur brytes också ner i två eller fler subproblem. Algoritmen fortsätter så till dess att subproblemen blivit så små att de är lätta att lösa och kombinerar då dellösningarna till en lösning på hela problemet oftast i samma steg som problemet bröts ner. Divide bryt ner problemet i mindre delar Conquer lös varje del (genom att bryta ner ytterligare) Combine kombinera de två lösningarna till en lösning av hela problemet

Maximal delsekvens Givet en sekvens tal (positiva och negativa) söker vi summan av den delsekvens som ger största summan. 24, 35, -87, 21, 80, -12, 32, -90, 45, 10 Hur skulle en söndra och härska algoritm se ut?

Maximal delsekvens söndra och härska Indata: a array med sekvensen Utdata: maximala summan Algoritm maxsum(a,left,right) om left>right return 0 om left=right return max(0,a[left]) center=(left+right)/2 sum=0,maxleft=0 för i=center ner till left sum=sum+a[i] maxleft=max(maxleft,sum) sum=0,maxright=0 största summa över mitten för i=center+1 upp till right sum=sum+a[i] maxright=max(maxright,sum) maxövermitt=maxleft+maxright return max(maxövermitt,maxsum(a,left,center),maxsum(a,center+1,right)

Analys I princip får vi T(n) = 2T(n/2) + n och T(1) = 1 vilket ger O(nlogn) (vilket vi inte visar)

Smartare algoritm Indata: a array med sekvensen (längd n) Utdata: maximala summan Algoritm maxsum(a) maxsumma=0 maxlokal=0 för i = 0 till n-1 maxlokal=max(maxlokal+a[i],0) maxsumma=max(maxlokal,maxsumma) return maxsumma O(n) - något enklare

Skyline - problemet Givet huskroppars koordinater vad blir deras skyline? Det här problemet löses inte bara elegant utan också effektivt med en söndra och härska algoritm. Problemet är generellare än det tycks och handlar om alla problem där man ska optimera utifrån två dimensioner (ex billigast hyra kontra närmast havet) och då vill hitta de kandidater för varje värde på den ena dimensionen är bäst i den andra dimensionen. y y x x

En naiv lösning Vi ska bygga upp en skyline av n stycken hus. Vi gör detta rekursivt genom att lägga till ett hus till en skyline för n-1 hus. Slutvillkoret blir att ta fram en skyline för ett hus vilket är trivialt. Analys Vi kommer att behöva lägga till n-1 hus till en skyline. När vi ska lägga till ett hus kommer vi behöva gå igenom i snitt hälften av punkterna för att hitta rätt platts. Detta ger O(1)+O(2)+ +O(n-2)+O(n-1) = O(n 2 )

Indata och utdata Om vi låter alla hus stå på marken (y=0) behöver vi tre koordinater för att beskriva ett hus (x 1, y, x 2 ). Indata är en array av sådana punkter ordnade efter första x-värdet Om vi börjar i origo kan vi beskriva en skyline med en sekvens av alternerande x- och y-värden där vi börjar med x (eftersom endast en i taget varierar): Utdata: [x1,y1,x2,y2,x3,y3, ] betyder då punkterna (x1,0),(x1,y1),(x2,y1),(x2,y2),(x3,y2),(x3,y3)

Söndra och härska algoritm Dela upp indata i två arrayer med husvärden. Beräkna en skyline för varje del. Detta görs då genom att dela upp indata i två arrayer. Slutvillkoret är att när vi har ett hus levererar vi en skyline. Foga samman dessa två skyline till en. Denna del är den svåraste men är på det stora hela en merge där vi ska ta bort onödiga värden.

Analys I varje steg halverar vi datamängden med uppdelningen. När vi sammanfogar två lösningar går vi igenom antalet punkter och väljer rätt: T(1) = 1 och T(n) = 2T(n/2) + n vilket ger O(nlogn)

Closest pair Givet n punkter i planet ska vi hitta de två som ligger närmast varandra. Brutal kraft beräknar vi för varje punkt avståndet till varje annan punkt och väljer de punkter som har kortast avstånd. Detta ger n(n-1)/2 = O(n 2 ). Hur skulle en söndra och härska algoritm fungera? Vad blir problematiskt.

Naiv: Söndra och härska - algoritm Algoritmen är formulerad så att den endast bestämmer avståndet. Vill man få ut punkterna får man se till att spara detta. Input: a[n] array med punkterna p=(x,y), n antal punkter Sortera punkterna i a efter x-koordinaten d = hittanärmsta(a,0,n-1) hittanärmsta(a,vänster,höger) mitt = (vänster+höger)/2 d = min(hittanärmsta(vänster,mitt),hittanärmsta(mitt+1,höger)) Men kanske närmsta paret har en punkt på varje sida om mitten? Combine delen måste förfinas till att kontrollera punktpar över mitten med potentiellt kortare avstånd än vi fått ovan.

Närmsta par över mitten Om vi skulle kontrollera alla par över mitten skulle vi behöva beräkna (n/2)(n/2) stycken och vi är tillbaka till O(n 2 ). Det behöver vi inte göra. Vi behöver endast kontrollera de punkter som ligger nära mitten: d d d Den svarta linjen beräknas såsom medelvärdet av x-värdena hos punkterna a[mitt] och a[mitt+1]

Bättre Vi skulle fortfarande kunna riskera att få kontrollera många punkter (i värsta fall hälften mot hälften) men med följande tillägg kan man visa att vi behöver kontrollera maximalt sex stycken till varje punkt i intervallet. För varje punkt i intervallet kontrollera avståndet endast mot de punkter som befinner sig maximalt på avståndet d i y- led och avståndet d i x-led. d d Genom att sortera aktuella punkter efter y inom intervallet och genom att använda en effektiv merge kan man få ner algoritmen till O(nlogn) inklusive sortering.

Växlingsproblemet med söndra och härska Vad är det minsta antalet mynt och sedlar som krävs för att ge växel för ett givet belopp? Vår giriga algoritm fungerade inte för godtyckliga valutor. Om man ska designa en algoritm som gör det passar en söndra och härska algoritm mycket bra.

Algoritm Input: belopp kr i växel mynt[n] array med de n olika valörerna växel(belopp) För i = 0 till n-1 Om mynt[i]=belopp return 1 v=belopp För i = 1 till belopp/2 v=min(v,växel(i)+växel(belopp-i)) return v Algoritmen är väl kanske ett bra exempel men inte särskilt effektiv. Med dynamisk programmering kommer vi att kunna effektivisera den.

Uppgifter NB 49 (1p) Skriv ett program som slumpar n stycken heltal mellan -1000 och 1000. Användaren anger n. Programmet beräknar sedan den maximala delsekvenssumman med hjälp av ett funktionsanrop av en funktion som använder en söndra och härska algoritm. Den skriver sedan ut vad summan blev och hur många anrop till funktionen som behövdes.

NB 50 (1p) Skriv en funktion som tar en array med punkter (använd en för att representera en 2D-punkt med float för koordinaterna) och returnerar det kortaste avståndet mellan två punkter. Funktionen ska använda en effektiv söndra och härska algoritm enligt föreläsningen (dvs inte jämföra onödiga punkter över mittlinjen). Skriv också en main som slumpar fram n punkter innanför enhetscirkeln och anropar funktionen med dessa.

NB 51 (1p) a) Skriv ett program som löser det generella växlingsproblemet. Användaren får först ange hur många olika valutor det finns och sedan valören på dessa. Därefter får denne ange vilket belopp som skall växlas och programmet svarar med minsta antalet mynt och sedlar som behövs. b) Lägg till att programmet också skriver ut växeln.

NB 52 (1p) a) Skriv en funktion som löser Skyline-problemet. b) Skriv ett program som slumpar fram n st hus (n anges av användaren) och ritar upp dessa och deras skyline.

NB 53 (1p) Av n elements skall vi ta reda på om det finns mer än n/2 av något och I så fall vilket. Utgå från att elementen kan testas för likhet men inte rangordnas (equal men inte compare). Designa en söndra och härska algoritm som hittar ett sådant elementet i en array om ett sådant finns. Skriv sedan en funktion och en main med några hårdkodade exempel. Sträva efter att få algoritmen så effektiv som möjligt (O(n) är möjligt men O(nlogn) duger).