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