ID1020: Quicksort. Dr. Jim Dowling jdowling@kth.se. kap 2.3. Slides adapted from Algoritms 4 th Edition, Sedgewick.

Relevanta dokument
ID1020: Mergesort. Dr. Jim Dowling kap 2.2. Slides adapted from Algoritms 4 th Edition, Sedgewick.

ID1020:Enkel Sortering

Föreläsning 11 Datastrukturer (DAT037)

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

SORTERING OCH SÖKNING

Föreläsning 9. Sortering

Föreläsning 11 Innehåll

Magnus Nielsen, IDA, Linköpings universitet

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Föreläsning 12 Innehåll

Sökning och sortering

Föreläsning 12 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

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

Datastrukturer D. Föreläsning 2

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

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

Föreläsning 5 Innehåll

Kapitel 7: Analys av sorteringsalgoritmer

Tentamen: Programutveckling ht 2015

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

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

Föreläsning 4: Kombinatorisk sökning

Tommy Färnqvist, IDA, Linköpings universitet

Dugga Datastrukturer (DAT036)

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

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

Tentamen Datastrukturer D DAT 036/DIT960

Sätt att skriva ut binärträd

Tentamen i Algoritmer & Datastrukturer i Java

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

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

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

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

Datastrukturer. föreläsning 2

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 27 maj 2008

Algoritmer. Två gränssnitt

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

Föreläsning 2 Datastrukturer (DAT037)

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

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

Tentamen Datastrukturer (DAT037)

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

Datastrukturer och algoritmer

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

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

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

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

FÖRELÄSNING 12 DATALOGI I

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

Objektorienterad programmering D2

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

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

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

Föreläsning 1, vecka 7: Rekursion

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

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

ID1020: Union-Find. Dr. Jim Dowling kap Slides adapted from Algorithms 4 th Edition, Sedgewick.

Tentamen Datastrukturer D DAT 036/INN960

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Föreläsning 13 Datastrukturer (DAT037)

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

OOP Objekt-orienterad programmering

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

Seminarium 13 Innehåll

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Föreläsning Datastrukturer (DAT036)

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning 10. ADT:er och datastrukturer

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

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

F13. Läsanvisning: kap 8 mer sortering. topologisk sortering

Rekursion. Koffman & Wolfgang kapitel 5

Föreläsning REPETITION & EXTENTA

Föreläsning Datastrukturer (DAT037)

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

Föreläsning 13 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Objektorienterad programmering i Java

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

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

Tentamen Datastrukturer D DAT 036/INN960

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 5. Rekursion

SMD 134 Objektorienterad programmering

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 11: Rekursion

Tentamen, EDAA20/EDA501 Programmering

Påminnelse: en datatyp för bilder. Programmering. En datatyp för bilder. Spegelbild. hh.se/db2004

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

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

Rekursion och induktion för algoritmkonstruktion

Föreläsning 6: Introduktion av listor

Föreläsning 13. Rekursion

Tentamen Datastrukturer (DAT036)

Föreläsning 9 Datastrukturer (DAT037)

Några saker till och lite om snabbare sortering

Arrayer (fält)

Transkript:

ID1020: Quicksort Dr. Jim Dowling jdowling@kth.se kap 2.3 Slides adapted from Algoritms 4 th Edition, Sedgewick.

Quicksort Grundläggande metod. - Blanda array:n. - Partitioner så att för något värde j element a[j] är på rätt plats inget element som är större ligger till vänster om j inget element som är mindre ligger till höger j - Sortera alla subarrayer rekursivt. 2

Tony Hoare - Hoare uppfann quicksort för att översätta från ryska till engleska. - Implementerade för första gången i Algol 60 (med rekursion). Tony Hoare 1980 Turing Award Communications of the ACM (July 1961) There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult. 3

Quicksort partitioning demo Upprepa tills i och j pekarna korsar varandra. - Skanna i från vänster till höger så länge (a[i] < a[lo]). - Skanna j från höger till vänster så länge (a[j] > a[lo]). - Swappa a[i] med a[j]. K R A T E L E P U I M Q C X O S lo i j 4

Quicksort partitioning demo Upprepa tills i och j pekarna korsar varandra. - Skanna i från vänster till höger så länge (a[i] < a[lo]). - Skanna j från höger till vänster så länge (a[j] > a[lo]). - Swappa a[i] med a[j]. När pekarna korsar. - Swappa a[lo] med a[j]. E C A I E K L P U T M Q R X O S lo j hi partitioned! 5

Quicksort: Java kod för partitionering private static int partition(comparable[] a, int lo, int hi) { int i = lo, j = hi+1; while (true) { while (less(a[++i], a[lo])) if (i == hi) break; while (less(a[lo], a[--j])) if (j == lo) break; hitta elementet på västra sidan som ska swappas hitta elementet på högra sidan som ska swappas } if (i >= j) break; exch(a, i, j); kontrollera om pekarna korsar swappa } exch(a, lo, j); return j; swappa med partitioneringselement returnera indexet av elementet som vi nu vet är på rätt plats 6

Quicksort partitionering trace 7

Quicksort: Java implementation public class Quick { private static int partition(comparable[] a, int lo, int hi) { /* see previous slide */ } public static void sort(comparable[] a) { StdRandom.shuffle(a); sort(a, 0, a.length - 1); } blandning behövs för prestandagarantier } private static void sort(comparable[] a, int lo, int hi) { if (hi <= lo) return; int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); } 8

Quicksort trace

Quicksort animation 50 poster i slumpmässiga ordning http://www.sorting-algoritms.com/quick-sort algoritm position i ordning nuvarande subarray inte i ordning 10

Quicksort: implementation detaljer Partitionering in-place (på plats). Om vi använder en extra, partitioneringen blir lättare (och stabil), men det är inte värt kostnaden. Att sluta iterera (loopa). Att kontrollera när pekarna korsar är svårare än vad man tror. Duplikat (lika) nycklar. När det finns duplikat nycklar, är det (kontraintuitivt) bättre att sluta skanna på nycklar som är lika partitioneringselementets nyckel. Bevara randomiseringen. Vi behöver blanda array:n för att kunna ge prestandagarantier. Ett ekvivalent alternativ. Välj ett slump partitioneringselement i alla subarrayer. 11

Quicksort: empirisk analys (1961) Körtids- mätningar och -estimeringar: - Algol 60 implementation. - National-Elliott 405 dator. sorting N 6-word items with 1-word keys Elliott 405 magnetic disc (16K words) 12

Quicksort: empirisk analys Uppskattningar av körtider: - Home PC exekverar 10 8 jämförelser/sekund. - Supercomputer exekverar 10 12 jämförelser/sekund. insertion sort (N 2 ) mergesort (N log N) quicksort (N log N) computer thousand million billion thousand million billion thousand million billion home instant 2.8 hours 317 years instant 1 second 18 min instant 0.6 sec 12 min super instant 1 second 1 week instant instant instant instant instant instant Läxa 1. Bra algoritmer är bättre än supercomputers. Läxa 2. Framstående algoritmer är bättre än bra algoritmer. 13

Quicksort: best-case analys Best case. Antalet jämförelser är ~ N lg N. input värden blanda värden 14

Quicksort: worst-case analys Worst case. Antalet jämförelser är ~ ½ N 2. initial values random shuffle 15

Quicksort: average-case analys (förväntad exekveringstid) Sats. Medelantalet jämförelser C N för att köra quicksort på en array med N unika nycklar är ~ 2N ln N (antalet byten är ~ ⅓ N ln N ). Bevis. C N satisfierar rekurrensrelationen C 0 = C 1 = 0 och for N 2: partitionering vänster höger - Multiplicera båda sidor med N och samla termerna: partitioneringssannolikhet - Ta bort från denna ekvation samma ekvation för N - 1 fallet: - Flyttar runt termerna och dividera med N (N + 1): 16

Quicksort: average-case analys - Upprepa att applicera ekvationen ovan: föregående ekvation subsituera föregående ekvation - Approximera summan med hjälp av en integral: - Slutligen, önskade resultatet är: 17

Quicksort: sammanfattning av prestandaegenskaper Quicksort är en randomiserad algoritm. - Det finns en garanti för korrekthet. - Körtiden beror på slump blandningen. Average case. Förväntade antal jämförelser är ~ 1.39 N lg N. - 39% mer jämförelser än mergesort. - Snabbare än mergesort i praktiken för att man kopierar mindre mängder av data. Best case. Antalet jämförelser är ~ N lg N. Worst case. Antalet jämförelser är ~ ½ N 2.

Quicksort egenskaper Sats. Quicksort är en in-place (på plats) sorteringsalgoritm. Bevis. - Partitionering: konstant extra plats. - Djupet av rekursion: logaritmisk extra plats (med hög sannolikhet). Sats. Quicksort är inte stabil. Bevis genom motexempel. i j 0 1 2 3 B1 C1 C2 A1 1 3 B1 C1 C2 A1 1 3 B1 A1 C2 C1 0 1 A1 B1 C2 C1 1

Quicksort: förbättringar Insertion sort på små subarrayer. - T.o.m. quicksort har för mycket overhead för mycket små subarrayer. - Brytpunkt till insertion sort för 10 element. private static void sort(comparable[] a, int lo, int hi) { if (hi <= lo + CUTOFF - 1) { Insertion.sort(a, lo, hi); return; } int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); } 2

Quicksort: förbättringar Median av ett stickprov. - Bäst val av partitioneringselement = median. - Approximera riktiga medianen genom att beräkna medianen av stickprovet. - Median-av-3 (slumpmässiga valde) element. ~ 12/7 N ln N jämförelser(14% mindre) ~ 12/35 N ln N byten (3% mer) private static void sort(comparable[] a, int lo, int hi) { if (hi <= lo) return; int median = medianof3(a, lo, lo + (hi - lo)/2, hi); swap(a, lo, median); } int j = partition(a, lo, hi); sort(a, lo, j-1); sort(a, j+1, hi); 2

Duplikat nycklar Ofta, syftet med sortering är att samla ihop element med samma nycklar. - Sortera befolkningen efter ålder. - Ta bort duplikat från en e-postlista. - Sortera jobbansökan efter sökandens högskolebetyg. Vanliga egenskaper av sådana applikationer. - Enorm array. - Ett få antal nycklar. nyckel 2

Quicksort med duplikat nycklar

Element med samma nyckeln (duplicate keys) Quicksort med duplikat nycklar. Algoritmen kan ta kvadratisk tid om inte partitioneringen slutar när man jämför lika nycklar! S T O P O N E Q U A L K E Y S swap om vi inte slutar vid lika nycklar om vi slutar vid lika nycklar Vissa implementationer (både i böcker och i industri) tar kvadratisk tid när indata innehåller många element med samma nyckeln. 2

Partitioneringselementet när vi partitionerar med duplikat Vad hamnar partitioneringselementet när vi partitionerar array:n nedan med Quicksort? A A A A A A A A A A A A A A A A A. A A A A A A A A A A A A A A A A B. A A A A A A A A A A A A A A A A C. A A A A A A A A A A A A A A A A 2

Att partitionera en array med bara lika nycklar 2

Duplikat nycklar: problemet Recommenderad. Sluta skanna vid element lika med partitioneringselementet. Resultat. ~ N lg N compares when all keys equal. B A A B A B C C B C B A A A A A A A A A A A Misstag. Fortsätta skanna även om man ser element som är lika partitioneringselementet. Resultat. ~ ½ N 2 jämförelser när alla nycklar är lika. B A A B A B B B C C C A A A A A A A A A A A Mål. Lägg alla element som är lika partitioneringselementet på rätt plats. A A A B B B B B C C C A A A A A A A A A A A 2

3-väggs partitionering Mål. Partitionera array:n i tre lika stora delar så att: - Elementet mellan lt och gt är likt partitioneringselementet. - Inga element som är större ligger till vänster om lt. - Inga element som är mindre ligger till höger om gt. 2

Dijkstra 3-väggs partitionering - Låt v vara partitioneringselementet a[lo]. - Skanna med i från vänster till höger. (a[i] < v): byt a[lt] med a[i]; inkrementera både lt och i (a[i] > v): byt a[gt] with a[i]; dekrementera gt (a[i] == v): inkrementera i lt i gt P A B X W P P V P D P C Y Z lo hi invariant 3

Dijkstra 3-väggs partitioning demo - Låt v vara partitioneringselementet a[lo]. - Skanna med i från vänster till höger. (a[i] < v): byt a[lt] med a[i]; inkrementera både lt och i (a[i] > v): byt a[gt] with a[i]; dekrementera gt (a[i] == v): inkrementera i lt gt A B C D P P P P P V W Y Z X lo hi invariant 3

Dijkstra's 3-väggs partitioning: trace 3

3-väggs quicksort: Java implementation private static void sort(comparable[] a, int lo, int hi) { if (hi <= lo) return; int lt = lo, gt = hi; Comparable v = a[lo]; int i = lo; while (i <= gt) { int cmp = a[i].compareto(v); if (cmp < 0) exch(a, lt++, i++); else if (cmp > 0) exch(a, i, gt--); else i++; } } sort(a, lo, lt - 1); sort(a, gt + 1, hi); 3

3-väggs quicksort: visual trace 3

Duplikat nycklar: lägre gräns Sortering lägre gräns. Om det finns n unika nycklar och elementet i har xi duplikat, alla jämförelse-baserade sorteringsalgoritmer behöver minst N lg N när alla nycklar är unika; Linjärtid när det finns bara ett konstant antal unika nycklar. jämförelser i värsta fallet. proportionellt mot lägre gränsen Sats. [Sedgewick-Bentley 1997] Quicksort med 3-väggs partitionering är entropy-optimal. Bevis. [inte i kursens omfattning] Slutsats. Quicksort med 3-väggs partitionering reducerar körtiden från linearithmic till linjär för många applikationer. 3

Sortering sammanfattning inplace? stable? best average worst remarks selection ½ N 2 ½ N 2 ½ N 2 N exchanges insertion N ¼ N 2 ½ N 2 use for small N or partially ordered shell N log3 N? c N 3/2 tight code; subquadratic merge ½ N lg N N lg N N lg N N log N guarantee; stable quicksort N lg N 2 N ln N ½ N 2 N log N probabilistic guarantee; fastest in practice 3-väggs quicksort N 2 N ln N ½ N 2 improves quicksort when duplicate keys? N N lg N N lg N holy sorting grail 3

Vilken sorteringsalgoritmen ska man använda? Det finns många (andra) sorteringsalgoritmer att välja mellan: sorts algoritms elementary sorts insertion sort, selection sort, bubblesort, shaker sort,... subquadratic sorts quicksort, mergesort, heapsort, shellsort, samplesort,... system sorts dual-pivot quicksort, timsort, introsort,... external sorts Poly-phase mergesort, cascade-merge, psort,. radix sorts MSD, LSD, 3-way radix quicksort, parallel sorts bitonic sort, odd-even sort, smooth sort, GPUsort,... 3

Vilken sorteringsalgoritmen ska man använda? Applikationer har olika krav: - Stabil? - Parallel? - In-place? - Deterministisk? - Duplikat nycklar? - Olika typer av nycklar? - Länkadlista eller array? - Stor eller små element? - Finns array:n i slumpmässig ordning? - Prestandagarantier? Är system sort bra nog i vanliga fall? Ja, det brukar vara snabb nog. 3

System sortering i Java 7 Arrays.sort(). - har en metod för objekt som är Comparable. - har en överlagrad metod för alla primitiva typer. - har en överlagrad metod för använda med en Comparator. - har överlagrada metoder för att sortera subarrayer. Algoritmer. - Dual-pivot quicksort för primitiva typer. - Timsort (mergesort variant) för referenstyper. Varför använder man olika algoritmer beroende på om objekt är primitiva eller referens typer? 3