TDDC30 Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 10 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Lägre gräns för sortering Count sort, Bucket sort, Radix sort Utval, Quickselect 1
Beslutsträd Ja Är du stressad? Nej Ta ett bad, Jobba mindre. Ja Har du jobbat 40 timmar den här veckan? Nej Vill du äta pizza ikväll? Sluta slöa, jobba mer. Ja Nej Beställ en capricciosa. Laga fiskgratäng. 2 => Detta är ju ett binärt träd! Löven är utfall.
Beslutsträd (2) Spelkväll vad ska vi spela? Tillgängliga spel är våra utfall.. Ja? Nej Med hur få frågor kan vi välja spel? (Hur kort kan vi göra trädet?) Fia m. knuff Schack Vem där? Poker Monopol Risk Yatzy Backgammon
Beslutsträd (3) Ja Spelkväll vad ska vi spela? Tillgängliga spel är våra utfall.. Är vi hos Johan? Nej Ja ålder < 7 år? Ja Nej Fler än 2? Gillas bluff? Nej Ja Nej Gillas krig? Ja Ja Fler än 2? Nej Gillas tärningar? Ja Nej Nej Fia m. knuff Schack Vem där? Poker Monopol Risk Yatzy Backgammon
Beslutsträd (4) Spelkväll vad ska vi spela? Tillgängliga spel är våra utfall.. Vi kan inte få trädet kortare än höjd 3. Detta eftersom vi inte kan sålla bort mer än hälften av alla spel för varje fråga. För n utfall blir alltså trädet som kortast: log(n) i höjd.
Sortering, lägre gräns Vi kan se en sorteringsalgoritm som ett beslutsträd. Ställer frågor av typen: Är elementet på plats i mindre än elementet på plats j? Utfallen är permutationer (omordningar) av sekvensen som skall sorteras. 6
Sortering, lägre gräns (2) Hur många utfall har vi? => Antal permutationer. n = 2, t.ex. (a, b) a b b a Totalt 2 st n = 3, t.ex. (a, b, c) a b c b a c a c b b c a c b a c a b Totalt 6 st n = 4, t.ex. (a, b, c, d) a b c d a d b c b a c d b d a c a c b d a d c b b c a d b d c a c b a d c d b a c a b d c d a b a b d c d a b c b a d c d b a c a c d b d a c b b c d a d b c a c b d a d c b a c a d b d c a b Totalt 24 st n = 5, t.ex. (a, b, c, d, e) a b c d e b a c d e Totalt 120 st n element att sortera => n! permutatoner 7
Sortering, lägre gräns För godtycklig jämförande sorteringsalgoritm: n! möjliga svar => n! brett träd log(n!) högt träd log(n!) >= n log (n) (bevis: se boken) D.v.s. en jämförelsebaserad sorteringsalg behöver göra minst nlog(n) jämförelser! Alltså: algoritmer för jämförelsebaserad sortering är Ω(nlog(n))! 8
Count sort Strategi: Räkna hur många gånger varje tal förekommer Algoritm: 1. Dimensionera ett fält c efter värdet på största elementet som ska sorteras (N), sätt startvärde 0 på varje index 2. Gå igenom de osorterade siffrorna: För varje påträffat tal t, räkna upp siffran på c[t] med ett. 3. Gå igenom c: För varje index j i c, lägg till c[j] st av j i målfältet. 9 4 3 3 3 3 4 9 C: 0 0 0 12 0 10 0 0 0 0 10 0 1 2 3 4 5 6 7 8 9 9 N
Count sort(2) Analys: Räkna antal element av varje sort, lagra i arrayen: O(n) Fyll sekvensen med det antal element som anges i arrayen: O(n+N) T countsort = O(n) + O(n+N) = O(n+N) N = största elementet, n antal element Då N << n => O(n) Snabbare än den teoretiska gränsen??! Ja, men är ej en jämförelse-algoritm Kan bara sortera element i ett begränsat intervall 10
Bucket sort (Även kallad pigeonhole sort, bin sort. Definitionen varierar.) Algoritm: 1. Skapa lika många hinkar (buckets) som värdet på största elementet (+1 om 0 hör till nyckelmängden) 2. Lägg varje element i den hink vars index är samma som elementets värde 3. Med början vid hink 1 (index 0), ta ut alla elementen ur varje hink och placera dem efter varandra (3 ) (5 ) (3 ) (1 ) 0 1 2 3 4 5 11 (1 ) (3 ) (3) (5)
Bucket sort(2) Analys: Klarar även av att sortera värden där nycklar är associerade med data (jämför count sort) Stabil? Beror på.. Implementation?! Komplexitet? Beror på.. T skapa fält + T fyll hinkarna + T töm hinkarna = O(1) + O(n) + O(n+N) N = största elementet, n antal element Då N << n: O(n) (ej en jämförelse-algoritm) 12
Sammansatta nycklar Nycklar är inte nödvändigtvis heltal Kan bestå av delnycklar Exempel: Punkter i plan (2 delnycklar (x, y) ) Datum (3 delnycklar (år, månad, dag)) Strängar (varje tecken är en delnyckel) Objekt innehållandes namn, ålder, skostorlek, etc Lexiografisk ordning: Låt delnycklar ha olika signifikans I första hand gäller den första delnyckeln I andra hand gäller den andra delnyckeln Och så vidare.. 13
Radix sort Sortera data med flera delnycklar lexiografiskt Algoritm: Sortera varje delnyckel för sig med en stabil Bucketsort Minst eller mest signifikanta nyckel först? public static void radixsort(string[] a, int noofsubkeys){ for (int i = noofsubkeys-1; i >= 0; --i) { //bucket sort with respect to the i:th key } } 14
Radix sort(2) Analys: Antag d antal delnycklar, bucketsort utförs för varje delnyckel T radixsort (d, n, N) = O(d(n + N)) Antag även att N << n och d begränsad av en konstant T radixsort(d, n) =O(n) Stabil? Ja Slutbetraktelse: Kan generaliseras till att använda andra stabila sorteringsalgoritmer. T lexiographicsort = O(d * T(n)) 15
Jämförelse Allmänt Vi har studerat O(n 2 ) och O(nlog(n)) O(n 2 )-algoritmer kan vara bra i vissa fall Selectionsort Alltid O(n 2 ) alltid långsam, men endast n byten (värsta fall)! Insertionsort Bästa fall O(n), värsta fall O(n 2 ) Bra på små arrayer (<50) och där data är nästan sorterad Lätt att implementera 16
Jämförelse(2) Shellsort Utnyttjar insertionsorts bra sidor och försöker undvika de dåliga Tänjer på insertionsorts gränser Svår att analysera, beror på vald lucksekvens O(n 2 ), O(n 1.5 ), O(n 1.33 ), O(nlog(n)) Mergesort Optimal algoritm: O(nlog(n)) Kräver extra minne O(n) Ideal för sortering på externt minne färre diskåtkomster Quicksort I medelfallet snabbaste sorteringsalgoritmen O(nlog(n)) Vanlig i klassbibliotek (börjar dock ersättas av t.ex. Timsort) O(n 2 ) i värstafallet, använd ej i realtidsapplikationer 17
Jämförelse(3) Heapsort Mycket snabb - O(nlog(n)) I praktiken långsammare än Quicksort i medelfallet Bäst i värstafallet Bra för realtidsapplikationer! Countsort, Bucketsort Ej jämförande algoritmer Bra om nyckelmängden är liten och kan avbildas på heltal Snabbare än Quicksort och Heapsort, O(n) Radixsort Användbar när det finns delnycklar som måste respekteras I övrigt som Bucketsort 18
Utval Harry har fått i uppdrag att välja en ny kollega bland alla kandidater. Han får en lång, osorterad lista och uppmanas att välja den person som har tredje lägst löneanspråk (mer har de inte råd med). Lösning: 1. Sortera personerna i ett fält med en klokt vald sorteringsalgoritm 2. Returnera den n:te personen i fältet O(nlog(n)). Borde väl kunna gå snabbare? Observation: Att hitta det största/minsta värdet går på O(n)... 19
Quickselect Välj pivot Partitionera i tre delar L - elementen mindre än pivot E - pivot-elementet G - elementen större än pivot Partitionera igen med enn av partitionerna beroende på sökt i L (tredje minsta finns någonstans här) E G 20
Quickselect(2) Analys: Mycket lik Quicksort Går att implementera in-place och out-of-place Viktigt att välja bra pivotelement Värstafallet: O(n 2 ) Medelfallet: O(n) 21