Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avPer-Olof Lindqvist
1
© Anders Broberg, Lena Kallin Westin, 2007 Datastrukturer och algoritmer Föreläsning 14
2
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 2 Innehåll Mer om sortering Heapsort O(N*log(N)) Facksortering/Bucketsort O(N+M) Radixsort O(b*N) Sökning i strängar/mönstermatching Naiv sökning (Brute force) Knuth Morris Pratt Booyer Moore’s Rabin Karp
3
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 3 Heapsort Man gör n insättningar i en heap och sen n avläsningar genom att plocka bort roten. Varje insättning/avläsning kostar O(log k) där k är antalet element i heapen. k < n så vi kan säga O(log n). Alltså får vi totalt O(n*log n).
4
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 4 Insättning i en Heap – O(log n) Placera den nya noden på första lediga plats. Låt sedan noden vandra uppåt i heapen tills det hamnat rätt i sorteringsordningen eller blivit rot.
5
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 5 Borttagning ur en heap – O(log n) Ersätt noden som ska tas bort med den ”sista” noden i heapen. Låt denna vandra ned tills den hamnat ”rätt” eller nått ”botten”.
6
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 6 Sortera snabbare än O(n log(n)) Facksortering (Bucket sort) Objekten måste gå att avbilda på heltalen. Vilket är största värdet & minsta värdet? [V min …V max ] O(N+M) där N är antalet element och M är V max -V min Kan göras stabil
7
Facksortering 1 2 3 4 5 6 7 8 9 M (3,k) (1,a) (9,j) (1,e) (3,i) (1,m) (2,h) (8,s) (2,o) (9,w) (7,q) (2,y) (4,p) (3,k) (1,a) (2,h) (9,j) (3,i) (2,o) (8,s) (1,e) (7,q) (4,p) (2,y) (9,w) (1,m) N (1,a) (1,e) (2,h) (3,i) (2,o) (9,w) (1,m) (3,k) (2,y) (9,j) (4,p) (8,s) (7,q) Stabil om man tar sifforna ur startlistan uppifrån och ned och bygger resultatet från vänster till höger.
8
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 8 Varianter Låt varje fack vara ett intervall av tal och sortera sen facken för sig. Sorteringen i varje fack kan vara en ny bucket sort vara en annan sorteringsalgoritm http://en.wikipedia.org/wiki/Bucket_sort http://en.wikipedia.org/wiki/Bucket_sort Notera att wikipedia kallar facksortering för ”Pigeonhole sort” och varianten med intervall för ”Bucket sort”.
9
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 9 Radix Sort Radix ≈ bas Tittar på strukturen hos nycklarna Antag att talen är representerade i basen M, tex. M=2 binära talsystemet 9 = M=10 decimala talsystemet Sorterar genom att jämföra siffror/bitar i samma position 1001
10
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 10 ”Straight” Radix Sort O(bN) Kallas också LSD Radix Sort for i 0 to b-1 do sortera fältet på ett stabilt sätt, med avseende på i:e biten Jämför från höger till vänster… Antag att vi kan sortera fältet stabilt på O(N) => O(bN) Hur gör vi det? Facksortering O(N+b) b<<N ger O(N)
11
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 11 ”Straight” Radix Sort 010 000 101 100 001 111 011 110 010 000 100 111 110 101 001 011 00 10 10 11 00 01 11 01 0 0 1 1 1 0 0 1 00 00 01 11 01 10 10 11 0 1 0 0 1 0 1 1
12
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 12 ”Straight” Radix Sort Funkar den? På grund av stabilitet, så förändras inte den relativa ordningen mellan två nycklar med samma värde Kräver extra minne O(n)
13
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 13 ”Straight” Radix Sort, med basen 10 032 224 016 123 015 031 169 252 031 032 252 016 123 224 015 169 01 01 12 25 22 03 03 16 5 6 3 2 4 1 2 9 01 01 03 22 03 12 16 25 5 6 1 4 2 3 9 2
14
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 14 Radix Exchange sort Kallas också MSD Radix Sort Titta på bitarna från vänster till höger 1. Sortera fältet på den vänstraste biten 2. Dela fältet i två delar toppen & botten 3. Rekursion Sortera toppen rekursivt, ignorera vänstraste biten Sortera botten rekursivt, ignorera vänstraste biten O(bN) där b är antalet bitar och N antalet tal
15
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 15 Radix Exchange Sort 1 0 1 1 0 0 0 1 1 1 Toppen Botten
16
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 16 Radix Exchange Sort Bygger på samma idé som inplace quicksort, för att dela upp i två delar (toppen och botten) repeat scan top-down to find a key starting with 1; scan bottom-up to find a key starting with 0; exchange keys; until scan indices cross
17
Radix Exchange Sort 010 000 101 100 111 001 011 110 010 000 011 100 001 111 101 110 001 000 011 111 010 100 101 110 000 001 010 110 011 100 101 111
18
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 18 Strängsökning… Att hitta en delsträng i en sträng Ett antal algoritmer Naiv Knuth Morris Pratt Booyer Moore Rabin-Karp
19
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 19 Naiv Strängsökning Brute force Jämför ett tecken i taget tills två olika eller hittad delsträng Vid två olika flytta fram ett tecken i huvudsträngen och börja om från början i mönstret Kan hitta första delsträngen eller alla
20
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 20 Exempel Jag vet inte vart min cykel finns vet Jag vet inte vart min cykel finns vet Jag vet inte vart min cykel finns vet Jag vet inte vart min cykel finns vet Jag vet inte vart min cykel finns vet
21
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 21 Tidskomplexitet – Bästa fallet Om mönstret finns AAAAAAAAAAAAAAAA AAAAA O(M) där M är längden på mönstret Om mönstret inte finns AAAAAAAAAAAAAAAA OAAAA O(N) där N är längden på strängen
22
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 22 Tidskomplexitet – Värsta fallet Om mönstret finns AAAAAAAAAAAAAAAB AAAAB AAAAAAAAAAAAAAAB AAAAB O(M*N) där M är längden på mönstret och N längden på strängen Om mönstret inte finns O(M*N)
23
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 23 Vad kan vi göra bättre? Utnyttja kunskap om sökmönstret för att: Unvika att behöva börja om från början Hoppa längre steg
24
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 24 Knuth-Morris-Pratt Utnyttjar en felfunktion f som berättar hur mycket av mycket av den senaste jämförelsen man kan återanvända om man felar är definierad som det längsta prefixet i P[0,...,j] som också är suffix av P[1,...,j] där P är vårt mönster. visar hur mycket av början av strängen matchar upp till omedelbart före felet Man ser alltså ifall det finns upprepningar i det mönster man söker och utnyttjar det.
25
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 25 Felfunktion exempel Om jämförelsen felar på position 4, så vet vi att a,b i position 2,3 är identiska med position 0,1 Kom i håg: f(j) är definierad som det längsta prefixet i P[0,...,j] som också är suffix av P[1,...,j] j012345 P[j]ABABAC f(j)001230
26
KMP-algoritmen Input: String T (text) with n characters and P (pattern) with m characters. Output: Starting index of the first substring of T matching P, or an indication that P is not a substring of T. f := KMPfailureFunction(P) //Konstruera felfunktionen i := 0 j := 0 while i < n do if P[j] = T[i] then if j = m-1 then return i-m+1 // En matchning i := i+1 j := j+1 else if j > 0 then // ingen match, vi har gått j index direkt efter // matchande prefix i P j := f(j-1) else i := i+1 return ingen matchning av delsträngen P i S
27
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 27 KMPfailureFunction(P) i := 1 j := 0 while i <= m-1 do if P[j] = P[i] then // We have matched j+1 characters f(i) := j+1 i := i+1 j := j+1 else if j > 0 then //j index efter pref som match. j := f(j-1) else //ingen matchning f(i) := 0 i := i+1
28
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 28 KMP exempel abacaabaccabacabaaaaaa abacababacababacababacababacab 0 1 2 3 4 5 j012345 P[j]abacab f(j)001012 j i Totalt 20 tecken jämförelser
29
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 29 KMP-Algoritmen Låt k = i - j För varje varv i while-loopen händer ett av följande: T[i] = P[j], öka i och j med 1, k oförändrad. T[i] P[j] och j > 0, i är oförändrad men k ökar med minst 1 eftersom den ändras från i - j to i - f(j-1) T[i] P[j] och j = 0, öka i med 1 och minska k med 1 (ty j oförändrad). Alltså för varje varv i loopen ökar antingen i eller k med minst 1. Max antal varv blir 2n Detta antar att f redan är beräknad (som är O(m)). Total komplexitet: O(n + m)
30
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 30 Boyer-Moores algoritm Liknar KMP Idéer: Gör matchningen baklänges, med start i mönstrets sista element. Om man stöter på ett tecken i strängen som inte finns i mönstret så flytta hela mönstret förbi detta tecken. Flytta fram mönstret så långt som möjligt varje gång. oOm det finns upprepningar av element i mönstret så får man bara flytta fram till den högraste förekomsten. oFörskjutningstabell talar om hur långt man får flytta.
31
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 31 Två hjälpmedel i algoritmen Last(ch) – ger sista förekomsten av ch i mönstret P om ch finns i P och -1 annars En förskjutningstabell som utifrån de tre fallen beräknar hur långt fram du kan flytta mönstret som mest. Algoritmens styrka är att den kan hoppa över stora delar text Fungerar mindre bra om oTexten består av få bokstäver (tex enbart 0, 1) oMönstret är väldigt kort
32
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 32 Boyer-Moore exempel j012345 P[j]abacab match(j)444461 abacaabaccabacabaaaaaa abacababacababacababacababacab 0 1 2 3 4 5 Totalt 15 tecken jämförelser chabc? last(ch)453
33
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 33 Rabin-Karp Beräkna ett hashvärde för mönstret och för varje delsträng av texten som man ska jämföra med Om hashvärdena är skilda, beräkna hashvärdet för det nästa M tecknen i texten Om hashvärdena är lika, utför en brute-force jämförelse mellan P och delsträngen Med andra ord: Endast en jämförelse per deltext Brute-force endast när hash-värderna matchar.
34
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 34 Rabin-Karp exempel Hashvärdet för AAAAA = 37 Hashvärdet för AAAAH = 100 AAAAAAAAAAAAAAHA AAAAH 100 <> 37 AAAAAAAAAAAAAAHA AAAAH 100 <> 37 AAAAAAAAAAAAAAHA AAAAH 100 = 100
35
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 35 Rabin-Karp hashfunktionen Vilken? Den får inte kosta för mycket.... Betrakta M som ett M-siffrigt tal i basen b, där b är antalet bokstäver i alfabetet Textsekvensen t[i..i+M-1] avbildas på talet x(i) = t[i]b M-1 + t[i+1]b M-2 +...+ t[i+M-1] Billigt att beräkna x(i+1) från x(i) x(i+1) = t[i+1]b M-1 + t[i+2]b M-2 +...+ t[i+M] x(i+1) = x(i)b skifta ett vänster, - t[i]b M ta bort den vänstraste termen + t[i+M] lägg till den nya högertermen Behöver inte räkna om hela talet utan gör bara en justering för det nya tecknet
36
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 36 Hash-värdet fortsättning Om M är stort blir blir (b*M) enormt därför så hashar man med mod ett stort primtal h(i) = ((t[i]b M-1 mod q) + (t[i+1]b M-2 mod q)+...+ (t[i+M-1] mod q)) mod q h(i+1) = (h(i)b mod q - (t[i]b M mod q) + (t[i+M] mod q) mod q
37
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 37 Algoritm hash_M <- Beräkna hashvärdet för M hash_S <- Beräkna hashvärdet för den första delsträngen do if (hash_M = hash_S) then Bruteforce jämförelse av M och S hash_S + 1 tecken beräknas while end of text or match
38
DoA VT -07 © Anders Broberg, Lena Kallin Westin, 2007 38 Komplexitet Om det är tillräckligt stort primtal q för hashfunktionen så kommer hashvärdet från två mönster vara distinkta I detta fall så tar sökningen O(N) där N är antalet tecken i strängen Men det finns alltid fall som ger i närheten av värsta fallet O(N*M) om primtalet är för litet
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.