© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 13
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Innehåll Hashtabeller igen Den konstiga tabellen... Sortering Varför ska man sortera 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
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Från: Linear prob = Sluten hashing med linjär teknik Chaining = Öppen hashing Double hash = Sluten hashing med kvadratisk teknik
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Misslyckad sökning, öppen hashing Antag att det är lika sannolikt att det n:te värdet x hashas till var och en av listorna. Eftersom den lista där x ska placeras måste genomsökas helt innan sökningen misslyckas så krävs det O(antal element i listan k) sökningar I medelfall blir det
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Sluten hashing, linjär teknik Medelantalet platser som måste prövas vid en insättning och misslyckad sökning är uppåt begränsad av (1+1/(1- ) 2 ) /2, ( = 0.5 ger 2.5) Medelantalet platser för en lyckad sökning är uppåt begränsad av (1+1/(1- ))/2, ( = 0.5 ger 1.5)
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Sortering varför? Snabba upp andra algoritmer Sökning Hantera stora datamängder
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Saker att beakta Absolut komplexitet Totala komplexiteten i alla implementationssteg oTabell->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?
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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…
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Olika grundprinciper Insättnings – O(n 2 ) välj ut ett godtyckligt objekt och sätt in det på rätt plats Urvals – O(n 2 ) 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
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Mer principer… Naiva sorteringar - O(n 2 ) 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 Namn Bäst MedelSämstMinneStabil Insertion sortO(n)O(n + d)O(n 2 )O(1)X Selection sortO(n 2 ) O(1) Bubble sortO(n)—O(n 2 )O(1)X Merge sortO(n log n) O(n)X In-placeIn-place merge sortmerge sortO(n log n) O(1)X QuicksortO(n log n) O(n 2 )O(log n) HeapsortO(n log n) O(1) Bucket sortO(n·k) O(n 2 ·k)O(n·k)X LSD Radix sortRadix sortO(n·k/s) O(n)X MSD Radix sortRadix sortO(n·k/s) O(n·(k/s)·2 s )O((k/s)·2 s )
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Insertion sort - insättningssortering Välj ett godt. objekt och sätt in det på rätt plats O(n 2 ) 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.
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Selection sort - urvalssortering Välj det objekt som är på tur och sätt in det sist/först O(n 2 ) 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)
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Bubble sort - utbytessortering byta plats på objekt som ligger fel inbördes O(n 2 ) 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)
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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))
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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!
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Mergesort – samsortering 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()))
DoA VT -07 © Anders Broberg, Lena Kallin Westin, S S S Exempel på sammanslagning
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Analys av exekveringstiden Höjden på sorteringsträdet kopplat till sorteringen av en sekvens med n element blir log 2 (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/2 i ) där i är djupet på noden ligger på, ty storleken på sekvensen är n/2 i Det är exakt 2 i noder på djupet i => totala tiden på djupet i i trädet är O(2 i n/2 i ) vilket är O(n) och höjden på trädet är log 2 (n) Så den totala tidskomplexiteten är O(nlog 2 (n))
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Quicksort Algoritm Välj ut ett pivoelement Dela upp listan i tre delar Less, Equal, Greater Sortera Less och Greater rekursivt Slå ihop Less+Equal+Greater
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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 anropa på Less och Greater
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 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(n 2 ) Alternativ (eftersträvar en enkel tilldelning) oVälj första/sista, slumpmässigt oMedel/median mellan några stycken oStörsta av de två första som skiljer sig åt
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Exempel… LRR
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Hur snabbt kan man sortera? Jämförelsebaserad sortering Ω(nlog(n)) undre gräns Nyckelsortering snabbare… Nästa föreläsning
DoA VT -07 © Anders Broberg, Lena Kallin Westin, Ω(nlog(n)) – bevis… Exekveringstiden för en jämförelsebaserad sortering måste vara lika med eller större än djupet på det beslutsträd som är associerad med algoritmen Varje nod i detta träd är kopplat till en jämförelse som bestämmer ordningen mellan två element i S Därav, varje extern nod i T representerar en unik permutation av elementen i S, och det måste finnas n! noder i T, och höjden är log(n!) Eftersom n! har åtminstone n/2 termer som är större än eller lika med n/2 => log(n!) = log(n/2)n/2= (n/2)log(n/2) => Ω(nlog(n))