Datastrukturer och algoritmer

Download Report

Transcript Datastrukturer och algoritmer

Datastrukturer och algoritmer
Föreläsning 13
20 min för kort!!
Datastrukturer och algoritmer
Innehåll
VT08
 Sortering
 Sortering vs sorterad datatyp
 Stabilitet
 Grundprinciper för sortering
 Genomgång av några sorteringsalgoritmer
 Hur fort går det att sortera en lista med n tal?
 Kapitel
15.1-15.4
Datastrukturer och algoritmer
Sortering varför?
VT08
 Snabba
upp andra algoritmer
 Sökning
 Hantera stora
datamängder
Datastrukturer och algoritmer
Sortering vs Sorterad datatyp
VT08
 Sortering
 förändrar ordningen mellan objekten i en struktur
efter en sorteringsordning (fallande, ökande)
 Sorterad
datatyp
 de strukturförändrande operationerna i gränsytan
(insert, delete) upprätthåller en sorteringsordning
mellan de lagrade objekten
Datastrukturer och algoritmer
Saker att beakta
VT08

Absolut komplexitet
 Totala komplexiteten i alla implementationssteg
o Tabell->Lista->Dubbellänkad Lista
Passar en viss typ av sortering för en viss typ av
implementation?
 Ska man sortera och sedan söka eller inte sortera och
göra en linjär sökning?

Datastrukturer och algoritmer
Stabilitet
VT08
 Den
inbördes relationen mellan två objekt med
samma nyckel bibehålls vid sortering
[(0,L),(2,C),(5,G),(8,A),(10,G) ] =>
[(8,A),(2,C),(5,G) ,(10,G),(0,L)]
 Alla
sorteringsalgoritmer går inte att göra
stabila!!
 Mer om detta senare…
Datastrukturer och algoritmer
Olika grundprinciper
VT08

Insättnings – O(n2)
 välj ut ett godtyckligt objekt och sätt in det på rätt plats

Urvals – O(n2)
 välj ut det objekt som är på tur och sätt in det sist/först

Utbytes – O(n*log(n))
 byt plats på objekt som ligger fel inbördes

Samsortering – O(n*log(n))
 bygger på sammanslagning av redan sorterade strukturer

Nyckelsortering – O(m+n)…
 kräver mer information/kunskap
om objektmängden
Datastrukturer och algoritmer
Mer principer…
VT08
 Naiva
sorteringar - O(n2)
 Insticks, urvals, och vissa utbytes
 ”Smarta”
sorteringar - O(nlog(n))
 Utbytes och samsorteringar
 Ännu
smartare sorteringar - O(n+m)…
 Nyckelsorteringar…(nästa föreläsning)
Sammanfattande tabell
baserad på tabellen på sidan http://en.wikipedia.org/wiki/Sorting_algorithm
Namn
Bäst
Medel
Sämst
Insertion sort
O(n)
O(n + d)
O(n )
Selection sort
O(n )
O(n )
O(n )
Bubble sort
O(n)
—
O(n )
O(1)
X
Utbyte
Merge sort
O(n log n)
O(n log n)
O(n log n)
O(n)
X
Samsortering
In-place merge sort O(n log n)
O(n log n)
O(n log n)
O(1)
X
Samsortering
2
2
Quicksort
O(n log n) O(n log n)
Heapsort
O(n log n)
Bucket sort
(Pigeon hole sort)
2
2
Minne
Stabil
Typ
O(1)
X
Insättning
O(1)
2
2
Urval
O(n )
O(log n)
Utbyte
O(n log n)
O(n log n)
O(1)
Urval
O(n+m)
O(n+m)
O(n+m)
O(k)
X
Nyckel
LSD Radix sort
O(n·k/s)
O(n·k/s)
O(n·k/s)
O(n)
X
Nyckel
MSD Radix sort
O(n·k/s)
O(n·k/s)
O(n·(k/s)·2
)
s
s
O((k/s)·2 )
Nyckel
Datastrukturer och algoritmer
Animeringar att titta på
VT08

Animering som visar hur sorteringen beter
sig för listor som är




slumpmässiga,
nästan sorterade
omvänt sorterade
samt listor med många dubletter (få unika tal)
http://vision.bc.edu/~dmartin/teaching/sorting/anim-html/all.html

Animering som visar ett mindre exempel i
detalj
http://math.hws.edu/TMCM/java/xSortLab/
Datastrukturer och algoritmer
Insertion sort - insättningssortering
Välj ett godt. objekt och sätt in det på rätt plats
 O(n2)
 Enkel att implementera
 Effektivitet

 bäst för mindre datamängder och datamängder som är
nästan sorterade
 i praktiken mer effektiv än selection sort och bubble sort
Stabil
 Kan göras in-place

 Konstant andel extra minne (motsv elementens storlek)
VT08

Kan sortera en lista allt eftersom den byggs upp.
Datastrukturer och algoritmer
Selection sort - urvalssortering




 bäst på mindre datamängder
 beter sig lika oavsett datamängdens utseende
 i praktiken mer effektiv än bubble sort

Kräver mindre ”swaps” än insertion sort
 Bra om ”dyrare” att skriva till minnet än att läsa från det.

Inte stabil
 kan göras stabil men då tappar man fördelar jämfört med insertion
sort (mer swaps).

VT08
Välj det objekt som är på tur och sätt in det sist/först
O(n2)
Enkel att implementera
Effektivitet
Kan göras in-place
 Konstant andel extra minne (motsv elementens storlek)
Datastrukturer och algoritmer
Bubble sort - utbytessortering
VT08
byta plats på objekt som ligger fel inbördes
 O(n2)
 Enkel (enklast?) att implementera
 Effektivitet

 bäst på mindre datamängder och nästan sorterade
mängder
 i praktiken sämre än både insertion sort och selection sort
Kräver mer ”swaps” än insertion sort
 Stabil
 Kan göras in-place

 Konstant andel extra minne (motsv elementens storlek)
Datastrukturer och algoritmer
Divide and Conquer
VT08

Rekursiv algoritmprincip
 Grundidén är att dela upp problemet i mindre och mindre
problem
 Lös problemen för basfallet
 Slå ihop dem till en totallösning
Mergesort och Quicksort är av denna algoritmtyp
 O(n*log(n))

Datastrukturer och algoritmer
Mergesort – samsortering
VT08
Bygger på sammanslagning av redan sorterade
strukturer
 O(n log n)
 Effektivitet

 snabbare och gör mindre jämförelser än quicksort
 gör fler rekursiva anrop än quicksort men kan skrivas
iterativt
Stabil
 Kan göras in-place

 Speciellt om listan är konstruerad som länkad lista
 Oftast inte in-place, minnesutrymmet kan påverka ett val!
Datastrukturer och algoritmer
Mergesort – samsortering
VT08
 Algoritm
för att sortera sekvensen S
 Divide: Om S har 2 eller flera element dela S i
två lika stora delsekvenser S1 och S2
 Recurse: Sortera sekvenserna S1 och S2
rekursivt
 Conquer: Sätt tillbaka elementen i S genom att
slå samman S1 och S2 till en sorterad sekvens
Ihopslagning av två sekvenser
Agorithm merge(S1,S2,S)
while S1 is not empty and S2 is not empty do
if S1.first().element() ≤ S2.first().element() then
S.insertLast(S1.remove(S1.first()))
else
S.insertLast(S2.remove(S2.first()))
while S1 is not empty do
S.insertLast(S1.remove(S1.first()))
while S2 is not empty do
S.insertLast(S2.remove(S2.first()))
Datastrukturer och algoritmer
Exempel på sammanslagning
VT08
S1
3
5
7
15
19
S
0
2
3
5
6
S2
0
2
6
7
9
7
7
9
15 19
Datastrukturer och algoritmer
Analys av exekveringstiden
VT08
Höjden på sorteringsträdet kopplat till sorteringen
av en sekvens med n element blir log2(n)
 Antag att insättning och borttagning är av O(1)
 Tiden i varje nod i trädet exkluderat tiden för det
rekursiva jobbet nedanför är O(n/2i) där i är djupet
på noden ligger på, ty storleken på sekvensen är n/2i
 Det är exakt 2i noder på djupet i => totala tiden på
djupet i i trädet är O(2in/2i) vilket är O(n) och
höjden på trädet är log2(n)
 Så den totala tidskomplexiteten är
O(nlog2(n))

Datastrukturer och algoritmer
Quicksort
VT08
 Algoritm
 Välj ut ett pivotelement
 Dela upp listan i tre delar Less, Equal, Greater
 Sortera Less och Greater rekursivt
 Slå ihop Less+Equal+Greater
Datastrukturer och algoritmer
Inplace variant av quicksort
VT08
 Algoritm
 Traversera parallellt från båda hållen i S, gå bakåt
från början av S tills man hittar ett element som
är >= PE, traversera från slutet mot början till
man hittar ett element som är < PE
 Skifta plats på dessa två element
 Upprepa till traverseringarna mötes
 Skifta in PE på rätt plats
 Rekursivt anrop med Less och Greater
Datastrukturer och algoritmer
Quicksort - val av pivoelement
VT08
 O(nlog(n))
i bästa fallet
 Valet av pivoelement kritiskt
 Vill ha ett pivoelement som ligger i mitten
 Vid sned fördelning får man insticks/urvals
sortering med O(n2)
 Alternativ (eftersträvar en enkel tilldelning)
o Välj första/sista, slumpmässigt
o Medel/median mellan några stycken
o Största av de två första som skiljer sig åt
Datastrukturer och algoritmer
Hur snabbt kan man sortera?
VT08
 Jämförelsebaserad
sortering
 Ω(nlog(n)) undre gräns
 Nyckelsortering
snabbare…
 Nästa föreläsning