sortering i lineær tid - hiof.nolarsvmag/itf20006_14/forelesning08.pdfsorterings i lineˆr tid...

22
Sortering i Lineær Tid Lars Vidar Magnusson 5.2.2014 Kapittel 8 Counting Sort Radix Sort Bucket Sort Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

Upload: others

Post on 15-Feb-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

  • Sortering i Lineær Tid

    Lars Vidar Magnusson

    5.2.2014

    Kapittel 8

    Counting Sort

    Radix Sort

    Bucket Sort

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Sammenligningsbasert Sortering

    Sorteringsalgoritmene vi har sett p̊a s̊a langt har alle værtsammenligningsbaserte algoritmer i.e de sorterer ved åsammenligne verdiene som skal sorteres.

    Sammenligningsbaserte sorteringsalgoritmer har en asymptotisk grense p̊aΩ(n log n).

    Heapsort og Merge-Sort har begge asymptotisk optimal kjøretid.

    Quicksort har forventet optimal kjøretid.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Sorterings i Lineær Tid

    Siden Ω(n log n) er nedre grense for hvor raske sorteringsalgoritmerkan bli ved å sammenligne verdier, må vi ty til andre teknikker forå forbedre kjøretiden.

    Vi skal se p̊a tre algoritmer som alle sammen kan sortere et sett med elementeri lineær tid.

    Counting-Sort

    Radix-Sort

    Bucket-Sort

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Counting-Sort Algoritmen

    Counting-Sort fungerer p̊a det premisset at tallene som skalsorteres er heltall mellom 0 og k i.e. {0, 1, 2, . . . , k}.

    Den fungerer ved å telle seg frem til hvilken posisjon hvert element må hai output array.

    Input er en array A[1 . . . n] hvor A[j ] ∈ {0, 1, 2, . . . , k} for j = 1, 2, . . . , n.

    Output er en array B[1 . . . n] med elementene i sortert rekkefølge.

    Algoritmen benytter seg av en array C [0 . . . k] under kjøring.

    Counting-Sort er en s̊akalt stabil sorteringalgoritme i.e at relativposisjonering mellom like elementer ivaretas.

    Algoritmen er ikke en in-place algoritme siden den kopierer verdiene overi output array.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Counting-Sort Pseudokode

    Under er pseudokoden for Counting-Sort algoritmen.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Counting-Sort Kjøring

    Diagrammene under illustrerer hvordan Counting-Sort kjørerp̊a et inputeksempel.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Analyse av Counting-Sort

    Vi kan enkelt analysere Counting-Sort algoritmen ved å telleløkker.

    Vi har to løkker gjennom k

    Vi har to løkker gjennom n

    Counting-Sort er Θ(n + k), som er Θ(n) hvis k = O(n).

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Hvor Stor k Er Effektivt i Praksis?

    Effektiviteten til Counting-Sort avhenger av størrelsen til k i.e.hvor store tallen kan være.

    Det er størrelsen p̊a arbeids arrayet C som steller til problemer.

    Det ville vært ineffektivt å sortere 32-bits verdier da C ville vært4 · 232 ≈ 17TB stor, hvis vi bruker 4 bytes per verdi.16-bits verdier blir vesentlig bedre med en størrelse p̊a C p̊a bare4 · 216 ≈ 262MB.8-bits verdier ville krevd en størrelse p̊a bare 4 · 28 = 1Mb, men vi måvære obs p̊a størrelsen til n.

    4-bits verdier ville ikke krevd stort av lagringsplass, s̊a her blir fokusetskiftet over til hvorvidt n er liten nok til at Insertion-Sort er et bedrealternativ.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Radix-Sort Algoritmen

    Radix-Sort algoritmen er hvordan IBM tjente sine førstemillioner. Kortsorterere fungerte ved å titte p̊a en kolonne omgangen.

    Nøkkelen i algoritmen ligger i å sortere tallene utifra de ulike sifferne i hverttall, hvor vi begynner med den med lavest verdi (least significant digit) ogjobber oss mot den største i.e vi jobber fra høyre mot venstre.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Kjøring av Radix-Sort

    Diagrammet under viser hvordan Radix-Sort funger p̊a etinputeksempel.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Analyse av Radix-Sort

    Radix-Sort krever en stabil sorteringsalgoritme for å sortere p̊ahvert siffer. Counting-Sort er et vanlig valg.

    Counting-Sort har kjøretid p̊a Θ(n + k) hvor k er maksverdi for etsiffer.

    Vi har d antall siffer i hvert tall

    Den totale kjøretiden til Radix-Sort blir da Θ(d(n + k)).

    Hvis k = O(n) s̊a er Radix-Sort = Θ(dn).

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Hvordan Finne Et Effektivt Antall Siffer

    For å f̊a Radix-Sort til å kjøre effektiv må vi finne et effektivantall siffer.

    n elementer som skal sorteres

    b bits per element

    Del opp tallene/elementene i r -bit siffere. Vi f̊ar da d = db/re siffer, ogvi f̊ar 2r − 1 mulige verdier.

    Et eksempel: 32-bit tall, 8-bit siffere. Vi f̊ar da b = 32, r = 8,d = 32/8 = 4 og k = 28 − 1 = 255.

    Kjøretiden blir da Θ(br (n + 2r )) og vi må velge fornuftig r .

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Hvordan Finne Fornuftig r

    Å velge fornuftig verdi for r , antall bits i hvert siffer, må vibalansere b/r og n + 2r .

    Uten å g̊a dypere i grunnlaget s̊a kan vi si at hvis vi velger r ≈ log n s̊af̊ar vi Θ( blog n (n + n)) = Θ(bn/ log n).

    Hvis vi velger r < log n s̊a vil b/r < b/ log n som fører til at n + 2r leddetikke forbedres.

    Hvis vi velger r > log n s̊a vil n + 2r leddet bli stort, som raskt kan lede tilen kvadatisk algoritme.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Bucket-Sort Algoritmen

    Bucket-Sort er en lineær sorteringsalgoritme for flyttall.

    Den fungerer ved å anta at input er uniformt fordelt over intervallet [0, 1).

    Del opp [0, 1) i n like deler, eller bøtter

    Fordel inputtallene ut i de tilhørende bøttene

    Sorter hver bøtte med Insertion-Sort

    Gå gjennom hver bøtte i rekkefølge og sett sammen resultatet.

    Bucket-Sort bruker en array med lenkede lister for å representere bøttene i.e.den er ikke in-place.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Bucket-Sort Pseudokode

    Pseudokoden for Bucket-Sort er listet under.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Kjøring av Bucket-Sort

    Diagrammet under viser hvordan Bucket-Sort kjører p̊a etinputeksempel.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Analyse av Bucket-Sort

    Analysen av Bucket-Sort er litt mere komplisert enn de andrelineære algoritmene vi har studert pga. sorteringen av bøttene medInsertion-Sort.

    En analyse er bygget p̊a følgende antagelser og intuisjoner.

    Algoritmens effektivitet avhenger av at hver bøtte har f̊a elementer.

    Hvis hver bøtte har et konstant antall elementer vil det ta en konstant tidå sortere dem.

    Vi forventer at hver bøtte har f̊a elementer siden vi har like mange bøttersom tall i.e gjennomsnittet er et element i hver.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Detaljert Analyse av Bucket-Sort

    F̊ar å utføre en detaljert analyse kan atter en dra nytte av indikatorvariable.

    Vi lar ni være en tilfeldig variabel som angir antallet elementer i bøtte i .

    Siden Insertion-Sort er kvadratisk f̊ar vi at T (n) = Θ(n) +∑n−1

    i=0 O(n2i ).

    Da f̊ar vi forventet kjøretid

    E [T (n)] = E

    [Θ(n) +

    n−1∑i=0

    O(n2i )

    ]

    = Θ(n) +n−1∑i=0

    E [O(n2i )]

    = Θ(n) +n−1∑i=0

    O(E [n2i ])

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Detaljert Analyse av Bucket-Sort

    For å fullføre analysen må vi finne E [n2i ].

    Vi definerer en indikator variabel Xij = I{A[j ] havner i bøtte i}.

    Sansynligheten for at A[j ] havner i bøtte i definerer vi som Pr{Xij} = 1/n.

    Med dette kan vi definere ni matematisk som ni =∑n

    j=1 Xij .

    E [n2i ] = E

    [(n∑

    j=1

    Xij

    )2]

    = E

    n∑j=1

    X 2ij + 2n−1∑j=1

    n∑k=j+1

    XijXik

    =

    n∑j=1

    E [X 2ij ] + 2n−1∑j=1

    n∑k=j+1

    E [XijXik ]

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Detaljert Analyse av Bucket-Sort

    Vi trenger å finne E [X 2ij ] og E [XijXik ] for å fullføre analysen.

    E [X 2ij ] = 02 ·(

    1− 1n

    )+ 12 · 1

    n

    =1

    n

    Siden j 6= k (de er uavhengige) s̊a kan vi si at

    E [XijXik ] = E [Xij ]E [Xik ]

    =1

    n· 1n

    =1

    n2

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Detaljert Analyse av Bucket-Sort

    Da har vi alt vi trenger for å finne det forventede antall elementer ibøtte i (E [n2i ]).

    E [n2i ] =n∑

    j=1

    1

    n+ 2

    n−1∑j=1

    n∑k=j+1

    1

    n2

    = n · 1n

    + 2

    (n

    2

    )1

    n2

    = 1 + 2 · n(n − 1)2

    · 1n2

    = 1 +n − 1n

    = 2− 1n

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014

  • Detaljert Analyse av Bucket-Sort

    Da kan vi omsider finne den forventede kjøretiden tilBucket-Sort.

    E [T (n)] = Θ(n) +n−1∑i=0

    O(2− 1/n)

    = Θ(n) + O(n)

    = Θ(n)

    S̊a intuisjonen v̊ar om kjøretiden til algoritmen stemte.

    Legg merke til at dette bare gjelder dersom listen med elementer eruniformt fordelte.

    Lars Vidar Magnusson Algoritmer og Datastrukturer 2014