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

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 13. Dynamisk programmering

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

Föreläsning 11. Giriga algoritmer

Föreläsning 5: Dynamisk programmering

Föreläsning 11. Giriga algoritmer

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

Föreläsning 9. Sortering

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.

Problemlösning och funktioner Grundkurs i programmering med Python

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

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.

Tommy Färnqvist, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

Giriga algoritmer och dynamisk programmering

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

Föreläsning 11 Datastrukturer (DAT037)

Algoritmer, datastrukturer och komplexitet

Föreläsning 8 Innehåll

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

Rekursion och induktion för algoritmkonstruktion

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

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

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

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

Rekursion och induktion för algoritmkonstruktion

Datastrukturer och algoritmer

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

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 4: Giriga algoritmer. Giriga algoritmer

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Tentamen TEN1 HI

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

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

Översikt. Effektiva algoritmer. En telefonlista. Algoritm

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

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

Vad har vi pratat om i kursen?

Vinjetter TDDC91 Datastrukturer och algoritmer

Föreläsning Datastrukturer (DAT037)

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

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

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

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

Datastrukturer och algoritmer

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

Tildatenta Lösningsskiss

Uppgift 1 ( Betyg 3 uppgift )

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

Dekomposition och dynamisk programmering

Uppgift 1 ( Betyg 3 uppgift )

Några svar till TDDC70/91 Datastrukturer och algoritmer

Rekursion och induktion för algoritmkonstruktion

Datastrukturer och algoritmer

Föreläsning 5. Rekursion

Föreläsning 13 Datastrukturer (DAT037)

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

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

Tentamen Datastrukturer D DAT 035/INN960

Datastrukturer och algoritmer

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

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

Grundläggande datalogi - Övning 3

Asymptotisk komplexitetsanalys

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

Rekursiva algoritmer sortering sökning mönstermatchning

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

Uppgift 1 (grundläggande konstruktioner)

UPPGIFT 1 KANINER. Håkan Strömberg 1 Pär Söderhjelm

Föreläsning 1. Introduktion. Vad är en algoritm?

Tentamen Datastrukturer D DAT 036/INN960

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

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

Föreläsning 11: Beräkningsgeometri

Sökning och sortering

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

Tommy Färnqvist, IDA, Linköpings universitet

Spektrala Transformer

Tentamen Datastrukturer D DAT 036/INN960

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

Konvexa höljet Laboration 6 GruDat, DD1344

Föreläsning 5: Grafer Del 1

Föreläsningsanteckningar F6

Algoritmer, datastrukturer och komplexitet

Lösningar Datastrukturer TDA

Tentamen i EDAF05 Algoritmer, datastrukturer och komplexitet

Föreläsning 12+13: Approximationsalgoritmer

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

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

TATM79: Föreläsning 2 Absolutbelopp, summor och binomialkoefficienter

Dynamisk programmering

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

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 dellö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. Med 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 och anropa d = hittanärmsta(a,0,n-1) hittanärmsta(a,vänster,höger) mitt = (vänster+höger)/2 return 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.