• No results found

Sortering 2: Sammanfattning, Intressanta algoritmer, Undre gräns för sortering, Sortering i linjär tid? TDDE22, 725G97: DALG.

N/A
N/A
Protected

Academic year: 2022

Share "Sortering 2: Sammanfattning, Intressanta algoritmer, Undre gräns för sortering, Sortering i linjär tid? TDDE22, 725G97: DALG."

Copied!
69
0
0

Loading.... (view fulltext now)

Full text

(1)

Sortering 2:

Sammanfattning, Intressanta algoritmer, Undre gräns för sortering, Sortering i linjär tid?

TDDE22, 725G97: DALG

Magnus Nielsen

(2)

1 Information 2 Snabb repetition

3 En undre gräns för jämförelsebaserad sor- tering

4 Sortering i linjär tid?

Counting-sort Bucket-sort Radix-sort

5 Intressanta/roliga algoritmer

6 Hålkortsteknologi

(3)

Redovisning vs rättning

Samma upplägg generellt i DALG-kurser.

Redovisning:

• Säkerställa att labben verkar vara klar

• Säkerställa att studenten/erna verkar ha gjort labben (inte någon annan)

• Säkerställa genom stickprov att studenten/erna verkar ha förstått teorin

• Uttryckligen inte ge feedback på kod, eventuell diskussion utan värdering

Rättning:

• Rättning utförs i flera steg:

• Testning av korrekthet / funktionalitet, och om funktionaliteten är korrekt:

• Kodgenomgång: analys av implementation, tidskomplexitet etc. Är det en rimlig / tillräckligt bra lösning?

Endera steget kan ge komplettering. Varför inte båda samtidigt?

(4)

1 Information 2 Snabb repetition

3 En undre gräns för jämförelsebaserad sor- tering

4 Sortering i linjär tid?

Counting-sort Bucket-sort Radix-sort

5 Intressanta/roliga algoritmer

6 Hålkortsteknologi

(5)

Föreläsning 8 Magnus Nielsen 28 september 2020 4

Repetition

• Varför DALG?

”Att lära sig programmering är att lära sig ett hantverk, ungefär som byggarbetare. Behärskar man DALG är man dessutom arkitekt, designer och konstnär”.

–Nästan exakt ungefärligt citat av Alexander Johansson, f.d. Assistent TDDC91/TDDE22/725G97

(6)

Föreläsning 8 Magnus Nielsen 28 september 2020 5

Sammanfattning så långt

zin-place, randomiserad

zsnabbast (bra för stora indata) O(n log n)

förväntad quick-sort

zsekvensiell dataaccess

zsnabb (bra för enorma indata) O(n log n)

merge-sort

zin-place

zsnabb (bra för stora indata) O(n log n)

heap-sort

O(n2) O(n2) Tid

insertion-sort selection-sort

Algoritm Noteringar

zin-place

zlångsam (bra för små indata)

zin-place

zlångsam (bra för små indata)

(7)

1 Information 2 Snabb repetition

3 En undre gräns för jämförelsebaserad sor- tering

4 Sortering i linjär tid?

Counting-sort Bucket-sort Radix-sort

5 Intressanta/roliga algoritmer

6 Hålkortsteknologi

(8)

Föreläsning 8 Magnus Nielsen 28 september 2020 7

Jämförelsebaserad sortering

• Många sorteringsalgoritmer är jämförelsebaserade

• De sorterar genom att göra jämförelser mellan par av objekt

• Exempel: insertion-sort, selection-sort, heap-sort, merge-sort, quick-sort, …

• Låt oss därför försöka härleda en undre gräns för exekveringstiden i värsta fall för varje algoritm som använder jämförelse för att sortera n element x1, x2, . . . , xn

r x Ä i < xj? ja

nej

(9)

Föreläsning 8 Magnus Nielsen 28 september 2020 8

Räkna jämförelser

• Låt oss enbart räkna jämförelser

• Varje möjlig körning av en algoritm motsvaras av en rot-till-lövstig i ettbeslutsträd

xi < xj ?

xa < xb ?

xm < xo ? xp < xq ? xe < xf ? xk < xl ?

xc < xd ?

(10)

Föreläsning 8 Magnus Nielsen 28 september 2020 9

Exempel: Beslutsträd

1:2 2:3

123 1:3

132 312

1:3

213 2:3

231 321

Sort 〈x

1

, x

2

, …, x

n

Varje intern nod är märkt i : j för i, j∈ {1, 2, . . . , n}

• Vänster delträd visar efterföljande jämförelser om xi≤ xj

• Höger delträd visar efterföljande jämförelser om xi≥ xj

(11)

Föreläsning 8 Magnus Nielsen 28 september 2020 10

Exempel: Beslutsträd

1:2 2:3

123 1:3

132 312

1:3

213 2:3

231 321

9 ≥ 4

Sort 〈x

1

, x

2

, x

3

= 〈 9, 4, 6 〉:

Varje intern nod är märkt i : j för i, j∈ {1, 2, . . . , n}

• Vänster delträd visar efterföljande jämförelser om xi≤ xj

• Höger delträd visar efterföljande jämförelser om xi≥ xj

(12)

Föreläsning 8 Magnus Nielsen 28 september 2020 11

Exempel: Beslutsträd

1:2 2:3

123 1:3

132 312

1:3

213 2:3

231 321

9 ≥ 6

Sort 〈x

1

, x

2

, x

3

= 〈 9, 4, 6 〉:

Varje intern nod är märkt i : j för i, j∈ {1, 2, . . . , n}

• Vänster delträd visar efterföljande jämförelser om xi≤ xj

• Höger delträd visar efterföljande jämförelser om xi≥ xj

(13)

Föreläsning 8 Magnus Nielsen 28 september 2020 12

Exempel: Beslutsträd

1:2 2:3

123 1:3

132 312

1:3

213 2:3

231 321

4 ≤ 6

Sort 〈x

1

, x

2

, x

3

= 〈 9, 4, 6 〉:

Varje intern nod är märkt i : j för i, j∈ {1, 2, . . . , n}

• Vänster delträd visar efterföljande jämförelser om xi≤ xj

• Höger delträd visar efterföljande jämförelser om xi≥ xj

(14)

Föreläsning 8 Magnus Nielsen 28 september 2020 13

Exempel: Beslutsträd

1:2 2:3

123 1:3

132 312

1:3

213 2:3

231 321

4 ≤ 6 ≤ 9

Sort 〈x

1

, x

2

, x

3

= 〈 9, 4, 6 〉:

Varje löv innehåller en permutation⟨π(1), π(2), π(i), . . . , π(n)⟩ för att indikera att ordningen xπ(1)≤ xπ(2)≤ . . . ≤ xπ(n) har etablerats

(15)

Föreläsning 8 Magnus Nielsen 28 september 2020 14

Beslutsträdsmodellen

Ett beslutsträd kan modellera exekveringen av vilken jämförelsebaserad sorteringsalgoritm som helst:

• Ett träd för varje storlek på indata

• Betrakta algoritmen som att exekveringen delas närhelst två element jämförs

• Trädet innehåller alla jämförelser längs alla tänkbara följder av instruktioner

• Körtiden för algoritmen = längden av stigen som traverseras

• Körtiden i värsta fall = höjden av trädet

(16)

Föreläsning 8 Magnus Nielsen 28 september 2020 15

Beslutsträdets höjd

• Höjden av beslutsträdet är en undre gräns för exekveringstiden i värsta fallet

• Varje tänkbar permutation av indata måste leda till ett separat utdatalöv

Om det inte vore så skulle något indata . . . 4 . . . 5 . . . ha samma utdataordning som . . . 5 . . . 4 . . . vilket skulle vara fel

• Eftersom det finns n! = 1 · 2 · . . . · n löv är höjden av trädet minst log(n!)

(17)

Föreläsning 8 Magnus Nielsen 28 september 2020 16

Den undre gränsen

• Varje jämförelsebaserad sorteringsalgoritm använder minst log(n!) tid i värsta fallet

• Därför använder en sådan algoritm minst tid log(n!)≥ log(n

2 )n2

= (n/2) log(n/2)

• Alltså är exekveringstiden för alla jämförelsebaserade sorteringsalgoritmer Ω(n log n) i värsta fallet

(18)

1 Information 2 Snabb repetition

3 En undre gräns för jämförelsebaserad sor- tering

4 Sortering i linjär tid?

Counting-sort Bucket-sort Radix-sort

5 Intressanta/roliga algoritmer

6 Hålkortsteknologi

(19)

Föreläsning 8 Magnus Nielsen 28 september 2020 18

Några fall då man kan sortera snabbare än n log n

• Bara ett konstant antal olika element ska sorteras

Θ(n) med räknesortering

• Elementen som ska sorteras är tal som är jämnt fördelade i ett visst intervall

Θ(n) med bucket-sort

• Elementen som ska sorteras är strängar som består av d ”siffror” (S[i] = si,1si,2. . . si,d)

Θ(nd) med radix-sort

Om d är konstant får vi linjär tidskomplexitet

• Om vi räknar antalet siffror i indata får vi linjär tidskomplexitet Θ(N ), där N = nd

(20)

Föreläsning 8 Magnus Nielsen 28 september 2020 18

Några fall då man kan sortera snabbare än n log n

• Bara ett konstant antal olika element ska sorteras

Θ(n) med räknesortering

• Elementen som ska sorteras är tal som är jämnt fördelade i ett visst intervall

Θ(n) med bucket-sort

• Elementen som ska sorteras är strängar som består av d ”siffror” (S[i] = si,1si,2. . . si,d)

Θ(nd) med radix-sort

Om d är konstant får vi linjär tidskomplexitet

• Om vi räknar antalet siffror i indata får vi linjär tidskomplexitet Θ(N ), där N = nd

(21)

Föreläsning 8 Magnus Nielsen 28 september 2020 18

Några fall då man kan sortera snabbare än n log n

• Bara ett konstant antal olika element ska sorteras

Θ(n) med räknesortering

• Elementen som ska sorteras är tal som är jämnt fördelade i ett visst intervall

Θ(n) med bucket-sort

• Elementen som ska sorteras är strängar som består av d ”siffror” (S[i] = si,1si,2. . . si,d)

Θ(nd) med radix-sort

Om d är konstant får vi linjär tidskomplexitet

• Om vi räknar antalet siffror i indata får vi linjär tidskomplexitet Θ(N ), där N = nd

(22)

Föreläsning 8 Magnus Nielsen 28 september 2020 18

Några fall då man kan sortera snabbare än n log n

• Bara ett konstant antal olika element ska sorteras

Θ(n) med räknesortering

• Elementen som ska sorteras är tal som är jämnt fördelade i ett visst intervall

Θ(n) med bucket-sort

• Elementen som ska sorteras är strängar som består av d ”siffror”

(S[i] = si,1si,2. . . si,d)

Θ(nd) med radix-sort

Om d är konstant får vi linjär tidskomplexitet

• Om vi räknar antalet siffror i indata får vi linjär tidskomplexitet Θ(N ), där N = nd

(23)

Föreläsning 8 Magnus Nielsen 28 september 2020 19

Räknesortering

Require: In[1, . . . , n], där In[j]∈ {1, 2, . . . , k}

function CountingSort(In)

Hjälparray för räkning: Count[1, . . . , k]

Hjälparray för lagring av resultatet: Res[1, . . . , n]

for i← 1 to k do

Count[i]← 0 ▷ Sätt räknaren till 0 för varje tal 1..k for j← 1 to n do

Count[In[j]]← Count[In[j]] + 1 ▷ Beräkna antal förekomster av varje tal

for i← 2 to k do

Count[i]← Count[i] + Count[i − 1] ▷ Beräkna startindex för varje tal

for j← n downto 1 do

Res[Count[In[j]]]← In[j] ▷ Lagra resultatet på rätt index Count[In[j]]← Count[In[j]] − 1 ▷ Räkna ner för att nästa förekomst av talet ska hamna på rätt index

return Res

(24)

Föreläsning 8 Magnus Nielsen 28 september 2020 20

Exempel

Counting-sort

A: 4 1 3 4 3

Res:

1 2 3 4 5

C:

1 2 3 4

(25)

Föreläsning 8 Magnus Nielsen 28 september 2020 21

Exempel

Loop 1

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 0 0 0 0

1 2 3 4

for i ← 1 to k do

C[i] ← 0

(26)

Föreläsning 8 Magnus Nielsen 28 september 2020 22

Exempel

Loop 2

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 0 0 0 1

1 2 3 4

for j ← 1 to n do

C[A[ j]] ← C[A[ j]] + 1 ⊳ C[i] = |{nyckel = i}|

(27)

Föreläsning 8 Magnus Nielsen 28 september 2020 23

Exempel

Loop 2

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 0 1

1 2 3 4

for j ← 1 to n do

C[A[ j]] ← C[A[ j]] + 1 ⊳ C[i] = |{nyckel = i}|

(28)

Föreläsning 8 Magnus Nielsen 28 september 2020 24

Exempel

Loop 2

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 1 1

1 2 3 4

for j ← 1 to n do

C[A[ j]] ← C[A[ j]] + 1 ⊳ C[i] = |{nyckel = i}|

(29)

Föreläsning 8 Magnus Nielsen 28 september 2020 25

Exempel

Loop 2

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 1 2

1 2 3 4

for j ← 1 to n do

C[A[ j]] ← C[A[ j]] + 1 ⊳ C[i] = |{nyckel = i}|

(30)

Föreläsning 8 Magnus Nielsen 28 september 2020 26

Exempel

Loop 2

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 2 2

1 2 3 4

for j ← 1 to n do

C[A[ j]] ← C[A[ j]] + 1 ⊳ C[i] = |{nyckel = i}|

(31)

Föreläsning 8 Magnus Nielsen 28 september 2020 27

Exempel

Loop 3

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 2 2

1 2 3 4

C': 1 1 2 2

for i ← 2 to k do

C[i] ← C[i] + C[i–1] ⊳ C[i] = |{nyckel ≤ i}|

(32)

Föreläsning 8 Magnus Nielsen 28 september 2020 28

Exempel

Loop 3

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 2 2

1 2 3 4

C': 1 1 3 2

for i ← 2 to k do

C[i] ← C[i] + C[i–1] ⊳ C[i] = |{nyckel ≤ i}|

(33)

Föreläsning 8 Magnus Nielsen 28 september 2020 29

Exempel

Loop 3

A: 4 1 3 4 3

Res:

1 2 3 4 5

C: 1 0 2 2

1 2 3 4

C': 1 1 3 5

for i ← 2 to k do

C[i] ← C[i] + C[i–1] ⊳ C[i] = |{nyckel ≤ i}|

(34)

Föreläsning 8 Magnus Nielsen 28 september 2020 30

Exempel

Loop 4

A: 4 1 3 4 3

Res: 3

1 2 3 4 5

C: 1 1 3 5

1 2 3 4

C': 1 1 2 5

for j ← n downto 1do Res[C[A[ j]]] ← A[ j]

C[A[ j]] ← C[A[ j]] – 1

(35)

Föreläsning 8 Magnus Nielsen 28 september 2020 31

Exempel

Loop 4

A: 4 1 3 4 3

Res: 3 4

1 2 3 4 5

C: 1 1 2 5

1 2 3 4

C': 1 1 2 4

for j ← n downto 1do Res[C[A[ j]]] ← A[ j]

C[A[ j]] ← C[A[ j]] – 1

(36)

Föreläsning 8 Magnus Nielsen 28 september 2020 32

Exempel

Loop 4

A: 4 1 3 4 3

Res: 3 3 4

1 2 3 4 5

C: 1 1 2 4

1 2 3 4

C': 1 1 1 4

for j ← n downto 1do Res[C[A[ j]]] ← A[ j]

C[A[ j]] ← C[A[ j]] – 1

(37)

Föreläsning 8 Magnus Nielsen 28 september 2020 33

Exempel

Loop 4

A: 4 1 3 4 3

Res: 1 3 3 4

1 2 3 4 5

C: 1 1 1 4

1 2 3 4

C': 0 1 1 4

for j ← n downto 1do Res[C[A[ j]]] ← A[ j]

C[A[ j]] ← C[A[ j]] – 1

(38)

Föreläsning 8 Magnus Nielsen 28 september 2020 34

Exempel

Loop 4

A: 4 1 3 4 3

Res: 1 3 3 4 4

1 2 3 4 5

C: 0 1 1 4

1 2 3 4

C': 0 1 1 3

for j ← n downto 1do Res[C[A[ j]]] ← A[ j]

C[A[ j]] ← C[A[ j]] – 1

(39)

Föreläsning 8 Magnus Nielsen 28 september 2020 35

Analys

for i ← 1 to k do C[i] ← 0 Θ(n)

Θ (k) Θ (n) Θ (k)

for j ← 1 to n do C[A[ j]] ← C[A[ j]] + 1 for i ← 2 to k do C[i] ← C[i] + C[i–1]

for j ← n downto 1 do Res[C[A[ j]]] ← A[ j]

C[A[ j]] ← C[A[ j]] – 1

Θ(n + k)

(40)

Föreläsning 8 Magnus Nielsen 28 september 2020 36

Exekveringstid

Om k∈ O(n) tar räknesortering Θ(n) tid

• Men sortering tar ju Ω(n log n) tid!

• Vad är det som inte stämmer?

Svar

Jämförelsebaserad sorteringtar Ω(n log n) tid

• Counting-sort ärintejämförelsebaserad

• Faktum är att inte en enda jämförelse mellan några element utförs!

(41)

Föreläsning 8 Magnus Nielsen 28 september 2020 37

Stabil sortering

Counting-sort är enstabilsorteringsmetod: den bevarar indataordningen mellan lika element

A: 4 1 3 4 3

Res: 1 3 3 4 4

Att fundera på:

Vilka andra metoder för sortering är stabila?

(42)

Föreläsning 8 Magnus Nielsen 28 september 2020 38

Bucket-sort

• Låt S vara en sekvens av n poster (nyckel, värde) med nycklar från [0, N− 1]

• Bucket-sort använder nycklarna som index i en hjälparray B av sekvenser

• Fas 1:

Töm sekvensen S genom att flytta varje post (k, v) sist i sin bucket B[k]

• Fas 2:

För i = 0, . . . , N− 1 flytta posterna i bucket B[i] till slutet av sekvensen S

• Analys:

Fas 1∈ O(n), Fas 2 ∈ O(n + N) Bucket-sort∈ O(n + N)

procedure BucketSort(S, N ) B← array med N tomma sekvenser while¬S.isEmpty() do

f← S.first() (k, o)← S.remove(f) B[k].insertLast((k, o)) for i← 0 to N − 1 do

while¬B[i].isEmpty() do f← B[i].first() (k, o)← B[i].remove(f) S.insertLast((k, o))

(43)

Föreläsning 8 Magnus Nielsen 28 september 2020 39

Exempel: Nycklar från [0, 9]

7, d 1, c 3, a 7, g 3, b 7, e

1, c 3, a 3, b 7, d 7, g 7, e

Fas 1

Fas 2

0 1 2 3 4 5 6 7 8 9

B

1, c 3, a 3, b 7, d 7, g 7, e

∅ ∅ ∅ ∅ ∅

(44)

Föreläsning 8 Magnus Nielsen 28 september 2020 40

Egenskaper och utökningar

Nycklarnas typ

• Nycklarna används som index i en array och kan inte vara objekt av godtycklig typ (heltal är enklast att hantera)

Stabil sortering

• Den relativa ordningen av alla par av data med samma nycklar är bevarad efter exekveringen av algoritmen

Utökningar

• Heltalsnycklar från [a, b]

Sätt in (k, v) i bucket B[k− a]

• Strängnycklar från en ändlig mängd strängar D

Sortera D och beräkna rangen r(k) för varje sträng k∈ D i den sorterade sekvensen

Sätt in (k, v) i bucket B[r(k)]

(45)

Föreläsning 8 Magnus Nielsen 28 september 2020 40

Egenskaper och utökningar

Nycklarnas typ

• Nycklarna används som index i en array och kan inte vara objekt av godtycklig typ (heltal är enklast att hantera)

Stabil sortering

• Den relativa ordningen av alla par av data med samma nycklar är bevarad efter exekveringen av algoritmen

Utökningar

• Heltalsnycklar från [a, b]

Sätt in (k, v) i bucket B[k− a]

• Strängnycklar från en ändlig mängd strängar D

Sortera D och beräkna rangen r(k) för varje sträng k∈ D i den sorterade sekvensen

Sätt in (k, v) i bucket B[r(k)]

(46)

Föreläsning 8 Magnus Nielsen 28 september 2020 41

Radix-sort

• Ursprung: Herman Holleriths kortsorteringsmaskin för folkräkningen 1890 i USA

• Siffra-för-siffrasortering

• Holleriths (dåliga*) ursprungsidé: sortera påmest signifikant siffra först (MSD)

• Bra idé: sortera påminst signifikant siffra först (LSD),med en extern stabilsorteringsrutin

*Han sorterade heltalsnycklar. När kan MSD-sortering vara bättre än LSD?

(47)

Föreläsning 8 Magnus Nielsen 28 september 2020 42

Exempel: Exekvering av radix-sort 3 2 9

4 5 7 6 5 7 8 3 9 4 3 6 7 2 0 3 5 5

7 2 0 3 5 5 4 3 6 4 5 7 6 5 7 3 2 9 8 3 9

7 2 0 3 2 9 4 3 6 8 3 9 3 5 5 4 5 7 6 5 7

3 2 9

3 5 5

4 3 6

4 5 7

6 5 7

7 2 0

8 3 9

(48)

Föreläsning 8 Magnus Nielsen 28 september 2020 43

Korrekthet för radix-sort

Använd induktion över sifferposition

• Antag att talen är sorterade på sina t − 1 lägsta siffror

• Sortera på siffra t

7 2 0 3 2 9 4 3 6 8 3 9 3 5 5 4 5 7 6 5 7

3 2 9 3 5 5 4 3 6 4 5 7 6 5 7 7 2 0 8 3 9

(49)

Föreläsning 8 Magnus Nielsen 28 september 2020 44

Korrekthet för radix-sort

Använd induktion över sifferposition

• Antag att talen är sorterade på sina t − 1 lägsta siffror

• Sortera på siffra t

Två tal som skiljer sig i siffra t blir korrekt sorterade 7 2 0 3 2 9 4 3 6 8 3 9 3 5 5 4 5 7 6 5 7

3 2 9 3 5 5 4 3 6 4 5 7 6 5 7 7 2 0 8 3 9

(50)

Föreläsning 8 Magnus Nielsen 28 september 2020 45

Korrekthet för radix-sort

Använd induktion över sifferposition

• Antag att talen är sorterade på sina t − 1 lägsta siffror

• Sortera på siffra t

Två tal som skiljer sig i siffra t blir korrekt sorterade

Två tal som är lika i siffra t får samma ordning som i indata

⇒ rätt ordning

7 2 0 3 2 9 4 3 6 8 3 9 3 5 5 4 5 7 6 5 7

3 2 9 3 5 5 4 3 6 4 5 7 6 5 7 7 2 0 8 3 9

(51)

Föreläsning 8 Magnus Nielsen 28 september 2020 46

Analys av radix-sort

• Antag att counting-sort används som extern sorteringsrutin

• Sortera n maskinord om b bitar vardera

• Vi kan se det som att varje ord har b/r siffror i bas 2r

Exempel:

32-bitars ord

8 8 8 8

r = 8⇒ b/r = 4 pass av counting-sort på siffror i bas 28 eller r = 16⇒ b/r = 2 pass av counting-sort på siffror i bas 216 Hur många pass bör vi göra?

(52)

Föreläsning 8 Magnus Nielsen 28 september 2020 47

Analys av radix-sort

Kom ihåg: counting-sort tar tid Θ(n + k) för att sortera n tal från [0, k− 1].

Om varje b-bitars ord bryts upp i r-bitars bitar tar varje pass av counting-sort Θ(n + 2r) tid.

Eftersom det blir b/r pass får vi

T (n, b) = Θ (b

r(n + 2r) )

Välj r för att minimera T (n, b)

• Att öka r ger färre pass, men när r ≫ log n ökar tiden exponentiellt.

(53)

Föreläsning 8 Magnus Nielsen 28 september 2020 48

Att välja r

T (n, b) = Θ (b

r(n + 2r) )

Minimera T (n, b) genom att derivera och sätta till 0.

Eller, observera att vi inte vill ha 2r≫ n och att det inte skadar asymptotiskt att välja r så stort som möjligt givet detta villkor.

Valet r = log n medför T (n, b) = Θ(bn/ log n).

• För tal i intervallet från 0 till nd− 1 har vi b = d log n

⇒ radix-sort kör i tid Θ(dn).

(54)

Föreläsning 8 Magnus Nielsen 28 september 2020 49

Slutsatser

I praktiken är radix-sort snabb för stora indata, samt enkel att koda och underhålla.

Exempel: 32-bitars tal

• Som mest 3 pass när man sorterar ≥ 2000 tal.

• Merge-sort och quick-sort använder minst ⌈log 2000⌉ = 11 pass.

Nackdelar:Det går inte att sortera in-place med räknesortering. Det är också så att radix-sort inte har bra datalokalitet (vilket man kan se till att quick-sort har) vilket gör att en väl trimmad implementation av quick-sort kan vara snabbare på en modern processor med brant minneshierarki.

(55)

1 Information 2 Snabb repetition

3 En undre gräns för jämförelsebaserad sor- tering

4 Sortering i linjär tid?

Counting-sort Bucket-sort Radix-sort

5 Intressanta/roliga algoritmer

6 Hålkortsteknologi

(56)

Föreläsning 8 Magnus Nielsen 28 september 2020 51

Bogosort (ej quantum version)

void bogosort (ArrayList <Integer > l) { while (! sorted (l)) {

shuffle (l);

} }

bool sorted (ArrayList <Integer > l) { for ( int i = 1; i < l.size (); i++) {

if (l.get(i - 1) > l.get(i) { return false;

}

return true;

}

}

(57)

Föreläsning 8 Magnus Nielsen 28 september 2020 52

Patience sort

Från start har vi inga högar.

Fas 1:

• Vi drar ett ”kort”(element)

• ”Kortetplaceras i den hög längst till vars översta kort har samma eller högre värde

• Ny hög om ingen existerande passar Fas 2:

Slå ihop högarna genom att plocka bort det minsta synliga kortet och stoppa in det längst bak i listan med resultatet.

(58)

Föreläsning 8 Magnus Nielsen 28 september 2020 53

Sleep sort

Vi förutsätter numerisk data.

För varje element x starta en ny tråd som:

• Sover x tid

• Skriver ut x

I teorin ger indatan [9, 5, 3, 1, 7] utsriften 1 3 5 7 9.

• Risk för fel (varför?)

• Vilken tidskomplexitet har vi?

(59)

Föreläsning 8 Magnus Nielsen 28 september 2020 54

Solar bitflip sort

1. Undersök om arrayen är sorterad 2. Om sorterad: returnera arrayen

3. Om ej sorterad: vänta 10 sekunder och hoppas att strålning från solen har flippat bits i minnet så att den blev sorterad.

(60)

Föreläsning 8 Magnus Nielsen 28 september 2020 55

Worstsort - slide av Filip

1. Generera alla permutationer av indatat, spara i en lista 2. Sortera listan lexiografiskt med hjälp av bubblesort 3. Ta det första elementet

Komplexitet: Ω((n!)2)

https://sites.math.northwestern.edu/~mlerma/

papers-and-preprints/inefficient_algorithms.pdf

(61)

Föreläsning 8 Magnus Nielsen 28 september 2020 56

Worstsort – even worse - Slide av Filip

1. Generera alla permutationer av indatat, spara i en lista

2. Sortera listan lexiografiskt med hjälp av worstsort, om vi inte har nått ett förutbestämt djup ännu...

3. Ta det första elementet Komplexitet: Ω(((n!) . . .!)2)

https://sites.math.northwestern.edu/~mlerma/

papers-and-preprints/inefficient_algorithms.pdf

(62)

1 Information 2 Snabb repetition

3 En undre gräns för jämförelsebaserad sor- tering

4 Sortering i linjär tid?

Counting-sort Bucket-sort Radix-sort

5 Intressanta/roliga algoritmer

6 Hålkortsteknologi

(63)

Föreläsning 8 Magnus Nielsen 28 september 2020 58

”Modernt” hålkort från IBM

Så det är därför skalfönster har 80 kolumner!

(64)

Föreläsning 8 Magnus Nielsen 28 september 2020 59

Herman Hollerith (1860-1929)

• 1880 års folkräkning i USA tog nästan 10 år att bearbeta.

• Under tiden arbetade en föreläsare vid MIT fram hålkortsteknologin.

• Hans maskiner, inklusive en ”kortsorterare”, gjorde att folkräkningen 1890 kunde slutföras på 6 veckor.

• Han grundade ”The Tabulating Machine Company” 1911, vilket gick samman med andra företag 1924 för att bilda ”International Business Machines”

(65)

Föreläsning 8 Magnus Nielsen 28 september 2020 60

Hålkort

• Hålkort = datapost

• Hål = värde

• Algoritm = maskin + människa

(66)

Föreläsning 8 Magnus Nielsen 28 september 2020 61

Holleriths tabuleringssytem

• Pantografisk hålmaskin

• Läsare manövrerad med handkraft

• Visare för räkneresultat

• Sorteringlåda

(67)

Föreläsning 8 Magnus Nielsen 28 september 2020 62

Ursprunget till radix-sort

Holleriths patentansökan från 1899 talar om radix-sort med början från den mest signifikanta siffran:

The most complicated combinations can readily be counted with comparatively few counters or relays by first assorting the cards according to the first items entering into the combinations, then reassorting each group according to the second item entering into the combination, and so on, and finally counting on a few counters the last item of the combination for each group of cards.

Att köra radix-sort med minst signifikant siffra först verkar vara en uppfinning av maskinoperatörerna.

(68)

Föreläsning 8 Magnus Nielsen 28 september 2020 63

Sorteringsmaskinen

En operatör sätter in ett kort i pressen.

Stift på pressen når genom hålen i hålkortet och får kontakt med kvicksilverfyllda bägare under kortet.

När ett visst siffervärde slås in lyfts locket på motsvarande sorteringsfack.

Operatören lägger kortet i facket och stänger locket.

När alla kort bearbetats öppnas frontpanelen och korten samlas in i ordning, vilket ger ett pass av en stabil sorteringsrutin.

Holleriths Tabulator, Pantograph, Press och Sorter

(69)

Nästa gång:

Introduktion till grafer

www.liu.se

References

Related documents

För att spara minne har du valt att lagra detta som en array där varje element innehåller beteckningen på ett prov som tagits.. För att underlätta för läkarna vill du

För alla rader som börjar på med ett nummer-tecken(#) så skapas ett nytt grupp-objekt med samma namn som radens innehåll. Grupperna som skapas adderas till samlingen av

The aim of this study was to investigate the performance of a naive parallel implementation of Kahn’s topological sorting algorithm on a GPU compared to the

The most complicated combinations can readily be counted with comparatively few counters or relays by first assorting the cards according to the first items entering into

Det ligger n¨ ara till hands att fr˚ aga sig hur man finner kortaste v¨ agen fr˚ an aula till labb genom att byta ut en bokstav i taget, till exempel s˚ a h¨ ar:. aula → gula →

Tips Eleverna kan tävla gruppvis om att komma på flest passande egenskapsord.. Eleverna kan välja två egenskaper, göra en tabell av typen

This study evaluated the effects of CoQ10 supplementation to in vitro maturation or embryo culture media on the maturation, fertilization and subsequent embryonic development of

al (2005) compose a list of Government Policy and Action Possibilities which can be given to demonstrate to the public related to a variety of management options