Magnus Nielsen, IDA, Linköpings universitet

Relevanta dokument
Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 11 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tommy Färnqvist, IDA, Linköpings universitet. 1 Sortering Heap-sort Merge-sort Sammanfattning... 10

Föreläsning 9. Sortering

Föreläsning 11 Innehåll

Föreläsning 12. Söndra och härska

Algoritmer, datastrukturer och komplexitet

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 12 Innehåll

Föreläsning 12. Söndra och härska

Sökning och sortering

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Algoritmer, datastrukturer och komplexitet

Föreläsning 12 Innehåll

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Några svar till TDDC70/91 Datastrukturer och algoritmer

Programmering för språkteknologer II, HT2014. Rum

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Vad har vi pratat om i kursen?

Tommy Färnqvist, IDA, Linköpings universitet

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Lösningar Datastrukturer TDA

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

SORTERING OCH SÖKNING

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

Sortering. Intern/ extern? Antaganden. Vad kan vi kräva? Rank sort. Rank sort. På en nod/ distribuerad? Jämförelsebaserad/ icke jämförelsebaserad?

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Teoretisk del. Facit Tentamen TDDC (6)

Tommy Färnqvist, IDA, Linköpings universitet

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Datastrukturer och algoritmer

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

ID1020: Quicksort. Dr. Jim Dowling kap 2.3. Slides adapted from Algoritms 4 th Edition, Sedgewick.

Träd Hierarkiska strukturer

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Rekursion och induktion för algoritmkonstruktion

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 10 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT037)

Föreläsning 5 Innehåll

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Föreläsning 13. Rekursion

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Teoretisk del. Facit Tentamen TDDC (6)

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

TDDI16 Datastrukturer och algoritmer Övningsuppgifter hösten 2014

Tentamen Datastrukturer för D2 DAT 035

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Datastrukturer D. Föreläsning 2

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Kapitel 7: Analys av sorteringsalgoritmer

Sökning och sortering

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Problemlösning och algoritmer

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Algoritmer, datastrukturer och komplexitet

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 13 Innehåll

Föreläsning 5: Dynamisk programmering

Rekursion och induktion för algoritmkonstruktion

Föreläsning 4 Datastrukturer (DAT037)

Algoritmer och datastrukturer TDA143

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

Föreläsning 13 Datastrukturer (DAT037)

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Tentamen Datastrukturer D DAT 036/INN960

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

TDDC91 & TDDE22 & 725G97 Datastrukturer och algoritmer Datortentamen (DAT1) , 08 12

Rekursion och induktion för algoritmkonstruktion

Tentamen kl Uppgift 4. Uppgift 5

Seminarium 13 Innehåll

Programmering för språkteknologer II. OH-serie: Sökning och sortering. Algoritm

Rekursiva algoritmer sortering sökning mönstermatchning

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Facit Tentamen TDDC (7)

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Datastrukturer och algoritmer

Objektorienterad Programmering DAT043. Föreläsning 10 13/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

Datastrukturer. föreläsning 9. Maps 1

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Sökning och sortering. Linda Mannila

Linjär sökning. Föreläsning 12. Binär sökning. Exempel: Binära sökträd. Binärt sökträd

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Transkript:

Föreläsning 7 Introduktion till sortering TDDC91,TDDE22,725G97: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 24 september 2018 Magnus Nielsen, IDA, Linköpings universitet 7.1 1 Sortering 1.1 Introduktion Sorteringsproblemet Indata: En lista L innehållande data med nycklar från en linjärt ordnad mängd K Utdata: En lista L innehållande samma data sorterat i stigande ordning m.a.p. nycklarna Exempel [8,2,9,4,6,10,1,4] [1,2,4,4,6,8,9,10] 7.2 Varför så många algoritmer? Olika typer av indata som ska sorteras Olika grader av sortering redan gjord Olika storlekar på indata Olika förutsättningar / syfte för programmet som utför sorteringen 7.3 Aspekter på sortering In-place vs använda extra minne Internt vs externt minne Stabil vs icke stabil Jämförelsebaserad vs digital 7.4 Strategier Sortering genom insättning Titta efter rätt plats att sätta in varje nytt element som ska läggas till i den sorterade sekvensen... linjär insättning, Shell-sort,... Sortering genom urval Sök i varje iteration i den osorterade sekvensen efter det minsta kvarvarande datat och lägg det till slutet av den sorterade sekvensen... rakt urval, Heap-sort,... Sortering genom platsbyten Sök fram och tillbaka i något mönster och byt plats på par i fel inbördes ordning så fort ett sådant upptäcks... Quick-sort, Merge-sort,... 7.5 1

1.2 Nybörjarsortering Bubble sort Börja från första index, bubbla fram till sista index, eller vice versa. Upprepa lika många gånger som det finns index, I varje varv bubblas största (eller sjunker minsta, beroende på implementation) kvarvarande elementet till sin rätta plats. Kan effektiviseras lite: exempelvis genom att bubbla ett steg kortare varje varv. 7.6 1.3 Insättningssortering (Linjär) insättningssortering Algoritmen är in-place! Dela arrayen som ska sorteras A[0,...,n 1] i två delar A[0,...,i 1] som är sorterad A[i,...,n 1] ej ännu sorterad Initialt är i = 1, i vilket fall A[0,...,0] (trivialt) är sorterad procedure INSERTIONSORT(A[0,...,n 1]) for i = 1 to n 1 do sätt in A[i] i rätt (=sorterad) position i A[0,...,i 1] 7.7 Insertion sort Utgå från andra positionen (första positionen är redan sorterad ) Är nyckeln på denna position mindre än nyckeln på föregående position? Om så är fallet: byt plats på dem (swap) och fortsätt mot början av den sorterade delen Om så ej är fallet: den sorterade delen är sorterad Utgå från nästa position Upprepa för resten av den osorterade mängden 7.8 Exempel: Visualisering av Insertion-sort 1 2 3 4 7.9 Värstafallsanalys av Insertion-sort 1: procedure INSERTIONSORT(A[0,...,n 1]) 2: for i = 1 to n 1 do 3: inner i; x A[i] 4: while inner 1 and A[inner 1] > x do 5: A[inner] A[inner 1]; inner inner 1 6: A[inner] x 2

rad 2 : n 1 pass rad 3 : n 1 pass rad 4 : Låt I vara antalet iterationer i värsta fallet av innerloopen: I = 1 + 2 +... + (n 1) = n(n 1)/2 = (n 2 n)/2 rad 5 : I pass rad 6 : n 1 pass Totalt: rad 2 + rad 3 + rad 4 + rad 5 + rad 6 = 3(n 1) + (n 2 n) = n 2 + 2n 3 Alltså O(n 2 ) i värsta fallet... men bra om sekvensen nästan sorterad 7.10 1.4 Urvalssortering (Rak) urvalssortering Algoritmen är in-place! Dela arrayen som ska sorteras A[0,...,n 1] i två delar A[0,..., i 1] som är sorterad (alla element mindre än eller lika med A[i,..., n 1]) A[i,...,n 1] ej ännu sorterad Initialt är i = 0, d.v.s. den sorterade delen är tom (och trivialt sorterad) procedure SELECTIONSORT(A[0,...,n 1]) for i = 0 to n 2 do hitta ett minimalt element A[ j] i A[i,...,n 1] byt plats på A[i] och A[ j] 7.11 Selection sort Utgå från första positionen Hitta minsta elementet i mängden, och swappa till den position vi utgår ifrån Utgå från nästa plats Upprepa för resten av mängden, lika många gånger som det finns platser 7.12 Exempel: Visualisering av Selection-sort 1 2 3 4 7.13 Värstafallsanalys av Selection-sort 1: procedure SELECTIONSORT(A[0,...,n 1]) 2: for i = 0 to n 2 do 3: s i 4: for j i + 1 to n 1 do 5: if A[ j] < A[s] then s j 6: SWAP(A[i], A[s]) 3

rad 2 : n 1 pass rad 3 : n 1 pass rad 4 : Låt I vara antalet iterationer i värsta fallet av innerloopen: I = (n 2) + (n 3) +... + 1 = (n 1)(n 2)/2 = (n 2 3n + 2)/2 rad 5 : I pass rad 6 : n 1 pass Totalt: rad 2 + rad 3 + rad 4 + rad 5 + rad 6 = 3(n 1) + (n 2 3n + 2) = n 2 1 O(n 2 ) 7.14 1.5 Divide-and-conquer Principen söndra-och-härska för algoritmkonstruktion söndra: dela upp problemet i mindre, oberoende, delproblem härska: lös delproblemen rekursivt (eller direkt om trivialt) kombinera lösningarna till delproblemen till en lösning till ursprungsproblemet Typexempel: Merge-Sort Eng. divide-and-conquer 7.15 Exempel: Söndra-och-härska 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 10 6 8 12 7 9 1 5 8 13 2 5 16 20 3 4 10 6 8 7 12 1 9 5 8 2 13 5 16 3 20 4 6 8 10 1 7 9 12 2 5 8 13 3 5 1620 1 4 6 7 8 9 1012 2 3 5 5 8 131620 1 2 3 4 5 5 6 7 8 8 9 1012131620 7.16 Exempel: Söndra-och-härska 4 10 6 8 12 7 9 1 5 8 13 2 5 1620 3 4 6 7 1 5 2 5 3 10 8 12 9 8 131620 4 1 2 3 6 7 5 5 10 8 9 8 12131620 1 2 4 3 5 5 6 7 8 8 10 9 1213 1620 1 2 3 4 5 5 6 7 8 8 9 10 1213 1620 1 2 3 4 5 5 6 7 8 8 9 10 12131620 1 2 3 4 5 5 6 7 8 8 9 1012131620 1 2 3 4 5 5 6 7 8 8 9 1012131620 7.17 1.6 Quick-sort Quick-sort Quick-sort är en randomiserad sorteringsalgoritm baserad på paradigmet söndra-och-härska söndra: välj slumpvist (eller enligt en algoritm) ett element x (kallat pivot) och partitionera Seq till Less element mindre än x Eq element lika med x 4

Grt element större än x härska: sortera Less och Grt kombinera Less, Eq och Grt x x L E G x Val av pivot-element Många olika sätt att välja pivot-element: Slumpa ett pivot-element Elementet längst till höger eller vänster Medianen av tre (ex: vänster, mitten och höger) etc 7.18 7.19 Partitionering Vi partitionerar indatasekvensen på följande vis: Vi tar bort, i tur och ordning, varje element y från Seq och Vi sätter in y i Less, Eq eller Grt beroende på resultatet av jämförelsen med pivot-elementet x Varje insättning och borttagning är i början eller slutet av en sekvens och tar alltså O(1) tid Alltså tar partitioneringssteget i quick-sort O(n) tid Partitionering function PARTITION(Seq, pivot) Less, Eq, Grt tomma sekvenser x Seq.REMOVE(pivot) while Seq.ISEMPTY() do y Seq.REMOVE(Seq.FIRST()) if y < x then Less.INSERTLAST(y) else if y = x then Eq.INSERTLAST(y) else Grt.INSERTLAST(y) return Less, Eq, Grt 7.20 7.21 Quick-sortträdet Exekveringen av quick-sort kan visualiseras som ett binärt träd Varje nod representerar ett rekursivt anrop till quick-sort och lagrar Osorterad sekvens före exekveringen och dess pivot Sorterad sekvens efter exekveringen Roten är ursprungsanropet Löven är anrop på delsekvenser av storlek 0 eller 1 5

7 4 9 6 2 2 4 6 7 9 4 2 2 4 7 9 7 9 2 2 9 9 7.22 Val av pivot 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 7 2 9 4 2 4 7 9 3 8 6 1 1 3 8 6 2 2 9 4 4 9 3 8 8 7.23 Partitionering, rekursivt anrop, val av pivot 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 2 4 7 9 3 8 6 1 1 3 8 6 2 2 9 3 8 8 7.24 Partitionering, rekursivt anrop, basfall 6

7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 2 4 7 3 8 6 1 1 3 8 6 1 1 3 8 8 7.25 Rekursivt anrop,..., basfall, kombinera 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 1 2 3 4 3 8 6 1 1 3 8 6 1 1 4 3 3 4 3 8 8 7.26 Rekursivt anrop, val av pivot 7.27 7

Partitionering,..., rekursivt anrop, basfall 7 2 9 4 3 7 6 1 1 2 3 4 6 7 8 9 2 4 3 1 1 2 3 4 7 9 7 1 1 3 8 6 1 1 4 3 3 4 8 9 9 7.28 Kombinera, kombinera 7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9 2 4 3 1 1 2 3 4 7 9 7 17 7 9 1 1 4 3 3 4 8 9 9 7.29 Exekveringstid i värsta fallet Värsta fallet för quick-sort uppkommer när pivotelementet är ett unikt minimalt eller maximalt element en av L eller G har storlek n 1 och den andra har storlek 0 Exekveringstiden blir proportionell mot summan n + (n 1) +... + 2 + 1 Alltså, värstafallstiden för quick-sort är O(n 2 ) 7.30 Exekveringstid i värsta fallet 8

djup 0 1 tid n n-1 n-1 1 7.31 9