Datastructuren Quicksort

Slides:



Advertisements
Verwante presentaties
Sudoku puzzels: hoe los je ze op en hoe maak je ze?
Advertisements

‘SMS’ Studeren met Succes deel 1
Paulus' eerste brief aan Korinthe (20) 23 januari 2013 Bodegraven.
Differentie vergelijkingen differentie vergelijkingen
NEDERLANDS WOORD BEELD IN & IN Klik met de muis
Beter afspelen.
H1 Basis Rekenvaardigheden
November 2013 Opinieonderzoek Vlaanderen – oktober 2013 Opiniepeiling Vlaanderen uitgevoerd op het iVOXpanel.
Uitgaven aan zorg per financieringsbron / /Hoofdstuk 2 Zorg in perspectief /pagina 1.
Global e-Society Complex België - Regio Vlaanderen e-Regio Provincie Limburg Stad Hasselt Percelen.
 Deel 1: Introductie / presentatie  DVD  Presentatie enquête  Ervaringen gemeente  Pauze  Deel 2 Discussie in kleinere groepen  Discussies in lokalen.
STAPPENPLAN GRAMMATICUS.
Ronde (Sport & Spel) Quiz Night !
Een Concert van het Nederlands Philharmonisch Orkest LES 4 1.
1 Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen.
Een optimale benutting van vierkante meters Breda, 6 juni 2007.
Kb.1 Ik leer op een goede manier optellen en aftrekken
Datastructuren Analyse van Algoritmen en O
Datastructuren Analyse van Algoritmen en O
9 januari 2013 Bodegraven 1. 1Korinthe 11 1 Wordt mijn navolgers, gelijk ook ik Christus navolg. 2.
Nooit meer onnodig groen? Luuk Misdom, IT&T
Hoofdstuk 6: Controle structuren
FOD VOLKSGEZONDHEID, VEILIGHEID VAN DE VOEDSELKETEN EN LEEFMILIEU 1 Kwaliteit en Patiëntveiligheid in de Belgische ziekenhuizen anno 2008 Rapportage over.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
Fibonacci & Friends Met dank aan Gerard Tel.
1 Datastructuren Heapsort College 4. 2 Vandaag  Kort: ADT vs Datastructuur  Heaps en Heapsort  Tijd over: ondergrenzen voor sorteren; nog sneller sorteren.
1 Datastructuren Zoekbomen II Invoegen en weglaten.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen (II) College 6.
Rekenregels van machten
Differentieer regels De afgeleide van een functie f is volgens de limietdefinitie: Meestal bepaal je de afgeleide niet met deze limietdefinitie, maar.
Regelmaat in getallen (1).
Parallelle Algoritmen String matching. 1 Beter algoritme patroonanalyse Bottleneck in eenvoudig algoritme: WITNESS(j) (j = kandidaat in eerste i-blok)
1 introductie 3'46” …………… normaal hart hond 1'41” ……..
Oefeningen F-toetsen ANOVA.
Wat levert de tweede pensioenpijler op voor het personeelslid? 1 Enkele simulaties op basis van de weddeschaal B1-B3.
13 maart 2014 Bodegraven 1. 1Korinthe Want gelijk het lichaam één is en vele leden heeft, en al de leden van het lichaam, hoe vele ook, een lichaam.
1 Datastructuren Quicksort en andere sorteermethoden College 3.
1 Datastructuren Skiplists. 2 Skiplists  Vrij eenvoudige datastructuur  “Makkelijker” dan gebalanceerde bomen  Kunnen hetzelfde als gebalanceerde bomen.
1 Optuigen van datastructuren 2 Dynamische order statistics (2)
Optuigen van datastructuren
Datastructuren Sorteren: bubble, merge, quick
1 Datastructuren Heapsort (2e deel) College 5. 2 Vandaag  Heaps en Heapsort  (eind)  Nog sneller sorteren:  Ondergrenzen  Linair sorteren.
Datastructuren Sorteren, zoeken en tijdsanalyse
Afrika: Topo nakijken en leren.
ribwis1 Toegepaste wiskunde Lesweek 01 – Deel B
ribwis1 Toegepaste wiskunde – Differentieren Lesweek 7
Statistiekbegrippen en hoe je ze berekent!!
Optuigen van datastructuren Datastructuren Onderwerp 11.
Datastructuren Sorteren, zoeken en tijdsanalyse
1 Datastructuren Een informele inleiding tot Skiplists Onderwerp 13.
Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen van.
Sorteeralgoritmen. Sorteren: aanpak 1 Hoe ga je een rij getallen sorteren met PC? Sorteren door selectie (= selection sort): Zoek de kleinste waarde Sorteer.
ECHT ONGELOOFLIJK. Lees alle getallen. langzaam en rij voor rij
17/08/2014 | pag. 1 Fractale en Wavelet Beeldcompressie Les 5.
17/08/2014 | pag. 1 Fractale en Wavelet Beeldcompressie Les 3.
Fractale en Wavelet Beeldcompressie
Algoritme Inhoud: Definitie algoritme Recursieve algoritmes Opgaven
Waar gaat het nou toch om?!
13 november 2014 Bodegraven 1. 2 de vorige keer: 1Kor.15:29-34 indien er geen doden opgewekt worden...  vs 29: waarom dopen?  vs.30-32: waarom doodsgevaren.
1 Week /03/ is gestart in mineur De voorspellingen van alle groten der aarden dat de beurzen zouden stijgen is omgekeerd uitgedraaid.
45 levenslessen Klikken voor vervolg Muziek: snowdream.
23 mei 2013 Bodegraven vanaf hoofdstuk 6: hoofdst.1: de wijsheid van de wereld hoofdst.2: de wijsheid van God hoofdst.3: Gods akker en Gods bouwwerk.
1 Datastructuren Quicksort College 3. 2 Vorige keren  O-notaties  Sorteren: insertion sort, bubble sort  Kosten (n 2 ) tijd in het slechtste geval.
1 Datastructuren Sorteren, zoeken en tijdsanalyse College 2.
1 Datastructuren Analyse van algorithmen (vervolg) Heapsort College 4.
1 PI1 week 9 Complexiteit Sorteren Zoeken. 2 Complexiteit van algoritmen Hoeveel werk kost het uitvoeren van een algoritme (efficiëntie)? –tel het aantal.
Minimum Opspannende Bomen Algoritmiek. 2 Inhoud Het minimum opspannende bomen probleem Een principe om een minimum opspannende boom te laten groeien Twee.
Divide & Conquer: Verdeel en Heers vervolg Algoritmiek.
Minimum Opspannende Bomen
Transcript van de presentatie:

Datastructuren Quicksort College 3

Sorteren: insertion sort, bubble sort Sorteren: merge sort Vorige keren O-notaties Sorteren: insertion sort, bubble sort Kosten Q(n2) tijd in het slechtste geval Sorteren: merge sort Kosten Q(n lg n) tijd in het slechtste geval Zoeken: binary search Zoeken in een geordende array: Q(lg n) tijd Quicksort: begin

Vandaag O-notatie: W en Q Quicksort: eind Heapsort

Sorteeralgoritmen overzicht Q(n2): bubble sort, insertion sort Q(n lg n): merge sort, heapsort (komt nog) Geen extra geheugen: bubble sort, insertion sort, heapsort Wel extra geheugen: merge sort

1 Orde notaties

O-notatie en zo O-notatie (herhaling): Allemaal waar: O(g(n)) = { f(n) | er zijn positieve constanten c en r, zodat 0 £ f(n) £ c * g(n) voor alle n ³ r} O(g(n)) is dus een verzameling functies. In plaats van de schrijven f(n) Î O(g(n)) schrijft men echter f(n)=O(g(n)) Allemaal waar: 3n2 = O(n2) (7 n lg n3) = O(n lg n) (2n3+4n2 +3n + 5) = O(n3) Maar ook zijn waar: n lg n = O(n2) n3 = O(n4) Want “O” geeft een bovengrens

Bewijzen dat algoritme O-grens haalt Te bewijzen: algoritme gebruikt O(f(n)) tijd. Zo doe je dat: Toon aan dat voor alle inputs, de tijd niet meer is dan een constante maal f(n), n de inputgrootte Verschillende methoden: Inspectie van loop-structuur Analyse van “recursieboom” Andere technieken komen nog

Voorbeeld z = 0; for i = 1 to n do for j = 1 to n * n do k = 1 while k < n * n do z = z + i * j * k k = k*2 z ++; z = z + 3; return z

W-notatie (Omega) W-notatie: W(g(n)) = { f(n) | er zijn positieve constanten c en r, zodat f(n) ³ c * g(n) voor alle n ³ r} W(g(n)) is dus weer een verzameling functies. In plaats van de schrijven f(n) Î W (g(n)) schrijft men echter f(n)=W (g(n)) Deze notatie geeft ondergrenzen, terwijl de O-notatie bovengrenzen gaf Vb.: het bubblesort-algoritme gebruikt in het slechtste geval W(n2) tijd Vb.: het mergesort-algoritme gebruikt in het slechtste geval W(n lg n) tijd

Voorbeelden Allemaal waar: Maar ook zijn waar: 3n2 = W (n2) (7 n lg n3) = W (n lg n) (2n3+4n2 +3n + 5) = W (n3) Maar ook zijn waar: n lg n = W (n) n3 = W (n2) Want “W” geeft een ondergrens

Q-notatie combineert O-notatie en W-notatie Q-notatie (Theta) Q-notatie combineert O-notatie en W-notatie f(n) = Q(g(n)), dan en slechts dan als f(n) = O(g(n)) en f(n) = W(g(n)) Dus: 3n2 = Q(n2) Maar niet: 3n2 = Q(n3) en niet: 3n3 = Q(n2)

Van snel naar langzaam Q(1), Q(lg lg n) Q(lg n), Q(lg2 n), Q(Ön), Q(n), Q(n lg n), Q(n lg2 n), Q(n Ön), Q(n2), Q(n2 lg n), Q(n3), Q(n4), Q(2n), Q(3n), Q(n!), Q(busybeaver(n)) (bijvoorbeeld: maximum aantal stappen dat een terminerend programma met n symbolen opgeschreven kan doen) Snel algoritme « langzaam stijgende functie (en omgekeerd)

Herhaling + Vandaag Quicksort Snel sorteer algoritme Gebruikt gemiddeld weinig tijd: Q(n lg n) met in de praktijk een kleine constante Maakt gebruik van belangrijke subroutine: Partition Quicksort is langzaam in het slechtste geval, maar snel op random inputs Randomized-Quicksort om slechte gevallen ‘meestal’ te vermijden Wiskundige analyse van gemiddelde tijd Randomized-Quicksort

Verdeel en heers paradigma Idee is: Quicksort Verdeel en heers paradigma Idee is: Kies een element uit de array, zeg x Splits de array in drie stukken: Alles in 1e stuk is £ x 2e stuk is het element x Alles in 3e stuk is ³ x (of >) Sorteer recursief het eerste stuk Sorteer recursief het derde stuk Klaar!

Quicksort: Eén PArtition Datastructuren

Splitsen Partition(A,p,r) {Input is array A met indexwaardes van p tot en met r} {Output: waarde q met p £ q £ r zodat A[p..r] een permutatie is van input, en als p £ i < q dan geldt A[i] £ A[q] en als q < i £ r dan geldt A[i] > A[q]} … Methode partitioneert array A[p…r] Returnwaarde is plek waar “splitselement” terechtgekomen is Splitselement heet pivot en nemen we nu als element dat op A[r] staat

Partition Code in boek is subtiel pivot p i i+1 j-1 j r Allemaal £ Gebied waar we nog aan werken

Pseudocode Partition Partition(A,p,r) pivot = A[r]; i = p – 1; for j = p to r – 1 do {*} if A[j] £ pivot then i ++; Verwissel A[i] en A[j] Verwissel A[i+1] en A[r]; return i+1; Invariant: bij * geldt voor elke k, p £ k £ r: Als p £ k £ i, dan A[k] £ pivot Als i+1 £ k £ j – 1, dan A[k] > pivot Als k=r, dan A[k]=pivot

Pseudocode Partition Partition(A,p,r) pivot = A[r]; i = p – 1; for j = p to r – 1 do {*} if A[j] £ pivot then i ++; Verwissel A[i] en A[j] Verwissel A[i+1] en A[r]; return i+1; Invariant: bij * geldt voor elke k, p £ k £ r: Als p £ k £ i, dan A[k] £ pivot Als i+1 £ k £ j – 1, dan A[k] > pivot Als k=r, dan A[k]=pivot Merk op: Initieel geldt invariant: triviaal Invariant blijft gelden Bij terminatie …

En dan verwisselen we A[i+1] en A[r] Partition na de loop Allemaal £ Allemaal > p r i i+1 En dan verwisselen we A[i+1] en A[r] Allemaal £ Allemaal > i+1 p r

Looptijd partition Partition(A,p,r) pivot = A[r]; i = p – 1; for j = p to r – 1 do {*} if A[j] £ pivot then i ++; Verwissel A[i] en A[j] Verwissel A[i+1] en A[r]; return i+1; Lineair: Q(r-p+1) Inspectie van loopstructuur

Opmerking (herhaling) In onze beschrijving gingen we er van uit dat alle elementen verschillend zijn Als er gelijke elementen zijn, werkt het ook, maar moet je iets beter opletten in de analyse (zelfde code kan gebruikt worden) Datastructuren

Quicksort: Twee CODE EN EERSTE ANALYSE Datastructuren

Quicksort Quicksort(A, p, r) {Sorteert het deel van de array A[p…r]} if p < r then q = Partition(A, p, r) Quicksort(A, p, q-1) Quicksort(A, q+1, r)

r p q Allemaal £ Allemaal > p r

Hoeveel tijd kost Quicksort? In het slechtste geval gaat het erg langzaam… Bekijk een gesorteerde rij: We splitsen in stukken van grootte n – 1; 1; 0 En de volgende keer in stukken van grootte n-2; 1; 0 Etc. Dus: cn+ c(n-1)+ c(n-2)+ c(n-3) + … +3c+2c+c = c n(n+1)/2 stappen Op een gesorteerde rij: O(n2) stappen

Analyse met recurrente betrekkingen Schrijf: T(n) is aantal stappen van Quicksort op gesorteerd array met n elementen T(n) = T(n-1)+T(0) + O(n) = T(n-1)+ O(n) = O(n2) Andere constantes Met inductie naar n

Quicksort voor aartsoptimisten Als we echt geluk hebben, splitst Quicksort altijd precies middendoor en gaan we in recursie op twee stukken van hooguit n/2 elementen Zelfde analyse als bij Mergesort geeft O(n lg n) tijd

log n niveau’s

Beste geval analyse van Quicksort met recurrente betrekkingen Stel T(n) is het beste geval van de looptijd van Quicksort op een array met n elementen T(n) £ 2*T(n /2) + O(n) (*) T(n) = O(n lg n) Volgt uit (*) met inductie Zo kan je ook Mergesort analyseren

Quicksort voor optimisten (niet noodzakelijk aartsoptimisten) Stel nu dat we altijd verdelingen hebben die de array splitsen in twee stukken die verhouding 9 – 1 hebben T(n) = T(9n / 10)+ T(n / 10) + O(n) Recursieboom heeft log10/9 n = O(lg n) lagen Per laag O(n) dus in zo’n geval eveneens O(n lg n) Maar … hoe vaak gebeurt dat?

Hoe vaak doen we een goede splitsing? In 80% van de gevallen splitsen we 9-1 of beter… Ingewikkelde analyse geeft O(n lg n) tijd gemiddeld over alle mogelijke permutaties van input als alle getallen verschillend zijn (doen we niet)

Drie Randomized Quicksort Datastructuren

Hoe zorgen we ervoor dat we heel vaak goed splitsen Idee 1: maak eerst een random permutatie van de input Geeft O(n lg n) Analyse ingewikkeld Idee 2 (beter): gebruik niet A[r] als pivot, maar gebruik een random element als pivot Geeft ook O(n lg n) Analyse eenvoudiger Ietsje sneller

Randomized-Partition Randomized-Partition(A,p,r) Kies uniform een random getal i uit de verzameling {p, p+1, …, r} Verwissel A[r] en A[i] Partition(A,p,r) Elk element in A heeft dezelfde kans om als pivot-element gebruikt te worden

r p q Allemaal £ Allemaal > p r

Quicksort Quicksort(A, p, r) {Sorteert het deel van de array A[p…r]} if p < r then q = Partition(A, p, r) Quicksort(A, p, q-1) Quicksort(A, q+1, r)

Randomized-Quicksort pseudocode Randomized-Quicksort(A, p, r) {Sorteert het deel van de array A[p…r]} if p < r then q = Randomized-Partition(A,p,r) Randomized-Quicksort(A, p, q-1) Randomized-Quicksort(A, q+1, r)

Analyse Randomized Quicksort Verschillende manieren om de verwachtte tijd uit te rekenen Netjes: stel recurrente betrekking op, en los die op (zie o.a. sheets) Vandaag: telargument waarbij we kijken naar “hoe vaak doet een element mee in een partition”?

Tijd is O(som partition-lengtes) Kijk naar recursieboom Totale tijd is O(som van alle lengtes van alle deelstukken waar we een partitie op doen) = O(som over alle elementen van aantal keren dat het element in een partitie mee doet)

Verwachtte tijd Totale verwachtte tijd is O(verwachte som van alle lengtes van alle deelstukken waar we een partitie op doen) = O(som over alle elementen van verwachtte aantal keren dat het element in een partitie mee doet) = n* O(verwachtte aantal keren dat een element in een partitie meedoet)

Afschatten van verwachtte aantal keren dat een element in een partitie meedoet Is O(log n) Hoe laten we dit zien? Kijk element x, en kijk naar het formaat van het stuk waar x in zit. Begint met formaat n Iedere keer een beetje kleiner Als formaat 1 is zijn we klaar Hoe vaak is het verwachtte aantal keren dat het kleiner wordt? We laten zien: O(log n)

Kans is ½ dat stuk hooguit ¾ van oude lengte heeft Als we een stuk hebben met r elementen zijn er r/2 keuzes voor de pivot die zorgen dat de volgende keer het grootste stuk hooguit ¾ * r lang is

Tellerij klaar Hoe vaak kan je n met ¾ vermenigvuldigen totdat je onder de 1 bent? log4/3 n keer = O(log n) Wat is het verwachtte aantal keren dat je een experiment met kans ½ moet doen totdat je s keer succes hebt? 2s Dus verwachtte aantal keren dat element in partitie meedoet is hooguit 2 log4/3 n = O(log n) keer Dus: verwachtte tijd Quicksort O(n log n) Andere analyse (wel in sheets, niet vandaag): 2n ln n

Analyse Randomized-Partition Deze sheet slaan we over Slechtste geval: weer Q(n2) T(n) = max0£ q£ n-1 T(q)+T(n-q-1)+Q(n) Verwachtte tijd: analyse doen we hier aannemend dat alle elementen verschillend zijn (anders klopt ‘t ook, overigens) We doen de analyse hier met behulp van de sommatiefactormethode Eerst: vergelijking looptijd en aantal vergelijkingen

Looptijd vs aantal vergelijkingen Deze sheet slaan we over Stel Quicksort doet X vergelijkingen. Dan gebruikt het O(n+X) tijd Partition doet altijd minstens 1 vergelijking Want we roepen Partition alleen aan op stukken met minstens 2 elementen Partition doet O(aantal vergelijkingen in partition) werk … We gaan nu het verwachtte aantal vergelijkingen tellen dat Quicksort doet op een array met n verschillende elementen. Noem dit getal C(n)

Deze sheet slaan we over Technisch detail Deze sheet slaan we over We volgen de analyse uit Concrete Mathematics. Die gebruikt twee vergelijkingen per recursieve aanroep extra. Deze waardes noemen we D(n). D(0)=C(0)=0; als n>0 dan is D(n)>C(n) Als we dus voor D(n) een bovengrens hebben, geeft dat ook een bovengrens voor C(n) Uiteindelijke waarde is dus iets beter (scheelt niet veel) Zo volgen we Knuth

Aantal vergelijkingen (Randomized)-Partition Deze sheet slaan we over Partition(A,p,r) pivot = A[r]; i = p – 1; for j = p to r – 1 do {*} if A[j] £ pivot then i ++; Verwissel A[i] en A[j] Verwissel A[i+1] en A[r]; return i+1; n-1 vergelijkingen op een array met n elementen Concrete Mathematics neemt hier n+1 vergelijkingen

Deze sheet slaan we over Analyse D(n) (1) Deze sheet slaan we over D(0) = 0 D(1) = 2 D(n) = n+1 + ???? Elk van de splitsingen heeft dezelfde kans: 0,1,n-1 1,1,n-2 2,1,n-3 … n-2, 1, 1 n-1, 1, 0

Deze sheet slaan we over Analyse D(n) (2) Deze sheet slaan we over D(0)= 0 D(1)= 2 D(n) = n+1 + 1/n*Sk=0n-1 D(k) + 1/n*Sk=0n-1 D(n-k-1) Elk van de splitsingen heeft dezelfde kans: 0,1,n-1 1,1,n-2 2,1,n-3 … n-2, 1, 1 n-1, 1, 0 Of: D(n) = n+1 + (2/n)*Sk=0n-1 D(k) voor n>0

Deze sheet slaan we over Deze hadden we Deze sheet slaan we over Maal n nemen Zelfde vergl. voor n-1 - Vergelijkingen aftrekken Na vereenvoudigen

Stelsel vergelijkingen Deze sheet slaan we over D(0)=0 nD(n) = (n+1)D(n-1)+ 2n Dit stelsel kunnen we met sommatiefactormethode oplossen Idee is: vermenigvuldig formule met sommatiefactor sn waarbij sn = (an-1an-2…a1)/(bnbn-1…b2) als anD(n)=bnD(n-1)+cn Want dan is snbn=sn-1an-1 En dan krijg je voor E(n)=snanD(n) de formule E(n)=E(n-1)+sncn Wat een somformule voor E en daarna voor D geeft…

Deze sheet slaan we over nD(n) = (n+1)D(n-1)+ 2n an = n bn = n+1 cn = 2n : dit hadden we Deze sheet slaan we over Definitie toepassen: Alles maal sn: (*) (**) Def.: (*) en (**) geven:

Deze sheet slaan we over dus Want E(0)=0 We hadden dus

Aantal vergelijkingen randomized quicksort Deze sheet slaan we over Randomized-Quicksort doet verwacht ongeveer 2(n+1)ln n vergelijkingen

Resultaat en discussie Het verwachtte aantal vergelijkingen van Randomized-Quicksort is minder dan 2(n+1)ln n Verwachtte looptijd is Q(n lg n) De in de O / Q verstopte constante is erg klein, dus heel snel in de praktijk Sommige hele snelle sorteermethoden switchen naar een ander algoritme wanneer n klein is (bijvoorbeeld onder de 30)

Recap Quicksort Snel sorteer algoritme Gebruikt gemiddeld weinig tijd: Q(n lg n) met in de praktijk een kleine constante Maakt gebruik van belangrijke subroutine: Partition Quicksort is langzaam in het slechtste geval, maar snel op random inputs Randomized-Quicksort om slechte gevallen ‘meestal’ te vermijden Wiskundige analyse van gemiddelde tijd Randomized-Quicksort

Sorteeralgoritmen overzicht Slechtste en gemiddeld geval Q(n2): bubble sort, insertion sort Slechtste en gemiddeld geval Q(n lg n): merge sort, heapsort (zometeen) Slechtste geval Q(n2) en gemiddeld geval Q(n lg n): quicksort Voordeel van Quicksort vooral in de “Q” verstopt Geen extra geheugen: bubble sort, insertion sort, heapsort, quicksort Wel extra geheugen: merge sort Het voordeel zie je vooral in de praktijk, want de constante die in de O verstopt is is heel klein bij quicksort.