Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Sorterings- Algoritmer Algoritmer og Datastrukturer.

Liknende presentasjoner


Presentasjon om: "Sorterings- Algoritmer Algoritmer og Datastrukturer."— Utskrift av presentasjonen:

1 Sorterings- Algoritmer Algoritmer og Datastrukturer

2 Hva er sortering? Input: en sekvens av N nummer Output: reorganisering input-sekvensen slik at: Vi søker algoritmer som gjør dette på en korrekt og effektiv måte. a 1 < a 2 < a 3... < a n-1 < a n

3 Hvorfor sortering? Den største grunnen til at det er så viktig å kunne sortere et sett av elementer er at mange andre problem blir lettere å løse dersom elementene er sortert

4 Applikasjoner til sortering Søking: Binær søking finner ut om et element er i en ordliste i O(lg n) tid  Å gjøre søking raskere er vel det viktigste bruksområdet til sortering Nærmeste nabo: Gitt n nummer, finn paret som er nærmest hverandre  Med en gang nummerene er sortert, vil de nærmeste parene ligge ved siden av hverandre, slik at en O(n) linjær søking gjør jobben

5 Applikasjoner til sortering Element-Unikhet: Gitt et sett av n elementer, er de alle unike eller finnes der duplikater? Medianer og seleksjon: Hva er det k-te største elementet i en liste? Frekvens distrubisjoner: Gitt et sett av n elementer, hvilket element opptrer flest ganger i settet?

6 Hvordan kan vi sortere? Begrensinger til CPU  Kan bare gjøre en operasjon av gangen,  Siden en sammen- ligning er en operasjon, fører dette til at vi bare kan sammenligne to elementer samtidig når vi skal sortere  Men kan gjøre denne sammenligningen veldig raskt.

7 Repetisjon Trær Sorterings-Algoritmer

8 Trestrukturer: Begreper R A BC D FG H Rot Søskennoder A’s barn (venstre) R’s subtre B og C’s Mor/Far-node Grener Noder Terminalnode, (endenode, løvnode) A’s barn (høyre)

9 Egenskap Binært-Søke-Tre Et binært søketre er organisert som et binærtre, og har følgende egenskap Operasjoner på et binært søketre, er derfor proposjonal med høyden på treet 5 3 52 7 8 ≤≤ ≤ O(lg n)

10 Haug-Sortering Sorterings-Algoritmer

11 Hva er en Haug (Heap)? En haug er et komplett binærtre,  der alle nivå er fylt opp,  untatt eventuelt det siste,  som er fylt opp fra venstre til høyre En haug brukes til blant annet  Prioritetskøer og til  Haugsortering (Heapsort)

12 Haug : Datastruktur Binærtre som er lagret i indekserbar variabel (array) 16 1410 879 2 3 4 2 1 4657 3 98 161014879324 132456789 ≥x≥x x ≤x≤x≤x i/2 i 2i 2i+1 Generelle far/barn relasjoner rot (Heap-egenskapen)

13 ”Max-Heapify”: O(lg n)  Subrutine som vedlikeholder Heap-egenskapen, ...dvs at barna til roten er mindre enn roten 16 410 1479 2 3 8 2 1 4657 3 Max-Heapify(A,i) l = left(i) r = right(i) if l ≤ heap-size[A] and A[l] > A[i] then largest = l else largest = i if r ≤ heap-size[A] and A[r] > A[largest] then largest = r if largest ≠ i then exchange A[i] ↔ A[largest] Max-Heapify(A,largest) i

14 ”Max-Heapify”: O(lg n)  Subrutine som vedlikeholder Heap-egenskapen, ...dvs at barna til roten er mindre enn roten 16 1410 479 2 3 8 2 1 4657 3 1 Max-Heapify(A,i) l = left(i) r = right(i) if l ≤ heap-size[A] and A[l] > A[i] then largest = l else largest = i if r ≤ heap-size[A] and A[r] > A[largest] then largest = r if largest ≠ i then exchange A[i] ↔ A[largest] Max-Heapify(A,largest) i

15 ”Max-Heapify”: O(lg n)  Subrutine som vedlikeholder Heap-egenskapen, ...dvs at barna til roten er mindre enn roten 16 1410 879 2 3 4 2 1 4657 3 1 Max-Heapify(A,i) l = left(i) r = right(i) if l ≤ heap-size[A] and A[l] > A[i] then largest = l else largest = i if r ≤ heap-size[A] and A[r] > A[largest] then largest = r if largest ≠ i then exchange A[i] ↔ A[largest] Max-Heapify(A,largest) i

16 Build-Max-Heap : O(n) Lager en heap fra en (ikke-ordnet) array, i angir de indre nodene i heap’en 431216910 Eksempel 4 13 216910 2 1 465 3 Build-Max-Heap(A) heap-size[A] = length[a] for i = [length[a]/2] downto 1 do heapify(A,i) i

17 Build-Max-Heap : O(n) Lager en heap fra en (ikke-ordnet) array, i angir de indre nodene i heap’en 431216910 Eksempel 4 13 216910 2 1 467 3 Build-Max-Heap(A) heap-size[A] = length[a] for i = [length[a]/2] downto 1 do heapify(A,i) i

18 Build-Max-Heap : O(n) Lager en heap fra en (ikke-ordnet) array, i angir de indre nodene i heap’en 431216910 Eksempel 4 1610 2193 1 4657 3 Build-Max-Heap(A) heap-size[A] = length[a] for i = [length[a]/2] downto 1 do heapify(A,i) i

19 Build-Max-Heap : O(n) Lager en heap fra en (ikke-ordnet) array, i angir de indre nodene i heap’en 431216910 Eksempel 16 410 2193 1 4657 3 Build-Max-Heap(A) heap-size[A] = length[a] for i = [length[a]/2] downto 1 do heapify(A,i)

20 Heapsort-Algoritmen Prosedyre for løsning  Lag heap av tallene (i arrayet)  For tall = [lengden til arrayet] ned til 2 Bytt første tall med array[tall] Reetabler treet for array[1...tall-1]  Ferdig sortert Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1)

21 Heapsort : O(n*lg n) Kjøretid til heapsort  Heapsort tar O(n*lg n) tid Siden kallet til Build-Max-Heap tar O(n) tid og Hver av de n-1 kallene til Heapify tar O(lg n) tid Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1) 1478241 Eksempel 16 410 219

22 Heapsort : O(n*lg n) 1478241 Eksempel 1 87 2414 (2) 14 87 241 (1) i 8 41 2114 (2) Usortert Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1) Kapplinje Max-Heapify(A,1)

23 Heapsort : O(n*lg n) 1478241 Eksempel 1 47 2814 (3) 8 47 2114 (2) i 7 41 2814 (3) Usortert Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1) Kapplinje Max-Heapify(A,1)

24 Heapsort : O(n*lg n) 1478241 Eksempel 2 41 7814 (4) 7 41 2814 (3) i 4 21 7814 (4) Usortert Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1) Kapplinje Max-Heapify(A,1)

25 Heapsort : O(n*lg n) 1478241 Eksempel 1 24 7814 (5) 4 21 7814 (4) i 2 14 7814 (5) Usortert Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1) Kapplinje Max-Heapify(A,1)

26 Heapsort : O(n*lg n) 1478241 Eksempel 1 24 7814 (2) 2 14 7814 (5) i 1 24 7814 (3) Usortert Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] ↔ A[i] heap-size[A] = heap-size[A]-1 Max-Heapify(A,1) Kapplinje Max-Heapify(A,1) 1427814 Sortert : A

27 Prioritetskøer bruker Heap Haugsortering er en glimrende algoritme, men en god implementasjon av quicksort, slår den som regel i praksis Men selve heap-data-strukturen har et stort bruksområde. Den mest populære applikasjonen til en heap er å bruke den som en prioritetskø.

28 Prioritetskøer bruker Heap En prioritetskø er en datastruktur for å holde vedlike et sett av S elementer,...der hvert element har en assosiert verdi En har to typer prioritetskøer:  En max-prioritets-kø  En min-prioritets-kø

29 Prioritets-kø : Operasjoner Operasjoner til en max-prioritets-kø  Insert(S,x), kjøretid O(lg n) setter et element x inn i settet S Setter en node inn i heapen  Maximum(S), kjøretid O(1) returnerer elementet S med den største verdien  Extract-Max(S), kjøretid O(lg n) Returnerer elementet S med den største verdien...og fjerner elementet fra heapen

30 Prioritets-kø : Operasjoner Operasjoner til en max-prioritets-kø  Increase-Key(S,x,k), kjøretid O(lg n) Øker verdien til et element x til en ny verdi k,...som en antar er minst like stor som x Operasjoner til en min-prioritets-kø  Insert(S,x), Minimum(S), Extract-Min(S), Decrease-Key(S,x,k)

31 Merge-Sortering Sorterings-Algoritmer

32 Hva er Merge-Sort? Merge-sortering (flette-sortering) er basert på ”splitt-og-hersk”-paradimet  Splitt: del arrayet med n elementer i 2 deler med n/2 elementer  Hersk: sorter de to halvdelene rekursivt ved kall til ”mergesort”  Kombiner: flett sammen de to halvdelene for å produsere det sorterte arrayet

33 Merge-Sort : Algoritmen Merge-Sort(A,p,r) if p <r then q = [(p+r)/2] Merge-Sort(A,p,q) Merge-Sort(A,q+1,r) Merge(A,p,q,r) Dette gir oss rekurrensen: T(n) = 2T(n/2) + c*n) O(n*lg n) 542613625426136252461326 52461326 254613261223456625461263 splitt hersk kombiner

34 hjelpe array minste AGLORHIMST Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. A

35 hjelpe array minste AGLORHIMST A Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. G

36 hjelpe array minste AGLORHIMST AG Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. H

37 hjelpe array minste AGLORHIMST AGH Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. I

38 hjelpe array minste AGLORHIMST AGHI Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. L

39 hjelpe array minste AGLORHIMST AGHIL Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. M

40 hjelpe array minste AGLORHIMST AGHILM Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. O

41 hjelpe array minste AGLORHIMST AGHILMO Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. R

42 hjelpe array Første halvdel ferdig minste AGLORHIMST AGHILMOR Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. S

43 hjelpe array Første halvdel ferdig minste AGLORHIMST AGHILMORS Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig. T

44 hjelpe array Første halvdel ferdig Andre halvdel ferdig AGLORHIMST AGHILMORST Merging  Hold oversikt over det minste elementet i hver sortert halvdel.  Sett inn det minste av de to elementene i det sorterte arrayet  Gjenta dette til du er ferdig.

45 QuickSort Sorterings-Algoritmer

46 Hva er Quicksort? Quicksort er basert på ”splitt-og-hersk”- paradimet, slik som merge-sort. ...men inneholder i tillegg en viktig subrutine som heter partition Kjøretiden til quicksort er  O(n 2 ) i verste tilfelle, men  O(n*lg n) i gjennomsnitt

47 Idê bak partition Metode som deler arrayet slik at  Elementet a[i] en deler arrayet i er på rett plass  Det ikke er noen større elementer til ventre for i  Det ikke er noen mindre elementer til høyre for i Deretter sorterer quicksort den venstre og høyre delen rekursivt

48 Partitioning Algoritme QUICKSORTISCOOL partitioned partition elementvenstre høyre ikke partitionert - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

49 Partitioning Algoritme Bytt meg partitionert partition elementvenstre høyre ikke partitionert QUICKSORTISCOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

50 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg QUICKSORTISCOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

51 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg QUICKSORTISCOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

52 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg QUICKSORTISCOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

53 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert CUICKSORTISQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

54 Partitioning Algoritme Bytt meg partitionert partition elementvenstre høyre ikke partitionert CUICKSORTISQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

55 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg CUICKSORTISQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

56 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg CUICKSORTISQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

57 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

58 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

59 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

60 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

61 Partitioning Algoritme Bytt meg partitionert partition elementvenstre høyre ikke partitionert CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

62 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

63 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

64 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert Bytt meg CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

65 Partitioning Algoritme Pekere krysser Bytt med partition element partitionert partition elementvenstre høyre ikke partitionert CIICKSORTUSQOOL - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

66 Partitioning Algoritme partitionert partition elementvenstre høyre ikke partitionert partition er ferdig CIICKLORTUSQOOS - Velg partition element til å være det lengst til høyre - Scan fra venstre for et større element - Scan fra høyre for et mindre element - Bytt elementer - Gjenta til pekerne krysser - Bitt partition element med ”kryss-elementet”

67 Quicksort : Algoritmen Quicksort(A,p,r) if p <r then q = Partition(A,p,r) Quiksort(A,p,q-1) Quicksort(A,q+1,r) Partition(A,p,r) x = A[r] i = p-1 for j = p to r-1 do if A[j] ≤ x then i = i+1 exchange A[i] ↔ A[j] return i+1

68 Kjøre-Eksempel 34115962 21145963211459631213596411 2 5964 3 11 4965965 4 65 9 65 Kombinerer sett sammen de sorterte subarrayene 695 Vi få da et sortert array 12134596 Kjøre-eksempel Usortert array

69 ”Worst case Partition” 12n 2n 1 n 2 2n n-1 n T(n) = T(n-1) + O(n) - n - 3 - 2 O(n 2 ) Dårlig pga svært skjeve splittinger; en region med bare ett element og den andre regionen (subarray) inneholder resten av elementene. O(n 2 ) hvis input-array allereder er sortert

70 ”Best-Case Partiton” 1 n n/2 O(n 1,4 lg n) O(n*lg n) Alternerer mellom gode og dårlige delinger Gjennomsnittlig dybde I binærtre = 1,4 lg n Konstanten er mindre enn For noen annen sorteringsrutine

71 ”Average Case Partition” 1 n n/2 T(n) = 2T(n/2) + O(n) O(n*lg n)

72 Hva er Quicksort? Den er i praktiske tilfeller som oftes den beste sorterings-algoritmen  Den er veldig effektiv i gjennomsnitt. Den antatte kjøretiden er O(n*ln n)...der konstantfaktoren er veldig liten  Den sorterer dessuten ”in place”,...der ingen spesielle input lokker frem worst-case-oppførsel  Den fungerer også godt i omgivelser med virtuelle minne

73 Tellesortering Sorterings-Algoritmer

74 Telle-Sortering (Counting-Sort) Sorteringsrutinen antar at hvert av de n- elementene, som skal sorteres, er heltall mellom 1 og k, der k er et heltall Ide: For hvert element x skal antall elementer mindre enn x finnes.  Informasjonen brukes til å plassere x direkte i det sorterte arrayet

75 Plassforbruk Tellesortering Sorteringsrutinen krever stor plass da 3 array brukes  Array A[1..n] som skal sorteres  Array B[1..n] er sortert resultat  Array C[1..k] er temporært arbeidslager Algoritmen sorterer i linjær tid  O(n), k = O(n)

76 Eksempel 4 242678 13245687 132456 B C j = 8 1344 132578 13245687 132456 B C j = 5 144 142578 13245687 132456 B C j = 6 14 142678 13245687 132456 B B j = 7 34613441 13245687 A Array som skal sorteres j 220301 132456 B Antall 4’ere i A 242778 132456 C Antall elementer ≤ 3

77 Eksempel 34613441 13245687 A Array som skal sorteres 220301 132456 B Antall 4’ere i A 11344 032578 13245687 132456 B C j = 4 13144464 022477 13245687 132456 B C j = 1 1134464 032477 13245687 132456 B C j = 2 113444 032478 13245687 132456 B C j = 3 242778 132456 C Antall elementer ≤ 3 SORTERT

78 Radix-Sort Sorterings-Algoritmer

79 Radix-sort Radix-sort er ulik andre sorteringsmetder, ettersom den tar hensyn til strukturen til nøklene som skal sorteres. Element: {t d, t d-1 … t 1 } Minst tellende siffer Mest tellende siffer

80 Radix-sort Sorterer bits fra høyre til venstre Radix-Sort(A,d) for i=1 to d do use a stable sort to sort array A on digit i

81 Analyse Radix-Sort Kjøretiden avhenger av hvilken sorteringsrutine som blir brukt  Couting-sort:  (dn + kd) Nar d er konstant og k = O(n) → O(n) Krever ekstra lagerplass  Quicksort :  (n*log n) Når d er konstant Krever ikke ekstra lagerplass


Laste ned ppt "Sorterings- Algoritmer Algoritmer og Datastrukturer."

Liknende presentasjoner


Annonser fra Google