Quicksort. Lars Vidar Magnusson Kapittel 7 Quicksort Randomisert Quicksort Analyse av Quicksort

Like dokumenter
Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Divide-and-Conquer II

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Divide-and-Conquer. Lars Vidar Magnusson

Sortering i Lineær Tid

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

Om Kurset og Analyse av Algoritmer

deeegimnoorrrsstt Sjette forelesning

n/b log b n = (lg n) a log b n = n log b a

Lars Vidar Magnusson

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Logaritmiske sorteringsalgoritmer

Propabilistisk Analyse og Randomiserte Algoritmer

Øvingsforelesning 6. Sorteringsalgoritmer. Martin Kirkholt Melhus Basert på foiler av Kristian Veøy 30/09/14 1

Ekstra ark kan legges ved om nødvendig, men det er meningen at svarene skal få plass i rutene på oppgavearkene. Lange svar teller ikke positivt.

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

Hvor raskt klarer vi å sortere?

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

deeegimnoorrrsstt Sjette forelesning

Løsningsforslag til eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

INF2220: Time 12 - Sortering

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

Analyse av Algoritmer

Quicksort. Fra idé til algoritme.

Høgskoleni østfold EKSAMEN. 4 dobbeltsidige ark med notater Lars Magnusson

Pensum: 3. utg av Cormen et al. Øvingstime: I morgen, 14:15

Lars Vidar Magnusson

Løsningsforslag for utvalgte oppgaver fra kapittel 3

Hashtabeller. Lars Vidar Magnusson Kapittel 11 Direkte adressering Hashtabeller Chaining Åpen-adressering

Korteste Vei II. Lars Vidar Magnusson Kapittel 24 Bellman-Ford algoritmen Dijkstra algoritmen

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

Spenntrær, oppsummert: Kruskal: Traverserer ikke. Plukker kanter i hytt og vær Prim: Legger alltid til den noden som er nærmest treet

Minimum Spenntrær - Kruskal & Prim

NORGES INFORMASJONSTEKNOLOGISKE HØGSKOLE PG4200 Algoritmer og datastrukturer

LO118D Forelesning 2 (DM)

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Grunnleggende Grafalgoritmer

Ninety-nine bottles. Femte forelesning. I dagens forelesning: Mest matematiske verktøy. Først: Asymptotisk notasjon. Så: Rekurrensligninger.

LØSNINGSFORSLAG, EKSAMEN I ALGORITMER OG DATASTRUKTURER (IT1105)

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Algoritmer - definisjon

Kjøretidsanalyse. Hogne Jørgensen

INF2220: Time 8 og 9 - Kompleksitet, beregnbarhet og kombinatorisk søk

Når Merge sort og Insertion sort samarbeider

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Algoritmer - definisjon

Minimum spenntrær. Lars Vidar Magnusson Kapittel 23. Kruskal Prim

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Norges Informasjonsteknologiske Høgskole

for bare trær Andre forelesning

Løsningsforslag for Obligatorisk Oppgave 1. Algoritmer og Datastrukturer ITF20006

Algdat Eksamensforelesning. Nils Barlaug

Grunnleggende Grafalgoritmer II

Python: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer

INF1010 notat: Binærsøking og quicksort

Algoritme-Analyse. Asymptotisk ytelse. Sammenligning av kjøretid. Konstanter mot n. Algoritme-kompeksitet. Hva er størrelsen (n) av et problem?

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Løsningsforslag - Parallellitet og repetisjon

TDT4105 Informasjonsteknologi, grunnkurs

Binær heap. En heap er et komplett binært tre:

Introduksjon til Algoritmeanalyse

Lineær sortering. Radix sort

Eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

ALGORITMER OG DATASTRUKTURER

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

LO118D Forelesning 12 (DM)

Kontinuasjonseksamen i fag SIF8010 Algoritmer og Datastrukturer Torsdag 9. August 2001, kl

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

ALGORITMER OG DATASTRUKTURER

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Løsningsforslag for eksamen i fag TDT4120 Algoritmer og datastrukturer Tirsdag 9. desember 2003, kl

INF2220: Forelesning 2

Minimum-weight vertex-cover vha. lineær programmering + avrunding.

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

Dynamisk programmering

8NH )RUHOHVQLQJ 'HSDUWPHQWÃRIÃ,QIRUPDWLFVÃ8QLYHUVLW\ÃRIÃ2VORÃ1RUZD\,1) ± $OJRULWKPVÃÉÃ'DWDÃ6WUXFWXUHV

Norges Informasjonsteknologiske Høgskole

ALGORITMER OG DATASTRUKTURER

Algdat Oppsummering, eksamen-ting. Jim Frode Hoff

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Løsnings forslag i java In115, Våren 1996

Avsluttende eksamen i IT1105/TDT4120 Algoritmer og datastrukturer

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Kondisjonstest. Algoritmer og datastrukturer. Repetisjonsoppgaver - LF. Onsdag 6. oktober 2004

Algoritmer og Datastrukturer IAI 21899

O(V 2 ) bwfs(v, i=1) λ[v] = i for each neighbor u of v if 0 < λ[u] < i. bwfs(u, i+1) if λ[u] = 0

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Definisjon: Et sortert tre

ALGORITMER OG DATASTRUKTURER

Eksamen i tdt4120 Algoritmer og datastrukturer

3.A IKKE-STASJONARITET

INF Algoritmer og datastrukturer

Transkript:

Quicksort Lars Vidar Magnusson 29.1.2014 Kapittel 7 Quicksort Randomisert Quicksort Analyse av Quicksort

Om Quicksort Quicksort er en svært populær sorteringsalgoritme. Algoritmen har i verstefall en kjøretid som er Θ(n 2 ). Forventet kjøretid er derimot Θ(n log n). Algoritmen har lave konstante kostnader. Algoritmen sorterer in-place.

Beskrivelse av Quicksort Quicksort er en rekursiv algoritme, så den faller inn under divide-and-conquer paradigmen. For å sortere en delarray A[p... r]. Divide: Del opp A[p... r] i to (muligens tomme) delarrays A[p... q 1] og A[q + 1... r] slik at A[p... q 1] A[q] og A[q + 1... r] A[q]. Conquer: Sorter delarrayene med to rekursive kall til Quicksort. Combine: Kombineringssteget er overflødig da A[p... r] er sortert etter de rekursive kallene.

Partition Algoritmen Divide steget i Quicksort blir tatt hånd om av Partition algoritmen. Partition fungerer ved å velge et pivot element og så dele inn A[p... r] slik at A[p... q 1] A[q] og A[q + 1... r] A[q].

Hvordan Partition Fungerer Partition bruker alltid siste element som pivot element. I tillegg til vil vi under kjøring alltid ha tre (mulig tomme) deler. A[r] = x er pivot elementet A[p... i] inneholder elementer som er mindre eller lik x A[i + 1... j 1] inneholder elementer som er større enn x A[j... r 1] inneholder elementer som ikke er partisjonert ennå

Hvordan Partition Fungerer Diagrammene under viser hvordan Partition utvider delarrayen utifra om A[j] er mindre eller større enn A[r].

Hvordan Partition Fungerer Diagrammene under viser hvordan Partition kjører på et konkret eksempel.

Korrektheten til Partition Vi kan bruke de fire ulike delarrayene som loop invariant hvis vi vil bevise korrektheten til Partition. Initialization: Før løkken starter er A[r] pivot og A[p... i] og A[i + 1... j 1] er tomme så loop invarianten er ivaretatt. Mantenance: Når løkken kjører, hvis A[j] pivot så byttes A[i + 1] med A[j] og både i og j økes, så da er loop invarianten ivaretatt. Termination: Algoritmen slutter når j = r, som beviser korrektheten til algoritmen.

Heapsort Algoritmen Med hjelpefunksjonen Partition på plass kan vi endelig presentere Quicksort algoritmen. Det første kallet til algoritmen er Quicksort(A, 1, n).

Kjøretiden til Quicksort Kjøretiden til Quicksort avhenger av hvorvidt rekursjonstreet er balansert eller ikke. Når treet er balansert er algoritmen Θ(n log n), som Merge-Sort og Heapsort Når treet er ubalansert er algoritmen Θ(n 2 ), som Insertion-Sort

Intuisjon for Verstefall Kjøretid av Quicksort Verstefall kjøretid for Quicksort forekommer når rekursjonstreet er helt ubalansert. Det ene barnet får n 1 elementer og det andre ingen. Vi får følgende recurrence ligning T (n) = T (n 1) + T (0) + Θ(n) = T (n 1) + Θ(n) = Θ(n 2 ) Dette gir samme kjøretid som Insertion-Sort, men ironisk nok så forekommer det på samme input som bestefall input for Insertion-Sort.

Intuisjon for Bestefall Kjøretid av Quicksort Bestefall kjøretid for Quicksort forekommer når rekursjonstreet er helt balansert. Hver delarray blir da ha n/2 elementer. Vi får følgende recurrence ligning T (n) = 2T (n/2) + Θ(n) = Θ(n log n) Dette gir samme kjøretid som Merge-Sort og Heapsort, så forskjellen mellom verstefall og bestefall er stor.

Balansert Partisjonering Gjennomsnittskjøretiden til Quicksort er mye nærmere bestefall enn verstefall. For å illustrere hvorfor dette er tilfellet kan vi se på et eksempel hvor vi har en nokså skjev deling på hvert nivå e.g. 9-til-1. T (n) = T (9n/10) + T (n/10) + Θ(n) = Θ(n log n) Uansett hvor ille inndelingen er vil dette gi Θ(n log n) så lenge inndelingen er en konstant.

Balansert Partisjonering Diagrammet under viser rekursjonstreet for en 9-til-1 konstant split.

Intuisjon for Gjennomsnitt Kjøretid Inndelingen i rekursjonstreet vil i praksis ikke ha en konstant inndeling. Det vil normalt være en miks mellom gode og dårlige oppdelinger Diagrammet under viser alternerende verstefall og bestefall, og bestefall. Det vil bare skille en konstant mellom de to i.e. den asymptotiske kjøretiden vil ikke påvirkes.

Randomized-Quicksort Algoritmen Det kan være fordelaktig å randomisere Quicksort for å forsikre oss om at alle input har samme sansynlighet. Vi ender da opp med Randomized-Quicksort. Denne algoritmen er lik Quicksort bortsett fra kallet til Randomized-Partition.

Randomized-Partition Algoritmen Vi kunne ha funnet en tilfeldig permutasjon av input, men dette ville økt konstantleddet i algoritmen. Vi randomiserer heller algoritmen ved å bruke tilfeldig utvalg (random selection). I stedet for å alltid bruke siste element som pivot, velger vi pivot tilfeldig. Dette oppnår samme effekt som å finne en tilfeldig permutasjon.

Bevis for Verstefall Kjøretid Vi skal bevise at verstefall kjøretid for Quicksort er O(n 2 ). T (n) = max (T (q) + T (n q 1)) + Θ(n) 0 q n 1 Vi gjetter på at T (n) cn 2 for en eller annen c > 0 og setter inn i ligningen over. T (n) max 0 q n 1 (cq2 + c(n q 1) 2 ) + Θ(n) = c max 0 q n 1 (q2 + (n q 1) 2 ) + Θ(n) Maksimum av (q 2 + (n q 1) 2 ) intreffer når q er enten 0 eller n 1, så da får vi Og derfor har vi at max 0 q n 1 (q2 + (n q 1) 2 ) (n 1) 2 T (n) cn 2 c(2n 1) + Θ(n) cn 2 = n 2 2n + 1 så lenge c(2n 1) Θ(n)

Gjennomsnittsanalyse av Randomized-Quicksort For å gjøre en gjennomsnittsanalyse av Randomized-Quicksort må vi først få en del ting på plass først. Den største kostnaden i algoritmen er partisjoneringen Hvert kall til Randomized-Partition fjerner pivot elementet fra mulige kandidater i.e. Randomized-Partition blir kalt på det meste n ganger. Arbeidet som blir gjort i Randomized-Partition kjører på konstant tid pluss antall sammenligninger som blir utført i for-løkka Vi lar X være det totale antallet sammenligninger som blir utført under alle kall til Randomized-Partition. For å gjøre det lettere å analysere så har vi følgende om A. Vi omdøper elementene i A til z 1,..., z n der z i er det iende største elementet Z ij er det inklusive settet {z i,..., z j } Vi lar X ij = I {z i is compared to z j }.

Gjennomsnittsanalyse av Randomized-Quicksort Da har nesten alt det som skal til for å finne det forventede totale antallet sammenligninger utført av Randomized-Partition n 1 n E[X ] = E X ij i=1 j=i+1 n 1 = n E[X ij ] i=1 j=i+1 n 1 n = Pr{z i is compared to z j } i=1 j=i+1 Uten å gå veldig grundig til verks kan vi si at Pr{z i is compared to z j } = 2 j i + 1 Dette kommer som en følge av for at z i og z j skal bli sammenlignet må en av de bli valgt som pivot før noe annet element.

Gjennomsnittsanalyse av Randomized-Quicksort Med sansyligheten Pr{X ij } på plass kan vi endelig utføre den siste utregningen. E[X ] = n 1 n i=1 j=i+1 n 1 n i = < i=1 k=1 n 1 n i=1 k=1 2 j i + 1 2 k + 1 2 k n 1 = O(log n) i=1 = O(n log n) variabelskifte k = j i harmonisk serie