Tommy Färnqvist, IDA, Linköpings universitet

Relevanta dokument
Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 11 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet. 1 Sortering Heap-sort Merge-sort Sammanfattning... 10

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

Föreläsning 11 Innehåll

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

Algoritmer, datastrukturer och komplexitet

Några svar till TDDC70/91 Datastrukturer och algoritmer

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 9. Sortering

Föreläsning 12 Innehåll

Tommy Färnqvist, IDA, Linköpings universitet

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

Algoritmer, datastrukturer och komplexitet

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

Föreläsning 12 Innehåll

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

Sökning och sortering

Tommy Färnqvist, IDA, Linköpings universitet

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

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

SORTERING OCH SÖKNING

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

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

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Vad har vi pratat om i kursen?

Lösningar Datastrukturer TDA

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

Träd Hierarkiska strukturer

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

Föreläsning Datastrukturer (DAT037)

Teoretisk del. Facit Tentamen TDDC (6)

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

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

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

Teoretisk del. Facit Tentamen TDDC (6)

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

Rekursion och induktion för algoritmkonstruktion

Föreläsning 4 Datastrukturer (DAT037)

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 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Algoritmer, datastrukturer och komplexitet

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

TDDI16 Datastrukturer och algoritmer Övningsuppgifter hösten 2014

Föreläsning 5 Innehåll

Datastrukturer och algoritmer

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

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Linjär sökning. Föreläsning 12. Binär sökning. Exempel: Binära sökträd. Binärt sökträd

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

Föreläsning 13 Innehåll

Föreläsning 5 Datastrukturer (DAT037)

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 5: Dynamisk programmering

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

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

Algoritmer och datastrukturer TDA143

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning 6. Sökträd: AVL-träd, Multi-Way -sökträd, B-träd TDDC70/91: DALG. Innehåll. Innehåll. 1 AVL-träd

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Tentamen Datastrukturer D DAT 036/INN960

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

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

Seminarium 13 Innehåll

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

Datastrukturer D. Föreläsning 2

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer för D2 DAT 035

Föreläsning 5 TDDC91,TDDE22,725G97: DALG. Föreläsning i Datastrukturer och algoritmer 18 september 2018

Lösning av några vanliga rekurrensekvationer

TDDC70/TDDC91 Datastrukturer och algoritmer Övningsuppgifter hösten 2013

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

Rekursion och induktion för algoritmkonstruktion

Exempeltentafrågor i TDDD86 Datastrukturer, algoritmer och programmeringsparadigm

Föreläsning 10 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

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

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

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.

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Föreläsning 13. Rekursion

Asymptotisk komplexitetsanalys

Kapitel 7: Analys av sorteringsalgoritmer

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Tentamen Datastrukturer D DAT 035/INN960

Rekursion och induktion för algoritmkonstruktion

TDDC91 & TDDE22 & 725G97 Datastrukturer och algoritmer Datortentamen (DAT1) , 08 12

Föreläsning 13 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Transkript:

Föreläsning 8 Sortering och urval TDDC70/91: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 1 oktober 2013 Tommy Färnqvist, IDA, Linköpings universitet 8.1 Innehåll Innehåll 1 Sortering 1 1.1 Introduktion.......................................... 1 1.2 Insättningssortering...................................... 2 1.3 Urvalssortering........................................ 2 1.4 Divide-and-conquer...................................... 3 1.5 Quick-sort........................................... 4 2 Urval 10 2.1 Introduktion.......................................... 10 2.2 Quick-select.......................................... 10 8.2 1 Sortering 1.1 Introduktion Sorteringsproblemet Indata: En lista L innehållande data med nycklar från en linjärt ordnad mängd K Utdata: En lista L innehållande samma data sorterat i stigande ordning m.a.p. nycklarna Exempel [8,2,9,4,6,10,1,4] [1,2,4,4,6,8,9,10] Aspekter på sortering in-place vs använda extra minne internt vs externt minne stabil vs icke stabil jämförelsebaserad vs digital 8.3 8.4 Strategier Sortering genom insättning Titta efter rätt plats att sätta in varje nytt element som ska läggas till i den sorterade sekvensen... linjär insättning, Shell-sort,... Sortering genom urval Sök i varje iteration i den osorterade sekvensen efter det minsta kvarvarande datat och lägg det till slutet av den sorterade sekvensen... rakt urval, Heap-sort,... Sortering genom platsbyten Sök fram och tillbaka i något mönster och byt plats på par i fel inbördes ordning så fort ett sådant upptäcks... Quick-sort, Merge-sort,... 8.5 1

1.2 Insättningssortering (Linjär) insättningssortering Algoritmen är in-place! Dela arrayen som ska sorteras A[0,...,n 1] i två delar A[0,...,i 1] som är sorterad A[i,...,n 1] ej ännu sorterad Initialt är i = 1, i vilket fall A[0,...,0] (trivialt) är sorterad procedure INSERTIONSORT(A[0,...,n 1]) for i = 1 to n 1 do sätt in A[i] i rätt (=sorterad) position i A[0,...,i 1] 8.6 Exempel: Visualisering av Insertion-sort 1 2 3 4 8.7 Värstafallsanalys av Insertion-sort 1: procedure INSERTIONSORT(A[0,...,n 1]) 2: for i = 1 to n 1 do 3: j i; x A[i] 4: while j 1 and A[ j 1] > x do 5: A[ j] A[ j 1]; j j 1 6: A[ j] x t 2 : n 1 pass t 3 : n 1 pass t 4 : Låt I vara antalet iterationer i värsta fallet av innerloopen: I = 1 + 2 +... + (n 1) = n(n 1)/2 = (n 2 n)/2 t 5 : I pass t 6 : n 1 pass Totalt: t 2 +t 3 +t 4 +t 5 +t 6 = 3(n 1)+(n 2 n) = n 2 +2n 3 Alltså O(n 2 ) i värsta fallet... men bra om sekvensen nästan sorterad 8.8 1.3 Urvalssortering (Rak) urvalssortering Algoritmen är in-place! Dela arrayen som ska sorteras A[0,...,n 1] i två delar A[0,..., i 1] som är sorterad (alla element mindre än eller lika med A[i,..., n 1]) A[i,...,n 1] ej ännu sorterad Initialt är i = 0, d.v.s. den sorterade delen är tom (och trivialt sorterad) procedure SELECTIONSORT(A[0,...,n 1]) for i = 0 to n 2 do hitta ett minimalt element A[ j] i A[i,...,n 1] byt plats på A[i] och A[ j] 8.9 2

Exempel: Visualisering av Selection-sort 1 2 3 4 8.10 Värstafallsanalys av Selection-sort 1: procedure SELECTIONSORT(A[0,...,n 1]) 2: for i = 0 to n 2 do 3: s i 4: for j i + 1 to n 1 do 5: if A[ j] < A[s] then s j 6: SWAP(A[i], A[s]) t 2 : n 1 pass t 3 : n 1 pass t 4 : Låt I vara antalet iterationer i värsta fallet av innerloopen: I = (n 2) + (n 3) +... + 1 = (n 1)(n 2)/2 = (n 2 3n + 2)/2 t 5 : I pass t 6 : n 1 pass Totalt: t 2 +t 3 +t 4 +t 5 +t 6 = 3(n 1) + (n 2 3n + 2) = n 2 1 O(n 2 ) 8.11 1.4 Divide-and-conquer Principen söndra-och-härska för algoritmkonstruktion söndra: dela upp problemet i mindre, oberoende, delproblem härska: lös delproblemen rekursivt (eller direkt om trivialt) kombinera lösningarna till delproblemen till en lösning till ursprungsproblemet Eng. divide-and-conquer 8.12 Exempel: Söndra-och-härska 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 10 6 8 12 7 9 1 5 8 13 2 5 16 20 3 4 10 6 8 7 12 1 9 5 8 2 13 5 16 3 20 4 6 8 10 1 7 9 12 2 5 8 13 3 5 1620 1 4 6 7 8 9 1012 2 3 5 5 8 131620 1 2 3 4 5 5 6 7 8 8 9 1012131620 8.13 3

Exempel: Söndra-och-härska 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 6 7 1 5 2 5 3 10 8 12 9 8 131620 4 1 2 3 6 7 5 5 10 8 9 8 12131620 1 2 4 3 5 5 6 7 8 8 10 9 1213 1620 1 2 3 4 5 5 6 7 8 8 9 10 1213 1620 1 2 3 4 5 5 6 7 8 8 9 10 12131620 1 2 3 4 5 5 6 7 8 8 9 1012131620 1 2 3 4 5 5 6 7 8 8 9 1012131620 8.14 1.5 Quick-sort Quick-sort Quick-sort är en randomiserad sorteringsalgoritm baserad på paradigmet söndra-och-härska söndra: välj slumpvist ett element x (kallat pivot) och partitionera S till L element mindre än x E element lika med x G element större än x härska: sortera L och G kombinera L, E och G x x L E G x 8.15 Partitionering Vi partitionerar indata-sekvensen på följande vis: Vi tar bort, i tur och ordning, varje element y från S och Vi sätter in y i L, E eller G beroende på resultatet av jämförelsen med pivotelementet x Varje insättning och borttagning är i början eller slutet av en sekvens och tar alltså O(1) tid Alltså tar partitionerings-steget i quick-sort O(n) tid function PARTITION(S, p) L, E, G tomma sekvenser x S.REMOVE(p) while S.ISEMPTY() do y S.REMOVE(S.FIRST()) if y < x then L.INSERTLAST(y) else if y = x then E.INSERTLAST(y) else G.INSERTLAST(y) return L, E, G 8.16 4

Quick-sortträdet Exekveringen av quick-sort kan visualiseras som ett binärt träd Varje nod representerar ett rekursivt anrop till quick-sort och lagrar Osorterad sekvens före exekveringen och dess pivot Sorterad sekvens efter exekveringen Roten är ursprungsanropet Löven är anrop på delsekvenser av storlek 0 eller 1 7 4 9 6 2 2 4 6 7 9 4 2 2 4 7 9 7 9 2 2 9 9 8.17 Exempel: Exekvering av quick-sort Val av pivot 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 7 2 9 4 2 4 7 9 3 8 6 1 1 3 8 6 2 2 9 4 4 9 3 8 8 8.18 Exempel: Exekvering av quick-sort Partitionering, rekursivt anrop, val av pivot 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 2 4 7 9 3 8 6 1 1 3 8 6 2 2 9 3 8 8 8.19 5

Exempel: Exekvering av quick-sort Partitionering, rekursivt anrop, basfall 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 2 4 7 3 8 6 1 1 3 8 6 1 1 3 8 8 8.20 Exempel: Exekvering av quick-sort Rekursivt anrop,..., basfall, kombinera 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 1 2 3 4 3 8 6 1 1 3 8 6 1 1 4 3 3 4 3 8 8 8.21 Exempel: Exekvering av quick-sort Rekursivt anrop, val av pivot 8.22 6

Exempel: Exekvering av quick-sort Partitionering,..., rekursivt anrop, basfall 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 1 2 3 4 7 9 7 1 1 3 8 6 1 1 4 3 3 4 8 9 9 8.23 Exempel: Exekvering av quick-sort Kombinera, kombinera 7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9 2 4 3 1 1 2 3 4 7 9 7 17 7 9 1 1 4 3 3 4 8 9 9 8.24 Exekveringstid i värsta fallet Värsta fallet för quick-sort uppkommer när pivotelementet är ett unikt minimalt eller maximalt element en av L eller G har storlek n 1 och den andra har storlek 0 Exekveringstiden blir proportionell mot summan n + (n 1) +... + 2 + 1 Alltså, värstafallstiden för quick-sort är O(n 2 ) 8.25 Exekveringstid i värsta fallet 7

djup 0 1 tid n n-1 n-1 1 8.26 Betrakta ett rekursivt anrop till quick-sort på en sekvens av storlek s Bra anrop: storlekarna av L och G är båda < 3s/4 Dåligt anrop: en av L och G har storlek 3s/4 7 2 9 4 3 7 6 1 7 2 9 4 3 7 6 1 2 4 3 1 7 9 7 1 7 9 4 3 7 6 Bra anrop Dåligt anrop Ett anrop är bra med sannolikhet 1/2 Hälften av alla möjliga pivotelement orsakar bra anrop: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Dåliga Bra pivotel. Dåliga 8.27 Probabilistiskt faktum: Det förväntade antalet slant-singlingar som behövs för att få klave k gånger är 2k För en nod på djup i förväntar vi oss att i/2 förfädrar är bra anrop storleken på indatasekvensen för det aktuella anropet är som mest (3/4) i/2 n Alltså har vi att För en nod på djup 2log 4/3 n är den förväntade storleken på indata 1 Den förväntade höjden på quick-sortträdet är O(logn) Mängden arbete som utförs i noderna på samma djup är O(n) Alltså är den förväntade exekveringstiden för quick-sort O(nlogn) 8.28 8

förväntad höjd s(r) tid per nivå O(n) s(a) s(b) O(n) O(log n) s(c) s(d) s(e) s(f) O(n) förväntad total tid: O(n log n) 8.29 Quick-sort med konstant extra minne Quick-sort kan implementeras för att köra in-place I partitioneringssteget använder vi ersättningsoperationer för att arrangera om elementen i indatasekvensen så att elementen mindre än pivotelementet har rank mindre än h elementen lika med pivotelementet har rank mindre mellan h och k elementen större än pivotelementet har rank större än k L E G h k 8.30 Algoritm för quick-sort med konstant extra minne procedure INPLACEQUICKSORT(S, l, r) if l r then return i slumpvist heltal mellan l och r x S.ELEMATRANK(i) (h, k) INPLACEPARTITION(x) INPLACEQUICKSORT(S, l, h 1) INPLACEQUICKSORT(S, k + 1, r) 8.31 Partitionering med konstant extra minne Utför partitioneringen m.h.a. två index för att dela S i L och E G (en liknande metod kan användas för att dela E G i E och G) h 3 2 5 1 0 7 3 9 5 2 7 9 8 9 7 6 9 Upprepa till h och k möts/korsar varandra: Svep h åt höger till ett element pivotelementet hittas Svep k åt vänster till ett element < pivotelementet hittas Byt plats på elementen vid platserna h och k h k (pivot = 6) 3 2 5 1 0 7 3 9 5 2 7 9 8 9 7 6 9 k 8.32 9

2 Urval 2.1 Introduktion Urvalsproblemet Givet ett heltal i och n element x 1,x 2,...,x n tagna från en totalordning, hitta det i:te minsta elementet i sekvensen. Vi kan sortera sekvensen i O(nlogn) tid och sedan indexera det i:te elementet i konstant tid. i=3 7 4 9 6 2 2 4 6 7 9 Kan vi lösa urvalsproblemet snabbare? 8.33 2.2 Quick-select Quick-select Quick-Select är en randomiserad urvalsalgoritm baserat på paradigmet prune-and-search: Prune: välj x slumpmässigt och partitionera S till L element mindre än x E element lika med x G element större än x Search: beroende på i finns antingen svaret i E eller så behöver vi fortsätta rekursivt i någon av L eller G x x L i < L E G i > L + E i = i L E L < i < L + E (klart) 8.34 Partitionering Vi partitionerar indata-sekvensen som i algoritmen för quick-sort: Vi tar bort, i tur och ordning, varje element y från S och Vi sätter in y i L, E eller G beroende på resultatet av jämförelsen med pivotelementet x Varje insättning och borttagning är i början eller slutet av en sekvens och tar alltså O(1) tid Alltså tar partitioneringssteget i quick-select O(n) tid function PARTITION(S, p) L, E, G tomma sekvenser x S.REMOVE(p) while S.ISEMPTY() do y S.REMOVE(S.FIRST()) if y < x then L.INSERTLAST(y) else if y = x then E.INSERTLAST(y) else G.INSERTLAST(y) return L, E, G 8.35 10

Visualisering av Quick-select Exekveringen av quick-select kan visualiseras m.h.a. en rekursionsstig Varje nod representerar ett rekursivt anrop till quick-select och lagrar i och den kvarvarande sekvensen S i=5, S=(7 4 9 3 2 6 5 1 8) i=2, S=(7 4 9 6 5 8) i=2, S=(7 4 6 5) i=1, S=(7 6 5) 5 8.36 Betrakta ett rekursivt anrop till quick-select på en sekvens av storlek s Bra anrop: storlekarna av L och G är båda < 3s/4 Dåligt anrop: en av L och G har storlek 3s/4 7 2 9 4 3 75 67 16 1 7 2 9 4 3 7 6 1 22 44 33 11 7 9 7 6 1 7 9 4 3 7 6 Bra anrop Ett anrop är bra med sannolikhet 0.5 Hälften av alla möjliga pivotelement orsakar bra anrop: Dåligt anrop 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Dåliga pivotelement Bra pivotelement Dåliga pivotelement 8.37 Probabilistiskt faktum: Det förväntade antalet slantsinglingar som behövs för att få klave en gång är två Probabilistiskt faktum: Väntevärdet är en linjär funktion: E(X +Y ) = E(X) + E(Y ) E(cX) = ce(x) för varje konstant c Låt T (n) vara den förväntade exekveringstiden för quick-select Av det andra faktumet får vi T (n) b n g(n) + T (3n/4) där b är någon konstant g(n) är det förväntade antalet anrop innan ett bra anrop inträffar Alltså T (n) b n g(n) + T (3n/4) Genom det första faktumet får vi T (n) 2 b n + T (3n/4) D.v.s. T (n) är en geometrisk serie: T (n) 2 b n + 2 b n (3/4) + 2 b n (3/4) 2 + 2 b n (3/4) 3 +... Alltså gäller T (n) O(n) Vi kan lösa urvalsproblemet i förväntad tid O(n) (värstafallstiden är O(n 2 )) 8.38 8.39 11