Sortering. Sortering ved fletning (merge-sort) Del-og-hersk. Merge-sort



Relaterede dokumenter
Sortering ved fletning (merge-sort)

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer:

Sortering. Eksempel: De n tal i sorteret orden

Sortering af information er en fundamental og central opgave.

Sortering. Eksempel: De n tal i sorteret orden

Sortering i lineær tid

Sortering af information er en fundamental og central opgave.

Algoritmisk geometri

Intervalsøgning. Algoritmisk geometri. Motivation for intervaltræer. Intervalsøgning. Lad der være givet en database over ansatte i en virksomhed

Søgning og Sortering. Søgning og Sortering. Søgning. Linæer søgning

Søgning og Sortering. Philip Bille

Søgning og Sortering. Søgning Linæer søgning Binær søgning Sortering Indsættelsessortering Flettesortering. Philip Bille

Danmarks Tekniske Universitet

Mm7: A little bit more about sorting - and more times for exercises - November 4, 2008

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet. Mandag den 22. marts 2004, kl

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 5n 4. logn. n 4n 5 n/logn. n n/logn 5n

Danmarks Tekniske Universitet

Divide-and-Conquer algoritmer

Programmering og Problemløsning, 2017

Algorithms and Architectures I Rasmus Løvenstein Olsen (RLO), Jens Myrup Pedersen (JMP) Mm4: Sorting algorithms - October 23, 2009

Danmarks Tekniske Universitet

Divide-and-Conquer algoritmer

Invarianter. Invariant: Et forhold, som vedligeholdes af algoritmen gennem (dele af) dens udførelse. Udgør ofte kernen af ideen bag algoritmen.

Danmarks Tekniske Universitet

Algoritmer og invarianter

Danmarks Tekniske Universitet

Mm6: More sorting algorithms: Heap sort and quick sort - October 29, 2008

Algoritmer og datastrukturer Course No Cheat Sheet May 15, 2012

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen (bemærk at log n betegner totals logaritmen): n 2 (log n) 2 2.

Geometrisk skæring. Afgørelse af om der findes skæringer blandt geometriske objekter Bestemmelse af alle skæringspunkter

Algoritmeanalyse. Øvre grænse for algoritme. Øvre grænse for problem. Nedre grænse for problem. Identificer essentiel(le) operation(er)

Divide-and-Conquer algoritmer

28 Algoritmedesign. Noter. PS1 -- Algoritmedesign

BRP Sortering og søgning. Hægtede lister

Dynamisk programmering

Divide-and-Conquer algoritmer

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 7 n 1 7 7/n. 7nlogn. 7n 7nlogn n7

Danmarks Tekniske Universitet

22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned.

Binære søgetræer og skiplister

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Algoritmedesign med internetanvendelser ved Keld Helsgaun

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

DM507 - Algoritmer og datastrukturer

Danmarks Tekniske Universitet

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

1. Redegør for Lister, stakke og køer mht struktur og komplexitet af de relevante operationer

Målet for disse slides er at beskrive nogle algoritmer og datastrukturer relateret til at gemme og hente data effektivt.

Dynamisk programmering

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 4 n n 3n n 2 /logn 5 n n (logn) 3n n 2 /logn 4 n n 5 n

Dynamisk programmering

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Danmarks Tekniske Universitet

Prioritetskøer og hobe. Philip Bille

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 3/2. n logn (3/2) n. 2 3logn (3/2) n

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Binære søgetræer. Binære søgetræer. Nærmeste naboer. Nærmeste nabo

Prioritetskøer. Prioritetskøer. Prioritetskøer. Prioritetskøer

Danmarks Tekniske Universitet

DM507 Algoritmer og datastrukturer

Danmarks Tekniske Universitet

Binære søgetræer. Nærmeste naboer Binære søgetræer Indsættelse Predecessor og successor Sletning Trægennemløb. Philip Bille

Danmarks Tekniske Universitet

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Grundlæggende køretidsanalyse af algoritmer

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n+logn logn (logn) 7 (3/2) n

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

Datastrukturer (recap)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 23n log n. 4 n (log n) log n

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 2 2 n 1/n (logn) n. n 2

DM02 Kogt ned. Kokken. Januar 2006

Skriftlig eksamen i Datalogi

Prioritetskøer. Prioritetskøer. Prioritetskøer. Prioritetskøer

Prioritetskøer. Prioritetskøer Træer og hobe Repræsentation af hobe Algoritmer på hobe Hobkonstruktion Hobsortering. Philip Bille

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Algorithms and Architectures I Rasmus Løvenstein Olsen (RLO), Jimmy Jessen Nielsen (JJE) Mm2: Rekursive algoritmer og rekurrens - October 10, 2008

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Science and Technology EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 7 n 1/ log n. (log n) 4

Introduktion. Introduktion. Algoritmer og datastrukturer. Eksempel: Maksimalt tal

Introduktion. Algoritmer og datastrukturer Toppunkter Algoritme 1 Algoritme 2 Algoritme 3. Philip Bille

Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er

Algorithms and Architectures I Rasmus Løvenstein Olsen (RLO) Mm2: Rekursive algoritmer og rekurrens - October 12, 2010

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet

Sortering. Her: sortering af arrays af objekter

Opgave 1 (10%) I det følgende angiver log n 2-tals-logaritmen af n. Ja Nej. n+3n er O(2n)? n 6 er O(n 5 )? nlogn er O(n 2 /logn)? 4n 3 er O(3n 4 )?

DM507 Algoritmer og datastrukturer

Introduktion. Philip Bille

Sortering i CPH STL. Jakob Sloth, Morten Lemvigh & Mads Kristensen. CPH STL rapport maj 2003; revidered november 2003

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Datastrukturer (recap)

Transkript:

Sortering Sortering ved fletning (merge-sort) 7 2 9 4! 2 4 7 9 7 2! 2 7 9 4! 4 9 7! 7 2! 2 9! 9 4! 4 1 2 Del-og-hersk Merge-sort Del-og-hersk er et generelt paradigme til algoritmedesign Del: opdel input-data S i to disjunkte delmængder, S 1 og S 2 Løs (rekursivt): løs de delproblemer, der svarer til S 1 og S 2 Hersk: kombiner løsningerne for S 1 og S 2 til en løsning for S Basistilfældet for rekursionen er delproblemer af størrelse 0 eller 1 Merge-sort er en sorteringsmetode baseret på del-og-hersk-paradigmet Ligesom heap-sort benyttes et comparator-objekt har den O(n log n) køretid I modsætning til heap-sort benyttes ingen hjælpe-prioritetskø tilgås data sekventielt (hensigtsmæssigt ved sortering på en disk) Merge-sort på en input-sekvens S med n elementer består at tre trin: Del: opdel S i to sekvenser, S 1 og S 2, hver med cirka n/2 elementer Løs: sorter rekursivt S 1 og S 2 Hersk: flet S 1 og S 2 til en sorteret sekvens Algorithm mergesort(s, C) Input sequence S with n elements, comparator C Output sequence S sorted according to C if S.size() > 1 then (S 1, S 2 ) " partition(s, n/2) mergesort(s 1, C) mergesort(s 2, C) S " merge(s 1, S 2 ) 3 4

Fletning af to sorterede sekvenser Merge-sort-træ Hersk-trinet i merge-sort består i at flette to sorterede sekvenser A and B til en sorteret sekvens S, der indeholder foreningsmængden af A og B Fletning af to sorterede sekvenser implementeret ved hjælp af en hægtet liste tager O(n) tid Algorithm merge(a, B) Input sequences A and B Output sorted sequence of A # B S " empty sequence while A.isEmpty() $ B.isEmpty() do if A.first().element() < B.first().element() then S.insertLast(A.remove(A.first())) else S.insertLast(B.remove(B.first())) while A.isEmpty() do S.insertLast(A.remove(A.first())) while B.isEmpty() do S.insertLast(B.remove(B.first())) return S 5 En udførelse af merge-sort kan anskueliggøres ved hjælp af et binært træ Hver knude repræsenterer et rekursivt kald af mergesort og indeholder en usorteret sekvens før sin opdeling en sorteret sekvens efter udførelsen Roden er det første kald Bladene er delsekvenser af længde 0 eller 1 7 2 9 4! 2 4 7 9 7 2! 2 7 9 4! 4 9 7! 7 2! 2 9! 9 4! 4 6 Eksempel på udførelse Opdeling Rekursivt kald, opdeling 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 7 8

Rekursivt kald, opdeling Rekursivt kald, basistilfælde 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 9 10 Rekursivt kald, basistilfælde Fletning 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 11 12

Fletning Recursivt kald,, fletning, fletning 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 6 8 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 13 14 Fletning 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 6 8 Analyse af merge-sort Højden af merge-sort-træet er O(log n) ved hvert rekursivt kald halveres sekvensen Den totale arbejdsmængde for knuderne med dybde i er O(n) vi opdeler og fletter 2 i sekvenser, som hver har længden n/2 i vi foretager 2 i+1 rekursive kald Derfor er den samlede køretid for merge-sort O(n log n) dybde #sekv længde 7 2! 2 7 9 4! 4 9 3 8! 3 8 6 1! 1 6 0 1 1 2 n n/2 i 2 i n/2 i 15 16

Quick-sort Quick-sort er en randomiseret sorteringsalgoritme, der er baseret på del-og-hersk-paradigmet Quick-sort (Hoare, 1962) x 7 4 9 6 2! 2 4 6 7 9 4 2! 2 4 7 9! 7 9 2! 2 9! 9 Del: vælg et tilfældigt element x (kaldet pivot-elementet) og opdel S i L : elementer mindre end x E : elementer lig med x G : elementer større end x Løs: sorter L og G Hersk: sammenføj L, E og G L x E G x 17 18 Pseudokode for quick-sort Opdeling Algorithm quicksort(s, C) Input sequence S with n elements, comparator C Output sequence S sorted according to C if S.size() > 1 then x " element of S (L, E, G) " partition(s, x) quicksort(l, C) quicksort(g, C) S " join(l, E, G) 19 Vi opdeler input-sekvensen, som følger: Vi fjerner, et efter et, ethvert element y fra S Vi overfører y til L, E eller G, afhængigt af udfaldet af sammenligningen med pivot-elementet, x Hver indsættelse og fjernelse sker enten i starten eller i slutningen af en sekvens og tager derfor O(1) tid Opdelingen i quick-sort tager derfor O(n) tid Algorithm partition(s, p) Input sequence S, position p of pivot Output subsequences L, E, G of the elements of S less than, equal to, or greater than the pivot, resp. L, E, G " empty sequences x " S.elementAtRank(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 { y > x } G.insertLast(y) return L, E, G 20

Quick-sort-træ En udførelse af quick-sort kan anskueliggøres ved hjælp af et binært træ Hver knude repræsenterer et rekursivt kald af quicksort og indeholder en usorteret sekvens før sin opdeling en sorteret sekvens efter udførelsen Roden er det første kald Bladene er delsekvenser af længde 0 eller 1 Valg af pivot-element Eksempel på udførelse 7 2 9 4 3 7 6 1! 1 2 3 4 6 7 8 9 7 4 9 6 2! 2 4 6 7 9 7 2 9 4! 2 4 7 9 3 8 6 1! 1 3 8 6 4 2! 2 4 7 9! 7 9 2! 2 9 4! 4 9 3! 3 8! 8 2! 2 9! 9 9! 9 4! 4 21 22 Opdeling, rekursivt kald, valg af pivot-element Opdeling, rekursivt kald, basistilfælde 7 2 9 4 3 7 6 1! 1 2 3 4 6 7 8 9 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 4 3 1!! 2 4 7 3 8 6 1! 1 3 8 6 2! 2 9 4! 4 9 3! 3 8! 8 1! 1 9 4! 4 9 3! 3 8! 8 9! 9 4! 4 9! 9 4! 4 23 24

Rekursivt kald,, basistilfælde, forening Rekursivt kald, valg af pivot-element 7 2 9 4 3 7 6 1! 1 2 3 4 6 7 8 9 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 2 4 3 1! 1 2 3 4 7 9 7 1! 1 3 8 6 1! 1 4 3! 3 4 3! 3 8! 8 1! 1 4 3! 3 4 8! 8 9! 9 9! 9 4! 4 9! 9 4! 4 25 26 Opdeling,, rekursivt kald, basistilfælde Forening, forening 7 2 9 4 3 7 6 1! 1 2 3 4 6 7 8 9 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 1! 1 3 8 6 2 4 3 1! 1 2 3 4 7 9 7! 17 7 9 1! 1 4 3! 3 4 8! 8 9! 9 1! 1 4 3! 3 4 8! 8 9! 9 9! 9 4! 4 9! 9 4! 4 27 28

Køretid i værste tilfælde Det værste tilfælde for quick-sort optræder, når pivot-elementet er det unikke minimum- eller maksimum-element. I dette tilfælde har enten L eller G længden n - 1, og den anden har længden 0 Køretiden er proportional med summen n + (n - 1) + + 2 + 1 Den værste køretid for quick-sort er således O(n 2 ) Forventet køretid Betragt det rekursive kald af quick-sort for en sekvens af længde s Godt kald: længderne af L og G er begge mindre end 3s/4 Dårligt kald: enten har L eller G en længde større end 3s/4 2 4 3 1 7 2 9 4 3 7 6 1 9 7 9 7 1! 1 1 7 2 9 4 3 7 6 1 7 2 9 4 3 7 6 dybde tid Godt kald Dårligt kald 0 n Et kald er godt med sandsynligheden 1/2 1 n - 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 n - 1 1 Dårlige pivotelementer Gode pivotelementer Dårlige pivotelementer 29 30 Forventet køretid (del 2) Quick-sort på stedet Sandsynlighedsteoretisk faktum: Det forventede antal møntkast, der skal til for at for få k kroner, er 2k For en knude med dybden i forventer vi, at i/2 forfædre er gode kald, hvilket betyder, at længden af input-sekvensen for det aktuelle kald er højst (3/4) i/2 n Derfor har vi For en knude med dybden 2log 4/3 n har den forventede input-sekvens længden 1 Den forventede højde af quick-sort-træet er O(log n) Den samlede arbejdsmængde for alle knuder med samme dybde er O(n) Derfor er den forventede køretid for quicksort O(n log n) forventet højde O(log n) s(a) s(r) s(b) s(c) s(d) s(e) s(f) tid per niveau O(n) O(n) O(n) Quick-sort kan implementeres, så den der kører på stedet (in-place) I opdelingstrinet benyttes erstatningsoperationer for at omordne inputsekvensens elementer således, at elementer mindre end pivot-elementet får rang mindre end h elementer lig med pivot-elementet får rang imellem h and k elementer større end pivot-elementet får rang større end k De rekursive kald behandler elementer med rang mindre end h elementer med rang større end k Algorithm inplacequicksort(s, l, r) Input sequence S, ranks l and r Output sequence S with the elements of rank between l and r rearranged in increasing order if l % r then return i " a random integer between l and r x " S.elemAtRank(i) (h, k) " inplacepartition(s, x) inplacequicksort(s, l, h - 1) inplacequicksort(s, k + 1, r) total forventet tid: O(n log n) 31 32

Opdeling på stedet Sammenligningsbaseret sortering Benyt to indices, j og k, til at opsplitte S til L og E # G Gentag, indtil j og k krydser hinanden: Søg til højre, indtil der findes et element > x. Søg til venstre, indtil der mødes et element < x Ombyt de to elementer på indeks j og k j 3 2 5 1 0 7 3 5 9 2 7 9 8 9 7 6 9 j 3 2 5 1 0 7 3 5 9 2 7 9 8 9 7 6 9 k k (pivot = 6) Mange sorteringsalgoritmer er baseret på sammenligning De sorterer ved at foretage sammenligninger imellem par af objekter Eksempler: bubble-sort, selection-sort, insertion-sort, heap-sort, merge-sort, quick-sort,... Lad os udlede en nedre grænse for køretiden for enhver algoritme, der bruger sammenligninger til at sortere n elementer x 1, x 2,, x n ja x i < x j? nej 33 34 Tælling af sammenligninger Lad os tælle sammenligningerne Enhver mulig udførelse af algoritmen svarer til en rod-til-blad-vej i et beslutningstræ x i < x j? Højden af beslutningstræet Højden af beslutningstræet er en nedre grænse for køretiden Enhver mulig input-permutation må føre til hvert sit blad (output) I modsat fald vil nogle input-permutationer, f.eks....4...5... og...5...4..., få samme output, hvilket ville være forkert Da der således er n! = 1*2* *n blade, er højden mindst log(n!) minimal højde (tid) x i < x j? x a < x b? x c < x d? x a < x b? x c < x d? x e < x f? x k < x l? x m < x o? x p < x q? log (n!) x e < x f? x k < x l? x m < x o? x p < x q? 35 n! 36

Den nedre grænse Enhver sammenligningsbaseret sorteringsalgoritme bruger mindst log(n!) tid i værste tilfælde Bucket-sort og Radix-sort Derfor må enhver sådan algoritme have en køretid, der i værste tilfælde er mindst & n # log ( n!) ' log $! % 2 " n 2 mindst n/2 faktorer er " n/2 = ( n / 2)log ( n / 2). B 1, c 3, a 3, b 7, d 7, g 7, e & & & & & & & 0 1 2 3 4 5 6 7 8 9 Enhver sammenligningsbaseret sorteringsalgoritme kører i!(n log n) tid i værste tilfælde 37 38 39 40

Bucket-sort Lad S være en sekvens af n (nøgle, element)- emner med heltalsnøgler i intervallet [0, N ' 1] Bucket-sort bruger nøgler som indices i et hjælpe-array B af sekvenser (spande) Fase 1: Tøm sekvensen S ved at flytte hvert emne (k, o) til sin spand B[k] Fase 2: For i = 0,, N ' 1, flyt emnerne i spanden B[i] til slutningen af sekvensen S Analyse: Fase 1 tager O(n) tid Fase 2 tager O(n + N) tid Bucket-sort tager altså O(n + N) tid Algorithm bucketsort(s, N) Input sequence S of (key, element) items with keys in the range [0, N ' 1] Output sequence S sorted by increasing keys B " array of N empty sequences while S.isEmpty() do f " S.first() (k, o) " S.remove(f) B[k].insertLast((k, o)) for i " 0 to N ' 1 do while B[i].isEmpty() do f " B[i].first() (k, o) " B[i].remove(f) S.insertLast((k, o)) 41 42 Eksempel Egenskaber og udvidelser Nøgleinterval [0, 9] B 7, d 1, c 3, a 7, g 3, b 7, e Fase 1 1, c 3, a 3, b 7, d 7, g 7, e & & & & & & & 0 1 2 3 4 5 6 7 8 9 Fase 2 1, c 3, a 3, b 7, d 7, g 7, e Nøgle-type-egenskaben Nøglerne bruges som indices i et array og kan derfor ikke være vilkårlige objekter Der er intet comparator-objekt Stabilitets-egenskaben Den indbyrdes rækkefølge for to elementer med samme nøgle bevares efter udførelsen af algoritmen Udvidelser Heltalsnøgler i intervallet [a, b] Flyt emnet (k, o) til spanden B[k ' a] Nøgler fra en mængde D af mulige tekststrenge, hvor D har en konstant størrelse (f.eks. navnene på Danmarks 100 største byer) Sorter D og beregn rangen r(k) for enhver streng k fra D i den sorterede sekvens Flyt et emne (k, o) til spanden B[r(k)] 43 44

Leksikografisk orden Leksikografisk sortering Et d-tupel er en sekvens af d nøgler (k 1, k 2,, k d ) Nøgle k i siges at være i den i te dimension af tuplet Eksempel: De Cartesiske koordinater for et punkt i rummet er et 3-tupel Lad C i være comparator-objektet, der sammenligner to tupler i deres i te dimension Lad stablesort(s, C) være en stabil sorteringsalgoritme, der bruger comparator-objektet C Algorithm lexicographicsort(s) Input sequence S of d-tuples Output sequence S sorted in lexicographic order for i " d downto 1 do stablesort(s, C i ) Den leksikografiske orden for to d-tupler er defineret rekursivt som følger (x 1, x 2,, x d ) < (y 1, y 2,, y d ) ( x 1 < y 1 ) (x 1 = y 1 $ (x 2,, x d ) < (y 2,, y d )) LexicographicSort sorterer en sekvens af d-tupler i leksikografisk orden ved d gange at udføre algoritmen stablesort, en gang for hver dimension Eksempel: (7,4,6) (5,1,5) (2,4,6) (2,1,4) (3,2,4) (2,1,4) (3,2,4) (5,1,5) (7,4,6) (2,4,6) D.v.s. Tuplerne sammenlignes i første dimension, så i anden, o.s.v. LexicographicSort kører i O(dT(n)) tid, hvor T(n) er køretiden for stablesort (2,1,4) (5,1,5) (3,2,4) (7,4,6) (2,4,6) (2,1,4) (2,4,6) (3,2,4) (5,1,5) (7,4,6) 45 46 Radix-sort Radix-sort af binære heltal Radix-sort er en specialisering af lexicographicsort, som benytter bucketsort som den stabile sorteringsmetode i enhver dimension Radix-sort kan anvendes til tupler, hvor nøglerne i hver dimension i er heltal i intervallet [0, N ' 1] Radix-sort kører i O(d(n + N)) tid Algorithm radixsort(s, N) Input sequence S of d-tuples such that (0,, 0) * (x 1,, x d ) and (x 1,, x d ) * (N ' 1,, N ' 1) for each tuple (x 1,, x d ) in S Output sequence S sorted in lexicographic order for i " d downto 1 do bucketsort(s, N) Betragt en sekvens af n b-bit tal x = x b'1 x 1 x 0 Vi repræsenterer hvert element som et b- tupel af heltal fra intervallet [0, 1] og anvender radix-sort med N = 2 Denne anvendelse af radix-sort kører i O(bn) tid For eksempel kan vi sortere en sekvens af 32-bit heltal i lineær tid Algorithm binaryradixsort(s) Input sequence S of b-bit integers Output sequence S sorted replace each element x of S with the item (0, x) for i " 0 to b ' 1 do replace the key k of each item (k, x) of S with bit x i of x bucketsort(s, 2) 47 48

Eksempel Sortering af en sekvens af 4-bit heltal Udvælgelse 1001 0010 1001 1001 0001 0010 1110 1101 0001 0010 1101 1001 0001 0010 1001 0001 1101 0010 1101 1101 1110 0001 1110 1110 1110 49 50 Udvælgelsesproblemet Lad der være givet et heltal k og n elementer x 1, x 2,, x n, der opfylder en total ordningsrelation. Find det k te mindste element i denne mængde. Vi kan selvfølgelig sortere mængden i O(n log n) tid, og derefter indicere det k te element. k=3 Kan vi løse problemet hurtigere? 7 4 9 6 2! 2 4 6 7 9 Quick-select Quick-select er en randomiseret udvælgelsesalgoritme Afskær: vælg et tilfældigt element x (pivotelementet) og opdel S i L : elementer mindre end x E : elementer lig med x G : elementer større en x Søg: afhængigt af k, søg svaret i E, eller søg rekursivt i enten L eller G L k < L x x E G k > L + E k = k - L - E L < k < L + E (fundet) 51 52

Visualisering af quick-select Forventet køretid En udførelse af quick-select kan anskueliggøres ved hælp af en rekursionsvej Hver knude repræsenterer et rekursivt kald af quick-select og indeholder k og den resterende sekvens Betragt det rekursive kald af quick-select for en sekvens af længde s Godt kald: længderne af L og G er begge mindre end 3s/4 Dårligt kald: enten L eller G has har en længde større end eller lig med 3s/4 7 2 9 4 3 7 6 1 9 7 2 9 4 3 7 6 1 k=5, S=(7 4 9 3 2 6 5 1 8) 2 4 3 1 7 9 7 1! 1 1 7 2 9 4 3 7 6 k=2, S=(7 4 9 6 5 8) Godt kald Dårligt kald k=2, S=(7 4 6 5) k=1, S=(7 6 5) 5 Et kald er godt med sandsynligheden 1/2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Dårlige pivotelementer Gode pivotelementer Dårlige pivotelementer 53 54 Forventet køretid (del 2) Sandsynlighedsteoretisk faktum 1: Det forventede antal møntkast, der skal til for at få krone, er 2 Sandsynlighedsteoretisk faktum 2: Forventning er en lineær funktion E(X + Y) = E(X) + E(Y) E(cX) = ce(x) Lad T(n) betegne den forventede køretid for quick-select Ved faktum 2: T(n)! T(3n/4) + bn*(forventet antal kald inden et godt kald), hvor b > 0 er en konstant Ved faktum 1: T(n)! T(3n/4) + 2bn T(n) er en opad begrænset af en kvotientrække: T(n)! 2bn + 2b(3/4)n + 2b(3/4) 2 n + 2b(3/4) 3 n + Da kvotienten er mindre end 1, konvergerer rækken. Så T(n) er O(n) 55