Viktiga algoritmer sökng och sorterg När man sparar data (formation) gör man det alltid utifrån något behov av att senare använda det man har sparat. Det kan ju vara av juridiska krav på dokumentation (arkiverg), men det mesta är för att återanvända i den egna verksamheten. Således blir det viktigt att hitta i sa sparade data. I små mängder data är det sällan ett problem men i stora mängder data som man ofta letar i är det viktigt hur man organiserar datalagrgen. Sökng För enkelhetens skull kommer jag använda arrayer, som är speciellt lämpliga i sökngs- och sortergssammang, i undantagsfall använder jag listor. Jag använder mig ast av heltal både som nyckelvärden och som data. I verkligheten har man mer komplexa nyckelvärden, ofta textsträngar. Data kan vara sammansatta och i sig lagrade i poster, t.ex. formation om en person. person(pnr: 451112-0356 fornamn: Serafim efternamn: Dahl...) För riktigt stora datamängder använder man databaser. Här ska vi titta lite ytligt på sökng och sorterg som är det mest grundläggande för datahanterg. Föreläsng 5 Bild 1 av 20 Föreläsng 5 Bild 2 av 20 Sökng i en oordnad tabell: Det a sättet att söka i oordnade mängder data är att gå igenom datamängden och testa varje element i mängden. Det fns ga genvägar. Man kan formellt resonera sig fram till att man i genomsnitt går igenom halva mängden om sökt data oftast fns. Ju mer sällan man får träff desto mer närmar man sig att man igenomsnitt går igenom hela eller nästan hela mängden. I små datalager är det gen katastrof, men det kan löna sig att sortera om man söker ofta efter data utan att hitta det man söker. Då kan man hålla sig på N/2 i genomsnitt om N är storleken på datalagret oavsett om det man söker fns i datamängden eller te Ljär sökng i en oordnad tabell: proc {UnorderedSearch Key A?Found?Location} proc {LocalSearch I} if I =< {Array.high A} then if A.I == Key then Found:=true Location := I if I < {Array.high A} then {LocalSearch I+1} {LocalSearch {Array.high A}} Föreläsng 5 Bild 3 av 20 Föreläsng 5 Bild 4 av 20
Ljär sökng i en ordnad tabell: proc {OrderedSearch Key A?Found?Location} proc {LocalSearch I} if I =< {Array.high A} then if A.I == Key then Found:=true Location := I if A.I < Key andthen I < {Array.high A} then {LocalSearch I+1} {LocalSearch {Array.low A}} Bär sökng i en ordnad tabell: Om man har data sorterat och datamängden te är stor kan man söka med halverg av söktervallet, s.k. bärsökng. Informellt får man med resonemanget hur många gånger (X) måste vi halvera tervallet N för att få tag i ett element? N 2 X = 1 och alltså X = log 2 N Det betyder att vi kan leta snabbare om vi håller nere datamängden så den är enkelt hanterbar. Om dex över data blir för stort gör vi dex över dex... Alltså kan det löna sig att hålla data sorterade eller att sortera osorterade data. Föreläsng 5 Bild 5 av 20 Föreläsng 5 Bild 6 av 20 Bär sökng i en ordnad tabell: proc {BarySearch Key A Lo Hi?Found?Location} if Lo < Hi then Mid = (Lo + Hi + 1) div 2 if Key < A.Mid then {BarySearch Key A Lo Mid-1 Found Location} {BarySearch Key A Mid Hi Found Location} Location := Lo Found := A.Lo == Key Sorterg All sorterg går ut på att flytta dataposter eller nyckelvärden tills man erhållit en viss ordng. Det är bra att ha tillgång till en procedur som byter plats på två dataposter: proc {Swap?Arr A B} C C=Arr.A Arr.A := Arr.B Arr.B := C Swap: Föreläsng 5 Bild 7 av 20 Föreläsng 5 Bild 8 av 20
Urvalssorterg 1. Sök reda på msta elementet 2. Byt första och msta elementen med varandra 3. Om det fns fler element: Sortera resten med samma metod. 23 17 5 13 9 22 2 15 2 17 5 13 9 22 23 15 2 5 17 13 9 22 23 15 Urvalssorterg... proc {SelectionSort A} MPos MPos = {NewCell 0} for M {Array.low A}..{Array.high A}-1 do MPos := M for N M+1..{Array.high A} do if A.N < A.@MPos then MPos := N {Swap A M @MPos} {ShowArray A} Föreläsng 5 Bild 9 av 20 Föreläsng 5 Bild 10 av 20 Urvalssorterg... Utskriften från SelectionSort (omformaterad som en lista): [23 17 5 13 9 22 2 15] [2 17 5 13 9 22 23 15] [2 5 17 13 9 22 23 15] [2 5 9 13 17 22 23 15] [2 5 9 13 17 22 23 15] [2 5 9 13 15 22 23 17] [2 5 9 13 15 17 23 22] Funktionell implementation av urvalssorterg för en lista fun {FunSelectionSort L} fun {Sort L Res} if L == nil then Res E = {FdM L} {Sort {Delete E L} {App Res [E]}} {Sort L nil} Föreläsng 5 Bild 11 av 20 Föreläsng 5 Bild 12 av 20
Vi behöver FdM: Funktionell implementation... och Delete: Funktionell implementation... fun {FdM L} [] [E] then E [] A B T then if A < B then {FdM A T} {FdM B T} fun {Delete El L} [] H T then if H == El then T H {Delete El T} Föreläsng 5 Bild 13 av 20 Föreläsng 5 Bild 14 av 20 Utbytessorterg 1. Gå igenom arrayen (listan), jämför grannar, byt om de står fel 2. Sista elementet står rätt, räkna bort! 3. Om det fns fler element: Sortera med samma metod. 23 17 5 13 9 22 2 15 17 5 13 9 22 2 15 23 5 13 9 17 2 15 22 23 5 9 13 2 15 17 22 23 5 9 2 13 15 17 22 23 5 2 9 13 15 17 22 23 2 5 9 13 15 17 22 23 2 5 9 13 15 17 22 23 Utbytessorterg... proc {ExchangeSort A} for M {Array.high A}..{Array.low A}+1;~1 do for N {Array.low A}..M-1 do if A.N > A.(N+1) then {Swap A N N+1} {ShowArray A} Föreläsng 5 Bild 15 av 20 Föreläsng 5 Bild 16 av 20
Utbytessorterg... Utskriften från ExchangeSort (omformaterad som en lista): [23 17 5 13 9 22 2 15] [17 5 13 9 22 2 15 23] [5 13 9 17 2 15 22 23] [5 9 13 2 15 17 22 23] [5 9 2 13 15 17 22 23] [5 2 9 13 15 17 22 23] Nästan funktionell implementation av utbytessorterg... fun {FunExchangeSort L} Tmp = {NewCell L} fun {InnerSort L} [] [_] then L [] E1 E2 T then if E1 > E2 then E2 {FunExchangeSort E1 T} E1 {FunExchangeSort E2 T} for I 2..{Length L} do Tmp := {InnerSort @Tmp} @Tmp Föreläsng 5 Bild 17 av 20 Föreläsng 5 Bild 18 av 20 Mer om sorterg De visade metoderna är långsamma och mer en rad exempel på användng av procedurer i kontrast mot funktioner. Båda metoderna består av dubbelloop för jämför och flyttng av element. För varje element med dex 1 i n För varje element i j n <operationer på vektorn> n (n i+1) = n n n n i+ 1 = n 2 n n + 1 n2 +n = 2 2 +n 2 = O(n2 ) Mer om sorterg... Fns det bättre metoder? Ja, men de snabbare metoderna är te lika enkla att förstå. De går ut på delng och sammanslagng: Delng har vi sett går på logn och sammanslagngen N så snabbast blir i det ideala fallet N logn QuickSort: Dela strukturerat och slå ihop delarna MergeSort: Dela (ostrukturerat) slå samman strukturerat QuickSort är snabbast men kan ibland bära sig illa åt och blir i värsta fall lika långsam som de visade metoderna. MergeSort är alltid lika effektiv men kräver extra mne om man ska få max effektivitet. Föreläsng 5 Bild 19 av 20 Föreläsng 5 Bild 20 av 20