datastrukturer och algoritmer

Post on 14-Jan-2016

62 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Datastrukturer och algoritmer. Föreläsning 13 20 min för kort!!. Innehåll. 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. Sortering varför?. - PowerPoint PPT Presentation

TRANSCRIPT

Datastrukturer och algoritmer

Föreläsning 1320 min för kort!!

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Innehåll

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

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Sortering varför?

Snabba upp andra algoritmer Sökning Hantera stora

datamängder

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Sortering vs Sorterad datatyp

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

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Saker att beakta

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?

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Stabilitet

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…

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Olika grundprinciper

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

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Mer principer…

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 tabellbaserad på tabellen på sidan http://en.wikipedia.org/wiki/Sorting_algorithm

Namn Bäst Medel Sämst Minne Stabil Typ

Insertion sort O(n) O(n + d) O(n2) O(1) X Insättning

Selection sort O(n2) O(n2) O(n2) O(1) Urval

Bubble sort O(n) — O(n2) 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

Quicksort O(n log n) O(n log n) O(n2) O(log n) Utbyte

Heapsort O(n log n) O(n log n) O(n log n) O(1) Urval

Bucket sort (Pigeon hole sort)

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)·2s)

O((k/s)·2s) Nyckel

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Animeringar att titta på

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/

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

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)

Kan sortera en lista allt eftersom den byggs upp.

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Selection sort - urvalssortering

Välj det objekt som är på tur och sätt in det sist/först O(n2) Enkel att implementera Effektivitet

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). Kan göras in-place

Konstant andel extra minne (motsv elementens storlek)

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Bubble sort - utbytessortering

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)

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Divide and Conquer

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))

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Mergesort – samsortering

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!

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Mergesort – samsortering

Algoritm för att sortera sekvensen SDivide: Om S har 2 eller flera element dela S i

två lika stora delsekvenser S1 och S2Recurse: 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å sekvenserAgorithm merge(S1,S2,S)while S1 is not empty and S2 is not empty do

if S1.first().element() ≤ S2.first().element() thenS.insertLast(S1.remove(S1.first()))

elseS.insertLast(S2.remove(S2.first()))

while S1 is not empty doS.insertLast(S1.remove(S1.first()))

while S2 is not empty doS.insertLast(S2.remove(S2.first()))

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

3 195 7 15S1

0 92 6 7

S

S2

3 195 7 150 92 6 7

Exempel på sammanslagning

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Analys av exekveringstiden

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))

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Quicksort

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

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Inplace variant av quicksort

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

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Quicksort - val av pivoelement

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ässigto Medel/median mellan några styckeno Största av de två första som skiljer sig åt

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

Dat

astr

ukt

ure

r o

ch a

lgo

ritm

erD

atas

tru

ktu

rer

och

alg

ori

tmer

VT08

Hur snabbt kan man sortera?

Jämförelsebaserad sortering Ω(nlog(n)) undre gräns

Nyckelsortering snabbare… Nästa föreläsning

top related