You are on page 1of 70

Datastrukturer och algoritmer

Kompendium/komplettering
Tommy Olsson, Institutionen fr datavetenskap, 2011

Innehll
Inledning ................................................................................................. 1
1 Skiplista .................................................................................................. 3
1.1
1.2
1.3
1.4
1.5
1.6
1.7

Skiplistans uppbyggnad ................................................................................


Skapa skiplista ..............................................................................................
Ska i skiplista ..............................................................................................
Insttning i skiplista ......................................................................................
Borttagning ur skiplista ................................................................................
Analys ...........................................................................................................
Litteratur .......................................................................................................

3
4
4
5
5
5
5

2 Trd ......................................................................................................... 7
2.1
2.2
2.3
2.3.1
2.4
2.4.1
2.4.2
2.4.3
2.4.4
2.4.5
2.4.6
2.4.7
2.4.8
2.4.9
2.4.10
2.4.11
2.4.12
2.4.13

Terminologi .................................................................................................. 7
Trdtraversering ........................................................................................ 10
Uttryckstrd ............................................................................................... 11
Generering av uttryckstrd .................................................................... 11
Sktrd ........................................................................................................ 13
Binra sktrd ........................................................................................ 14
Balanserade binra sktrd .................................................................... 15
AVL-trd ............................................................................................... 16
AVL-trdsrotationer .............................................................................. 17
Rd-svarta trd ...................................................................................... 19
Insttning i bottom-up rd-svarta trd ................................................... 20
Insttning i top-down rd-svarta trd .................................................... 21
Splaytrd ................................................................................................ 22
Bottom-up-splaytrd .............................................................................. 22
Top-down-splaytrd ............................................................................... 23
B-trd ..................................................................................................... 26
Insttning i B-trd .................................................................................. 26
Borttagning ur B-trd ............................................................................. 28

3 Hashtabeller .......................................................................................... 31
3.1
3.1.1
3.1.2
3.1.3
3.2
3.2.1
3.2.2
3.2.3
3.2.4
3.3
3.4
3.5
3.5.1
3.5.2
3.5.3
3.5.4
3.5.5
3.5.6

Hashfunktioner ...........................................................................................
Frbearbetning av nycklar .....................................................................
Val av hashfunktion ...............................................................................
Divisionsmetoden ..................................................................................
Kollisionshantering ....................................................................................
Linjr sondering .....................................................................................
Kvadratisk sondering .............................................................................
Dubbelhashning .....................................................................................
Separat lnkning ....................................................................................
Omhashning ................................................................................................
Linjrhashning ............................................................................................
versikt av hashfunktioner ........................................................................
Sifferurvalsmetoden, sifferanalysmetoden ............................................
Divisionsmetoden ..................................................................................
Mittkvadratmetoden ...............................................................................
Folding-metoder ....................................................................................
Lngdberoendemetoder .........................................................................
Slumpmetoden .......................................................................................

iii

31
31
32
32
33
33
33
34
35
35
35
37
37
37
38
38
39
39

3.5.7
3.5.8

Radixmetoden ........................................................................................ 39
Perfekta hashfunktioner ......................................................................... 39

4 Prioritetsk och heap ............................................................................ 41


4.1
4.1.1
4.1.2
4.1.3

Heap ............................................................................................................
Binr heap ..............................................................................................
Insttning i binr min-heap ....................................................................
Borttagning ur binr min-heap ..............................................................

41
42
42
44

5 Sortering ............................................................................................... 45
5.1
5.1.1
5.1.2
5.1.3
5.1.4
5.1.5
5.1.6
5.1.7
5.1.8
5.2
5.2.1
5.2.2
5.3
5.3.1
5.3.2
5.3.3
5.3.4
5.3.5
5.4

Interna sorteringsmetoder ...........................................................................


Bubblesort ..............................................................................................
Shakersort ..............................................................................................
Selectionsort ..........................................................................................
Insertionsort ...........................................................................................
Shellsort .................................................................................................
Heapsort .................................................................................................
Mergesort ...............................................................................................
Quicksort ...............................................................................................
Distributiva sorteringsmetoder ...................................................................
Count Sort ..............................................................................................
Radix Sort ..............................................................................................
Externa sorteringsmetoder ..........................................................................
Balanserad tvvgs samsortering ...........................................................
Naturlig tvvgs samsortering ...............................................................
Mngvgs samsortering .........................................................................
Polyphase Merge ...................................................................................
Replacement Selection ..........................................................................
Indirekt sortering ........................................................................................

46
46
47
47
48
49
51
52
54
58
58
59
60
60
61
62
62
63
64

6 Interpolationsskning ........................................................................... 65
6.1

Litteratur ..................................................................................................... 66

iv

Inledning
Det hr kompendiet ger en versikt ver vanligt frekommande datastrukturer och algoritmer, i
praktisk anvndning, teoretiskt eller historiskt.
Underrubriken Komplettering avspeglar att kompendiet har en del luckor d det gller innehll.
Till exempel behandlas inte enkla listor, stack eller k, utan endast den avancerade liststrukturen
skiplista tas upp. Inte heller ingr mngder, grafer och annat som kan frvntas i en mer heltckande versikt. Analys av datastrukturer och algoritmer har antingen utelmnats eller genomfrs
mer resonemangsmssigt n teoretiskt.

1 Skiplista
Skiplistan bygger p en sannolikhetsbaserad balansering, i stllet fr de striktare former av balansering som anvnds i vissa trd. Det gr att algoritmerna fr insttning och borttagning i en
skiplista blir bde enklare och snabbare n motsvarande operationer i balanserade trd.
En skiplista r i grunden en ordnad, enkellnkad lista men vissa listnoder har flera framtpekare,
vilket mjliggr snabbare skning n i en vanlig enkellnkad lista. Skiplistan r, trots de extra
pekarna, minneseffektiv och kan konstrueras med en marginell kning av antalet pekare per listelement. Ingen annan information behver heller lagras i noderna.
a)

b)
2

11

11

14

14

17

17

21

21

24

24

25

25

31

31

NIL

c)

21

8
6

11

14

NIL
24

17

25

31

header
d)
5
2

11

14

31

24
17

21

NIL

25

Figur 1. Exempel p enkellnkad lista och skiplistor.

1.1 Skiplistans uppbyggnad


I en enkellnkad lista med n element (figur 1a) kan man behva ska igenom hela listan fr att hitta
ett visst vrde. Om listan innehller n noder krvs i vrsta fall n sksteg och frvntad medelskvg
r n/2 sksteg. Om varannan nod frses med ytterligare en pekare som pekar tv noder framt
(figur 1 b) behver bara n/2+1 noder beskas i vrsta fall. Om man i var fjrde nod har ytterligare
en pekare som pekar fyra steg framt (figur 1c), fr man i vrsta fall underska n/4+2 noder, osv.
En lista uppbyggd p detta systematiska stt kallas fr en perfekt balanserad skiplista.
En nod med k framtpekare kallas en niv-k-nod. I en perfekt balanserade skiplista gller att 50%
av noderna r niv-1-noder, 25% r niv-2-noder, 12.5% r niv-3-noder, osv. (figur 1c). Om man
p detta vis, i var 2i:te nod har en pekare som pekar i noder framt, frdubblas antalet pekare i listan
men det reducerar antalet noder som kan behva att underskas till i vrsta fall 2logn. NIL-noden
som finns sist i skiplistan r en speciell nod som avslutar alla niver i listan, en sentinel-nod
En perfekt balanserad skiplista r effektiv vid skning men ohanterlig vid insttning och borttagning. Man kan dock anvnda en mindre strikt, sannolikhetsbaserad bestmning av antalet framtpekare. D en ny nod ska sttas in slumpas nivn fr den nya noden. Man kan konstruera en
slumpgenerator som statistiskt bibehller frdelningen med 50% niv-1-noder, 25% niv-2-noder,
osv, men ven andra frdelningar kan anvndas.
I en sannolikhetsbaserad skiplista kommer en nods i:te framtpekare att ange nsta nod i listan som
r en niv-i nod eller hgre (figur 1d), i stllet fr att, som i den perfekt balanserade listan, ange
noden som r 2i-1 noder framt. Insttning och borttagning av en nod krver endast en begrnsad
frndring av listans struktur och framfr allt berrs inte andra noders niv.

Operationer p skiplistor inleds vanligtvis med en skning som startar i header-noden. Normalt
startar skningen p den aktuella nivn fr listan, dvs den i figurerna versta nivn av pekare. Skningen leder framt/nedt i strukturen, exakt hur beror p vilket vrde som sks och listans aktuella
innehll:
om skt vrde r strre n det i den aktuella noden stegar man framt p samma niv
om skt vrde r mindre det i den aktuella noden stegar man nedt i den aktuella noden
om skt vrde r lika med det i den aktuella noden avslutas skningen
I figur 2 visas skvgen i det fall vrdet 17 sks. Skningen brjar i header-noden p niv 4. Den
pekaren anger noden 5 (<17) och man stegar framt p niv 4 till nod 5 och undersker vad dess
pekare p niv 4 anger. Det visar sig vara NIL (innehller ett vrde > 17), s man stegar ned till niv
3 i nod 5 och undersker vad den pekaren anger. Det r nod 24 (>17), s man stegar ned till niv
2, osv till dess (i detta fall) skt vrde hittas.
header

5
2

11

31

24

14

17

NIL

25

21

Figur 2. Skvg i en skiplista vid skning efter vrdet 17.

1.2 Skapa skiplista


En skiplista ska initialt best av en header-nod och en NIL-nod. Listans niv stts till 1 och samtliga
pekare i header-noden (det kan vara ett fixt antal) ska peka p NIL-noden.

1.3 Ska i skiplista


Vid skningar som kan innebra att listan kan ska ndras, dvs vid insttning och borttagning,
sparas pekarna till de noder som innehller pekare som kan behva ndras i ett flt, update.
skt vrde placeras i NIL-noden, som drmed fungerar som en vaktpost i slutet av listan
skningen inleds i header-noden p den fr tillfllet hgsta nivn i listan
s lnge pekaren p aktuell niv anger en nod som innehller ett vrde som r mindre n skt
vrde stegar man framt till nsta nod p den aktuella nivn.
d ett vrde som r mindre n eller lika med det skta vrdet ptrffas sparas pekaren till aktuell
nod i update.
skningen fortstter sedan p nrmast lgre niv
Figur 3 visar innehllet i uppdate efter att skning genomfrts efter antingen 15, 16 eller 17.
update

5
2

11

31

24

14

17

21

Figur 3. Innehllet i uppdate efter skning efter 15, 16 eller 17.

25

NIL

Fltet update i figur 3 ger tkomst till de noder dr framtpekarna kan behva ndras, om man
vill stta in eller ta bort det vrde som har skts.
I skalgoritmen ovan startar man alltid p listans hgsta niv och arbetar framt/nedt i liststrukturen. Det finns mjlighet att effektivisera skningen ytterligare, vilket beskrivs i [1].

1.4 Insttning i skiplista


Insttning utfrs i tv moment. Frst grs en skning efter det vrde som ska sttas in, enligt vad
som beskrivits tidigare. D skningen r klar har man hamnat i en nod, som antingen innehller
vrdet ifrga eller framfr vilken en ny nod med skvrdet ska lnkas in. I fltet update finns
pekare till de noder dr det finns pekare som kan behva ndras d den nya noden stts in.
Efter den inledande skningen kontrolleras om skt nyckel finns i listan eller ej. Om en ny nod ska
sttas in berknas den nya nodens niv. Om nivn blir strre n listans aktuella niv kompletteras
update med de ytterligare pekare som detta krver. De nya pekarna ska samtliga peka p headernoden, vilken kommer att vara den direkta fregngaren till den nya noden p de nytillkomna
niverna. Man br endast ka listans niv med en niv i taget fr att undvika att enstaka noder
erhller en ondigt hg niv jmfrt med vriga noder.
Den nya noden lnkas in i listan. Upp till den niv som den nya noden har erhllit ska pekarna i de
noder som anges av pekarna i update kopieras till den nya noden. Pekarna i de noder som anges
av pekarna i update ska ndras till att peka p den nya noden.
Om man vill stta in 15 och noden erhller nivn 3 ska bda pekarna i nod 14 ndras till att peka
p den nya noden, liksom pekaren p niv 3 i nod 5. Pekaren p niv 4 i nod 5 pverkas ej.

1.5 Borttagning ur skiplista


Borttagning inleds med en skning i listan. Om skt nyckel finns ndras alla pekare som pekar p
den nod som ska tas bort till motsvarande pekare i den nod som ska tas bort. Drmed r den skta
noden urlnkad. Slutligen bestms listans nya aktuella niv, den borttagna noden kunde ha varit
den fr tillfllet enda noden med den hgsta nivn i listan.
Borttagning av nod 17 skulle endast pverka pekaren p den lgsta nivn i nod 14. Dremot skulle
borttagning av nod 24 pverka pekarna i noderna 5, 14 och 21.

1.6 Analys
Ngon analys av skiplistor grs ej. Vi bara konstaterar att skning normalt r en arbetsinsats av
storleksordningen O(logn). Skiplistor kan genom sin relativa enkelhet vara intressanta att anvnda
i stllet fr balanserade trd. Skiplistan kombinerar det balanserade trdets skeffektivitet med den
raka lnkade listans sekventiella egenskaper. Fr mer detaljer se [1].

1.7 Litteratur
William Pugh, Skip List: A Probabilistic Alternative to Balanced Trees, Communications of the
ACM, Juni 1990, Vol. 33, Nr 6, sid. 668-676.

2 Trd
Trdstrukturer gr det mjligt att lagra information p stt som kan ge effektiva skstrukturer. Man
ser inte s ofta trd frekomma som bibliotekskomponenter, som exempelvis lista, stack, k och
hashtabell, dremot som implementeringsstruktur fr andra datastrukturer.
Formellt r trd en begrnsad form av riktad acyklisk graf. Riktad innebr varje bge i grafen har
en riktningoch att den kan fljas frn en nod till en annan men inte tillbaka (vilket rekursion kan
lsa). Acyklisk innebr att det ej fr finns ngra vgar som leder runt i grafen, s att man kan komma
tillbaka till en nod som redan har beskts annat n att g baklnges. Den begrnsning som finns i
jmfrelse med generella riktade acykliska grafer r att varje nod bara kan ha en bge, eller gren,
som leder till noden. Grafen till vnster i figur 4 visar ett trd, medan grafen till hger ej r ett trd,
dels drfr att det finns en cykel b-f-c och dels att noden h kan ns via tv olika vgar.
a

b
c

c
e

Figur 4. Trd r en form av riktad acyklisk graf (t.v.)

2.1 Terminologi
Den frsta nod man kommer till i ett trd kallas trdets rot. En nods barn r de noder som direkt
kan ns frn noden, ven kallade direkt efterfljare. En nods frlder r den unika nod som r
nodens direkta fregngare. Noder som har samma frlder kallas syskon. En nod utan barn kallas
lv, slutnod, eller terminalnod. En nod som inte r ett lv r en inre nod.

inre nod

rot

gren
b
d

c
e

i
l

f
j

g
syskon

lv

niv 0
barn till a,
frlder till
f och g

niv 1
niv 2
niv 3
niv 4

Figur 5. Terminologi.

En nods anfder r samtliga noder som finns p vgen frn roten till noden. Roten r den gemensamma anfadern fr alla noder i ett trd. En nods avkommor r samtliga noder som har noden som
anfader. Observera att en nod i grafteoretisk mening r bde sin egen anfader och egen avkomma.
En nod r en kta anfader (kta avkomma) till en annan nod om noden ifrga r en anfader
(avkomma) till den andra noden, men det omvnda inte gller.
En vg i ett trd r den unika fljden av bgar mellan en nod och en anfader. Vglngden till en
nod avser vanligtvis antalet bgar frn noden till roten. Vglngden till noden d i trdet i figur 5 r
2. I sktrd r medelvglngen av speciellt intresse och den berknas som summan av alla noders
vglngder dividerad med antalet noder. Medelvglngden ger ett mtt p frvntat skarbete.

Roten i ett trd sgs befinna sig p niv 0, rotens barn p niv 1, dess barnbarn p niv 2, osv. En
nods djup, eller niv, r vglngden frn roten till noden. En nods hjd r lngden av den lngsta
vgen frn noden till ett lv (nod b i trdet i figur 5 har hjden 3). Ett trds hjd r rotens hjd, dvs
den lngsta vgen till ngot lv (trdet i figur 5 har hjd 4). Lv har hjden 0 och ett tomt trd har
definitionsmssigt hjden -1.
En nods grad r dess antal barn (i figur 5 har nod b grad 2, nod f grad 1 och nod h grad 0). Ett trds
grad r den hgsta graden hos ngon noder (trdet i figur 2 har fljaktligen grad 2 eftersom ingen
nod har fler n tv barn). Ett binrt trd r ett trd med grad mindre n eller lika med 2 (trdet i
figur 5 r ett binrt trd). Ofta avser man dock snarare det maximala antalet barn som trdnoderna
kan ha, den fysiska begrnsningen, nr man talar om ett trds grad Ett trd med grad 1 kallas
degenererat.
Ett trds storlek r det totala antalet noder i trdet. Ett subtrds storlek r antalet noder i subtrdet
inklusive subtrdets rot.
I ett orienterat binrt trd kallas det ena barnet vnster barn och det andra hger barn (i figur 5 r
nod d vnster barn till nod b och nod e r hger barn till nod b).
Ibland r det enbart av intressant att visa ett trds vergripande struktur, inte samtliga noder i
trdet. I figur 6 visas ngra sdana exempel p symboliserade trd.

a) godtyckligt trd

b) komplett trd

c) nod med tv subtrd

Figur 6. Symboliserade trd.

Ett komplett binrt trd med hjd h r ett binrt trd som r fullt ner till nivn h-1 och med lven
p niv h ttt packade t vnster (se figur 7a).
En nod i ett binrt trd r full om den har grad 2 (i figur 5 r noderna a, b, c och d fulla). I ett fullt
trd har alla noder utom lvnoderna tv barn (se exempel 7b).
Ett perfekt binrt trd med hjd h har enbart lv p niv h och alla dess inre noder r fulla (se
figur 7c). Lgger man till en nod i ett fullt binrt trd kommer dess hjd att ka.

a) komplett binrt trd med djup 3

b) fullt men ej komplett

c) perfekt binrt trd med djup 2

Figur 7. Perfekt, komplett och fullt trd.

Perfekta trd r uppenbarligen speciella men de r till exempel anvndbara fr att analysera trds
egenskaper. Fr ett perfekt trd gller fljande:
ett perfekt binrt trd med hjd h 0 har 2h+11 noder.
ett perfekt binrt trd med hjd h har 2h lv (om antalet noder r n, r n/2 + 1 av dessa lv, dvs
finns p djupet h).
Antalet fulla noder i ett binrt trd r antalet lv minus 1.

Kompletta trd r speciella men har praktiska tillmpningar. Genom att numrera noderna nivvis
kan de avbildas p ett flt, vilket exempelvis kan utnyttjas fr att implementera en binr heap. I
figur 8 visas denna avbildning frn ett binrt komplett trd till ett flt.

1
3

2
5

4
9

10

10

11

12

7
13

14

15

9 10

9 10 11 12 13 14 15

Figur 8. Kompletta trd och deras fltimplementering.

Nedtill i det hgra exemplet i figur 8 visas tv vgar i det kompletta trdet, en med heldragna pilar
och en med streckade pilar, och de element i fltet som motsvarar de noder som ingr i de tv
vgarna. Att lagra ett trd i ett flt kallas implicit representation.
Fljande samband mellan trdnoderna i ett komplett binrt trd med n noder och fltindex gller
(om fltindex ska starta p 0 fr formlerna justeras).
rotnoden har index 1 och sista lvet har index n.
barnen till den i:te noden har index 2i respektive 2i+1.
frldern till den i:te noden har index i/2 (heltalsdivision).
sista icke-lvet har index n/2.
Det r ltt att med enkel aritmetik p index frflytta sig i ett fltlagrat komplett trd, bde nivledes
och i djupled, uppt eller nedt, och det kan generaliseras till trd av godtycklig grad.
I vissa binra trd, exempelvis sktrd, anvnds begreppen utsidesnod respektive insidesnod. Detta
avser var en viss nod finns relativt en annan nod (anfader). I trdet i figur 9 r alla noder i subtrdet
U utsidesnoder relativt g, medan alla noder i subtrdet I r insidesnoder relativt g.
g
p

Figur 9. Insides- respektive utsidesnoder.

Den form ett visst trd har beror av vilken typ av trd det r och ibland av hur det har byggts upp.
Fr ett uttryckstrd bestms formen av det uttryck som trdet representerar, fr ett sktrd
pverkas formen dels av vilken typ av sktrd det r (till exempel AVL-trd eller splaytrd) dels
av den ordning som elementen stts in i trdet.

2.2 Trdtraversering
Att traversera ett trd innebr att beska alla noder i trdet p ett systematiskt stt. Man brukar
skilja mellan tv grundlggande stt att traversera ett trd, djupet frst respektive bredden frst
(nivvis). I bda fallen kan man dessutom tnka sig att traversera frn vnster till hger eller frn
hger till vnster.

a) djupet frst, vnster till hger

b) bredden frst, vnster till hger

Figur 10. Trdtraversering.

I fallet djupet frst kommer varje nod att beskas tre gnger och det kan anses glla ven fr lv
om man ser det som om deras tomma subtrd besks. En djupet-frst-traversering frn vnster till
hger besks en nod frsta gngen d traverseringen kommer frn dess frlder. Sedan besks nodens vnstra subtrd och drefter noden igen. Efter det besks nodens hgra subtrd och terigen
noden. Sedan ter till frldern. En operation som ska utfras p noden kan allts utfras nr noden
besks frsta gngen, eller efter att vnster subtrd har beskts, eller efter att ven hger subtrd
har beskts. Dessa tre varianter betecknas preorder, inorder- respektive postordertraversering, eller prefix-, infix- och postfixtraversering. Inordertraversering kan implementeras rekursivt enligt
fljande:
Om trdet inte r tomt:
besk vnster subtrd (rekursionen tar oss sedan tillbaka till frldern)
operera p den aktuella noden
besk hger subtrd (rekursionen tar oss sedan tillbaka till frldern)
Om man av ngon anledning inte kan anvnda rekursion kan djupet-frst-traversering med viss
mda implementeras iterativt med hjlp av en stack. I vissa trd har man en extra bge som leder
till frldranoden och sdana trd kan traverseras iterativt med hjlp av denna extra bge.
Bredden-frst-traversering kan implementeras iterativt med hjlp av en k, enligt fljande:
placera (en pekaren till) rotnoden i kn
s lnge inte kn r tom:
hmta nsta nod (pekare) frn kn
placera (pekare till) den aktuella nodens vnsterbarn i kn
placera (pekare till) den aktuella nodens hgerbarn i kn
operera p den aktuella noden

10

2.3 Uttryckstrd
I till exempel kompilatorer anvnds uttryckstrd som intern representation av uttryck. Uttrycket
x = 5 + 2 * (a - b) / 4 motsvaras av uttryckstrdet i figur 11.
Ett uttryck har en hierarkiskt struktur som bestms av operatorernas prioritet och associativitet
samt parenteser. Strukturen framhvs om man parentetriserar ett uttryck fullt ut, vilket fr vrt
exempel innebr (x = (5 + ((2 * (a b)) / 4))). Man ser nu tydligt att deluttrycket ab ska berknas
innan dess vrde multipliceras med 2, varefter det resultatet ska divideras med 4, osv. Ett uttryckstrds struktur avspeglar entydigt berkningsordningen fr uttrycket, utan att parenteser behver
finnas i uttryckstrd. Alla operander r lv och alla operatorer r inre noder.
=
+

2
a

Figur 11. Uttryckstrd fr uttrycket x = 5 + 2 * (a - b) / 4.

Om vi traverserar uttryckstrdet i figur 11 erhller vi fljande resultat.


preorder: = x + 5 / * 2 - a b 4
inorder:
x = 5 + 2 * a - b / 4
postorder: x 5 2 a b - * 4 / + =
Resultatet av inordertraverseringen knner vi igen som det givna infixuttrycket, utan parenteserna
kring a-b. Ett berkningsmssigt korrekt infixuttryck gr att terskapa genom att infra parenteser
kring varje deluttryck (deltrd).
Preorder- och postorderresultaten kallas polsk notation respektive omvnd polsk notation. I polsk
notation kommer operatorerna fre sina operander, till exempel kommer - fre a och b, * fre 2
och deluttrycket ab, osv. I omvnd polsk notation r det tvrt om, a och b kommer fre , 2 och
ab kommer fre *, osv. Dessa notationer kallas ven parentesfria eftersom inga parenteser behvs,
berkningsordningen r nd entydig.
Omvnd polsk notation r mycket anvndbar. Till exempel kan den ha anvnts som en mellanrepresentation fr att generera uttryckstrdet ur det givna infixuttrycket. Omvnd polsk notation
gr det ocks enkelt fr ett program att berkna ett uttrycks vrde. Genom att operanderna alltid
kommer alltid fre den motsvarande operatorn kan man kan lsa ett uttryck frn vnster till hger
och successivt berkna deluttryck utan att knna till vad som kommer lngre fram.
Generella uttryckstrd r naturligtvis betydligt mer komplicerade n det exempel som visas hr.

2.3.1 Generering av uttryckstrd


Ett stt att generera det uttryckstrd som motsvarar ett visst infixuttryck r att frst omvandla till
motsvarande postfixnotation. Omvandlingen frn infix- till postfixnotation kan gras med hjlp av
jrnvgsalgoritmen, som anvnder en stack fr att mellanlagra operatorer.

11

Operander
Infix

Postfix

Operatorstack

Figur 12. Principen fr jrnvgsalgoritmen.

Namnet jrnvgsalgoritmen kommer av man kan se frloppet som om infixuttryckets operander


och operatorer krs genom en enkel rangerbangrd. Bangrden har ett inkommande spr och ett
utgende spr. Stacken fungerar som ett stickspr, p vilket operatorer krs in frn inkommande
spr fr att senare kras ut p utgende spr.
En operand krs alltid direkt till utspret och backas aldrig tillbaka, vilket innebr att operandernas
inbrdes ordning r densamma i utdata som i indata. En operator krs alltid in p stickspret men
operatorer som redan finns p stickspret och som har hgre prioritet ska frst kras till utspret.
Om en operator p stickspret har samma prioritet som inkommande operator avgr associativiteten fr den aktuella prioritetsnivn vad som ska ske. Om vnsterassociativitet gller ska operatorn
p stickspret kras till utspret, annars inte. Operatorer med lgre prioritet ska alltid st kvar p
stickspret. Infixuttrycket x = 5 + 2 * (a b) / 4 kommer att behandlas enligt figur 13, dr allts en
stack utgr stickspret.
Inkommande
x = 5 + 2 * (a b) / 4
= 5 + 2 * (a b) / 4
5 + 2 * (a b) / 4
+ 2 * (a b) / 4
2 * (a b) / 4
* (a b) / 4
(a b) / 4
a b) / 4
b) / 4
b) / 4
)/4
/4
4

Stack

=
=
=+
=+
=+*
=+*(
=+*(
=+*(
=+*(
=+*
=+/
=+/

Utgende
x
x
x5
x5
x52
x52
x52
x52a
x52a
x52ab
x52ab
x52ab*
x52ab*4
x52ab*4/+=

Figur 13. Jrnvgsalgoritmen applicerad p infixuttrycket x = 5 + 2 * (a - b) / 4.

Med hjlp av en stack kan ett uttryckstrd genereras ur omvnd polska notation. Algoritmen r
enkel. Fr en operand skapas en ny nod och en pekare till noden placeras p stacken. Fr en binr
operator skapas frst en ny nod, den versta noden p stacken grs till dess hgerbarn, nsta nod
frn stacken grs till dess vnsterbarn och pekaren till den nya operatornoden placeras p stacken.
Uttrycket x 5 2 a b - * 4 / + = kommer att behandlas enligt figur 14.

12

/
4

2
a

2
a

+
5

*
b

+
5

*
2

/
4

*
b

Figur 14. Generering av uttryckstrd ur postfixuttrycket x 5 2 a b - 4 / + =.

2.4 Sktrd
Genom att systematiskt ordna data i en trdstruktur kan effektiva skstrukturer erhllas. Det finns
tv huvudkategorier av sktrd, binra sktrd respektive mngfrgrenade sktrd.
Binra sktrd r binra trd dr elementen r ordnade, se figur 15. Ett enkelt binrt sktrdet har
inga andra krav n att vara binrt och ordnat. Avancerade sktrd har ofta krav p trdstrukturen,
till exempel har AVL-trd och rd-svarta trd ett hjdbalanskrav som medfr att de ej kan bli allt
fr osymmetriska. Binra trd anvnds ofta fr intern datalagring, dvs fr lagring i datorns arbetsminne under programkrning.
k

6
2

<k

>k

10
5

12
15

Figur 15. Binrt sktrd.

Mngfrgrenade sktrd r trd med hg grad. Sdana anvnds vanligtvis fr extern datalagring,
dvs lagring p fil p sekundrminne. B-trd r ett exempel p denna typ av sktrd och graden r
typiskt hg, kanske 100-400. Hgt gradtal i kombination med balanskrav ger litet djup, vilket innebr att antalet lsningar/skrivningar av sekundrminne nr man behver hmta data frn sekundrminne eller skriva data till sekundrminne kan hllas litet.
Data i ett binrt sktrd kan antingen lagras i trdnoderna eller i en separat datastruktur som d
refereras frn trdnoderna. I ett B-trd skiljer sig de inre noderna helt frn lvnoderna. I lvnoderna
i ett B-trd lagras den egentliga informationen, medan de inre noderna enbart innehller utvalda
sknycklar och referenser till subtrd. Den del av ett B-trd som utgrs av de inre noderna kan ses
som en indexstruktur fr lven, dr alla data lagras.

13

2.4.1 Binra sktrd


Ett binrt sktrd r ett binrt trd dr fr sknyckeln (k) i en nod r strre n nycklarna i nodens
vnstra subtrdet och mindre n nycklarna i det hgra subtrdet, se det schematiska trdet till
vnster i figur 15. I vissa sktrd tillts lika nycklar fr olika noder. Fr ett enkelt binrt sktrd
finns inga andra krav n denna sktrdsordning. Ngra observationer:
Den minsta sknyckeln finner vi lngst ner till vnster i trdet och den hittas genom att i varje
nod flja den vnstra grenen, till dess vi nr en nod som saknar vnsterbarn (1).
Den strsta sknyckeln finner vi lngst ner till hger i trdet och det hittas genom att i varje nod
flja den hgra grenen, till dess vi nr en nod som saknar hgerbarn (15).
Om vi gr en inordertraversering (frn vnster till hger) erhller vi elementen i stigande
nyckelordning.
Den nod som besks direkt fre en viss annan nod vid inordertraversering kallas inorder fregngare. Inorder fregngaren till en inre nod hittar vi som den hgraste noden i den aktuella
nodens vnstra subtrd. Till exempel r 5 inorder fregngare till 6.
Den nod som besks direkt efter en viss annan nod vid inordertraversering kallas inorder
efterfljare. Inorder efterfljare till en inre nod hittar vi som den vnstraste noden i den aktuella
nodens hgra subtrd. Till exempel r 8 inorder efterfljare till 6.
Inorder fregngare och inorder efterfljare till en inre nod r noder som antingen r ett lv eller
en inre nod med endast ett barn. Detta tillsammans med att det r ltt att hitta dessa noder gr
det enkelt att ta bort element ur ett binrt sktrd.
Skning r en operation som anvnds i sig, fr att terfinna ett element med en viss sknyckel, men
ocks som ett frsta steg i samband med insttning och borttagning. Skning i ett binrt sktrd
kan beskrivas med fljande rekursiva algoritm:
om trdet r tomt
skt vrde finns ej i trdet
annars, om skt vrde < elementet i aktuell nod
sk elementet i vnster subtrd
annars, om skt vrde > elementet i aktuell nod
sk elementet i hger subtrd
annars
elementet finns i den aktuella noden
Skningen i ett ngorlunda symmetriskt binrt sktrd r effektiv. Fr varje nod som undersks
kan det ena av dess tv subtrd elimineras, Det innebr att skmngden i varje steg i princip
halveras, om trdet r vlbalanserat, och skningen blir effektivitetsmssigt jmfrbar med
binrskning.
Vid insttning utfrs frst en trdskning enligt ovan. Om den resulterar i att det skta vrde redan
finns i trdet r det ett fel om endast unika nycklar tillts. I annat fall ska en nod med det nya
elementet sttas in p den plats dit skningen ledde. Vid insttning av 9 i det vnstra trdet i
figur 16 leder skningen till det tomma hgra subtrdet till nod 8 och dr ska d stts en ny lvnod
med 9 stts in. Ett nytt vrde stts alltid in som ett lv och om det inte finns ngot balanskrav r
insttningen klar.

14

2
1

10
5

2
12

11

1
15

10
5

12
9

15

Figur 16. Insttning i binrt sktrd.

Borttagning i ett binrt sktrd r mer komplicerat n insttning. Frsta steget r att gra en trdskning. Om skningen leder till ett tomt (sub)trd finns inte elementet som ska tas bort i trdet. I
annat fall stannar skningen i ngon nod och tre fal kan srskiljas:
1.

Elementet som ska tas bort finns i ett lv. Lvet kan tas bort utan ngra andra tgrder. Borttagning av 4 i ngot av trden i figur 16 franleder ingen mer tgrd n att noden tas bort.

2.

Elementet som ska tas bort finns i en inre nod med bara ett barn. Detta r ocks ett enkelt fall,
eftersom noden som ska tas bort kan ersttas av sitt enda barn. Borttagning av 5 i ngot av
trden i figur 16 innebr att noden med 5 tas bort och erstts med dess vnstra subtrd, dvs
noden med 4.

3.

Elementet finns i en inre nod med tv barn. Vi kan inte utan vidare ta bort noden, eftersom
den har tv subtrd som mste tas om hand. Lsningen r att ska upp inorder efterfljare
och lta den erstta elementet som ska tas bort. Detta bibehller ordningen i trdet och noden
i frga r alltid ett lv eller en inre nod med endast ett barn, vilket underlttar uppflyttningen.
Trdstrukturen pverkas minimalt. Alternativt kan inorder fregngare vljas som ersttare.
Borttagning av 6 i trdet till vnster i figur 16, kan gras genom att inorder efterfljare, 8,
sks upp och fr erstta 6, noden dr 8 fanns kan enkelt tas bort och hgerbarnet 9 placeras
p dess plats. Alternativt kan inorder fregngare, 5, skas upp och erstta 6.

Om de element man stter in i ett binrt sktrd r slumpmssigt ordande kommer trdet vanligtvis
att f en tmligen symmetrisk form och drmed f goda skegenskaper. I annat fall, eller om man
vill garantera bra skegenskaper, anvnder man ett balanserat sktrd.

2.4.2 Balanserade binra sktrd


Fr att ett binrt sktrd ska vara effektivt att ska i krvs att trdet r balanserat, dvs ngorlunda
symmetriskt. Ett vlbalanserat trd har ett djup som r proportionell mot logaritmen av antalet
element.
En strikt form av balans fr binra trd r s kallad nodbalans: Fr varje nod ska glla att antalet
noder i dess vnstra subtrd och antalet noder i dess hgra subtrd fr skilja med hgst en nod. I
figur 17 r trden a, b och c exempel p nodbalanserade trd med djup 2. Trden d och e r ej nodbalanserade, eftersom rotnodens vnstra subtrd innehller tre noder, medan de hgra endast en
respektive ingen nod och skillnaden mellan antalet noder i rotnodens subtrd allts r strre n en
nod.

a)

b)

c)

d)

Figur 17. Olika balanserade och obalanserade trd med hjd 2.


15

e)

Nodbalans r ej praktiskt anvndbart eftersom arbetet att hlla ett trd balanserat blir strre n de
vinster man kan erhlla i samband med exempelvis skning i trdet.
Ett mindre strikt balansvillkor, dessutom r praktiskt anvndbart, r s kallad hjdbalans: Fr varje
nod ska glla att hjden hos dess vnstra subtrd och hjden hos dess hgra subtrd fr skilja med
hgst ett. Trden a-d i figur 17 r hjdbalanserade. Trd e r ej hjdbalanserat drfr att rotnodens
vnstra subtrd har hjd 1, det hgra har hjd -1, vilket ger hjdskillnaden 2. AVL-trdet r ett
hjdbalanserat binrt sktrd.
Fibonaccitrd kallas en form av konstruerade binra trd som representerar trd som uppfyller
definitionen p hjbalans med minimalt antal noder fr ett visst djup. I figur 18 visas de fem frsta
Fibonaccitrden.
tomt
trd

F1

F0

F2

F3

F4

Figur 18. Fibonaccitrd.

Fibonaccitrden F0 och F1 r givna, F0 r det tomma trdet, F1 r trdet med en enda nod.
Fibonaccitrden definieras enlig fljande:
F0 r det tomma trdet
F1 r trdet med en nod
Fn = Fn-1 +
rotnod)

+ Fn-2 (lt Fn-1 vara vnster subtrd och Fn-2 hger subtrd under en ny

Med hjlp av Fibonaccitrd kan man visa att ett hjdbalanserat trd maximalt r 44% djupare n
ett perfekt balanserade trd med samma antal noder och garanterat har logaritmisk tidskomplexitet.

2.4.3 AVL-trd
Ett AVL-trd r ett hjdbalanserat binr sktrd. Det tillhr ocks en kategori av trd som kallas
sjlvbalanserande, eftersom det ingr i insttnings- och borttagningsoperationerna att obalanser
som uppkommer justeras. Fr att gra balanskontrollen enkel lagras i varje nod dess hjd, se trdet
till vnster i figur 19.
6
2
0

10
1
8
0

2
1
12
0

5
0

10
1
8
0

2
1
12
0

5
0

10
2
8
0

12
1
15
0

Figur 19. AVL-trd.

Insttning och borttagning i ett AVL-trd grs inledningsvis som i ett enkelt binrt sktrdet. Vid
insttning grs frst en trdskning och sedan stts ett lv med det nya elementet in i uppskt
16

position. I AVL-trdet vandrar man sedan upp till roten baklnges utmed skvgen och eventuell
obalans justeras. Vid borttagning sks noden som ska tas bort upp och sedan utfrs borttagning
enligt ngot av de tre fall som beskrivits fr borttagning i ett enkelt binrt sktrd. D ett vrde tas
bort kommer en nod att tas bort ngonstans. Frn och med dess frlder och p vgen upp till roten
kontrolleras balansen fr varje nod och eventuell obalans justeras.
Balanskontroll i ett AVL-trd innebr fljande, r varje nod p vgen upp till rotnoden:
Om hjdskillnaden mellan nodens vnstra och hgra subtrd r mindre n eller lika med ett r
noden i balans. Hjden som lagras i noden justeras till maxvrdet av subtrdens hjder plus 1.
Om hjdskillnaden r lika med 2 r inte noden i balans. Det tgrdas genom att en s kallad
nodrotation utfrs som terstller balansen. Hjderna i de inblandade noderna justeras.
Vid insttning av ett vrde i ett AVL-trd kommer hgst en obalans att uppst, vid borttagning kan
flera obalanser uppst.
2.4.3.1 AVL-trdsrotationer
Det finns fyra AVL-trdsrotationer, enkelrotation med vnster barn (EV), enkelrotation med hger
barn (EH), dubbelrotation med vnster barn (DV) och dubbelrotation med hger barn (DH). I
figur 20 visas EV, allt relaterat till den nod dr man upptckt obalans.
k2

k2

k1

k1

k2
C

C
A

k1

Figur 20. Enkelrotation med vnster barn (EV) i ett AVL-trd.

Trdet till vnster i figur 20 visar ett deltrd i ett AVL-trd i balans. Noden med nyckel k2 r en
godtycklig inre nod. Nyckeln k1 r mindre n k2. De symboliserade trden A, B och C r subtrd
med lika hjd. De r godtyckligt stora och kan vara tomma. Nycklarna i trd A r mindre n k1,
nycklarna i trd B r strre n k1 och mindre n k2 och nycklarna i trd C r strre n k2.
I mittrdet i figur 20 har en nod med ett element med nyckel mindre n k1 satts in, vilket medfrt
att trdet A har kat i djup med 1. Obalans uppstr d i nod k2, eftersom dess vnstra subtrd nu r
tv niver hgre r dess hgra subtrd C. Balansen terstlls med EV: vnster barn till obalansnoden (k1) flyttas upp, obalansnoden (k2) blir dess hgerbarn, och subtrdet B blir vnsterbarn till
den nedflyttade obalansnoden. Det hgra trdet i figur 20 visar resultatet efter rotation. Av det
framgr nycklarna att den ursprungliga hjden i trdet terstlls och drmed kan ingen mer obalans
uppst hgre upp i trdet. EH r en spegelbild av EV.
Efter att sjlva rotationen utfrts justeras hjderna i de noder som behver justeras. Det enda av
subtrden A, B och C vars hjd pverkats r det subtrd dr den nya noden satts in och dess hjd
r redan justerad d obalansen upptcks (det var den justeringen som medfrde obalansen). terstr de tv noder som roterats, k1 och k2. Frst justeras hjden i den nedroterade noden k2 till
maxvrdet av dess subtrds hjder plus 1. Drefter justeras den upproterade noden k1 p samma
stt. Det senare behver egentligen inte gras, svida inte implementeringen av enkelrotation
anvnds fr att implementera dubbelrotation. Ett exempel p enkelrotation med hger barn (EH)
visas i figur 21.

17

2
0

10
1
8
0

10

2
0
12
0

10
2
8
0

6
1
12
1

2
0

12
1

8
0

15
0

15
0
Figur 21. Insttning av 15 ger obalans i 6 som justeras med EH.

I det vnstra trdet i figur 21 stts 15 in i nytt lv till hger om 12. Drefter ska hjderna i noderna
p vgen upptill roten justeras och eventuell obalans justeras. I noderna 12 och 10 uppstr ingen
obalans och endast hjderna justeras. I nod 6 har vnster subtrd hjd 0 och hger subtrd har ftt
hjd 2, en skillnad p 2 och allts obalans. Den frsta tgrden r att faststlla vilken typ av rotation
som ska gras. Insttning har skett i hger subtrd och dr till hger om hgerbarnet (10), vilket
innebr att EH ska utfras. Efter att sjlva rotationen utfrts justeras frst hjden i den nedroterade
nod 6 (till 1) och sedan hjden i den upproterade nod 10 (till 2).
Om vrdet som sattes in i trdet i figur 20 i stllet hade hamnat i subtrdet B och det kat i hjd ser
vi att EV inte fungerar. Den skuggade noden skulle sitta under B och efter rotation skulle hjdskillnaden mellan A och B vara 2 och noden k1 skulle vara i obalans. Fr att hantera en obalans av detta
slag krvs s kallad dubbelrotation, se figur 22.
k3

k3

k1

k1
k2

k1

k3

k2
D

k2

D
A

B
A

C
D

Figur 22. Dubbelrotation med vnster barn (DV) i ett AVL-trd.

Trdet till vnster i figur 22 r ett deltrd i ett AVL-trd i balans. Noden k3 r en godtycklig inre
nod, k1 r dess vnsterbarn och k2 r hgerbarn till k1; k1<k2<k3. Subtrden B och C r lika hga,
subtrden A och D r lika hga och en niv hgre n B och C. Ett specialfall uppstr nr A och D
r tomma trd k2 r d den nod som stts in (den skuggade i mittrdet).
I mittrdet i figur 22 har ett vrde satts in som medfr att B kat i djup med 1. Vi fr d obalans i
noden k3, eftersom hjdskillnaden mellan subtrdet med k1 som rot och D blivit 2. Fr att tgrda
denna obalans flyttas noden k2 upp och grs till ny rot i trdet, noden k1 blir dess vnsterbarn och
noden k3 dess hgerbarn, B blir hgerbarn till k1 och C blir vnsterbarn till k3. Trdet till hger i
figur 22 visar att detta terstller den ursprungliga hjden och drmed balansen i trdet som helhet.
Vi kan ocks se att det inte har ngon betydelse om den nyinsatta noden hamnat i C.
Efter att sjlva dubbelrotationen utfrts justeras frst hjderna i de noder som roterats ner och
sedan justeras hjden i den upproterade noden. I figur 23 visas ett konkret exempel p insttning
dr en dubbelrotation DH utfrs.

18

6
2
0

10
1
8
0

2
0
12
0

10
2
8
1

6
1
12
0

2
0

10
1
9
0

12
0

9
0
Figur 23. Insttning av 9 ger obalans i 6 som justeras med dubbelrotation med hger barn (DH).

En dubbelrotation kan implementeras med tv enkelrotationer. I s fall utfrs frst en enkelrotation


p barnet och barnbarnet till obalansnoden. Drefter grs en enkelrotation med det nu upproterade
barnbarnet och obalansnoden. Detta visas i figur 24.
k3

k3

k1

k3

k1
C

D
B

k1

k2
k2

k2

A
Figur 24. Dubbelrotation med vnster barn (DV) utfrd med tv enkelrotationer (EH+EV).

2.4.4 Rd-svarta trd


Rd-svarta trd (red-black trees) r ett populrt alternativ till AVL-trd. Liksom AVL-trd har
rd-svarta trd en logaritmiskt tidskomplexitet och r ocks ett form av sjlvjusterande trd. Ett
rd-svart trd r ett binrt sktrd med fljande egenskaper:
1.

Varje nod r frgad antingen rd eller svart.

2.

Roten r alltid svart.

3.

Om en nod r rd mste dess barn vara svarta flera rda noder i fljd fr ej frekomma.

4.

Varje vg frn en nod till ett lv, inklusive lvet, mste innehlla lika mnga svarta noder.

Man har dessutom konventionen att ett tomt subtrd r svart.


En frdel med rd-svarta trd r att de vanligtvis r snabbare n AVL-trd eftersom balansering
kan gras redan vid skningen ner genom trdet. Genom att noderna i rd-svarta trd har en
referens (pekare) till frldern r det mjligt att anvnda effektiva iterativa algoritmer.
Det finns tv varianter av rd-svarta trd, bottom-up och top-down. Bottom-up avser att ett pass
ner i trdet, fr att exempelvis ska upp den lvposition dr ett nytt vrde ska sttas in, frst utfrs
och sedan ett pass upp i trdet fr att kontrollera och justera eventuella obalanser som uppsttt.
Top-down avser att justeringen av trdet gr redan p vgen ner i trdet och att inget pass uppt
drfr behver genomfras.
Genom att analysera rd-svarta trd kan man visa att, om varje vg frn roten till ett tomt trd innehller s svarta noder, mste det finnas minst 2s-1 svarta noder i trdet. Vidare, eftersom roten alltid
r svart och det inte kan finnas tv rda noder i fljd utmed en vg, r hjden i ett rd-svart trd
19

som mest 2log(n+1). Skning r drmed en operation med garanterat logaritmisk tidskomplexitet.
Hjden r fr vrigt typiskt densamma som hjden i ett AVL-trd av motsvarande storlek.
I figur 25 visas ett rd-svart trd, som har tillkommit genom insttning av elementen 17, 87, 21,
72, 25, 58, 32, 45, 63, 75, 96, 38, 11 och 51. Svarta noder r skuggade.
32
21
17

72
25

58

11

45

87
63

75

96

38 51
Figur 25. Ett rd-svart trd.

AA-trd r en frenklad form av rd-svart trd, vilka r enklare att implementera och kan vara ett
bra val i vissa situationer dr man vill ha ett balanserat trd dr borttagning ska gras.
2.4.4.1 Insttning i bottom-up rd-svarta trd
En ny nod stts in som ett lv, alltid rtt. Om den skulle frgas svart skulle det bryta mot egenskap
4 (se ovan). Om frldern d r svart r insttningen klar. Om frldern dremot r rd bryter detta
mot egenskap 3 och d mste noder frgas om och/eller roteras.
D frldern till en rd nod ocks r rd finns det flera fall att ta hnsyn till, vart och ett med ett
spegelvnt symmetrisk fall. Farfrldern r i detta fall alltid svart, annars finns det redan fre
insttningen tv rda noder i fljd. Om frlderns syskon r svart och den nya noden r ett utsides
barnbarn terstlls egenskap 3 med en enkelrotation och lmplig omfrgning. Om den nya noden
r ett insides barnbarn terstller en dubbelrotation och lmplig omfrgning egenskap 3. Dessa tv
fall har generaliserats i figur 26.
g

x
enkelrotation

D
g

s
dubbelrotation
D
B

C
D

Figur 26. Bottom-up-splayning d splaynodens frlders syskon r svart.

Om frlderns syskon (s) i stllet r rtt fungerar varken enkel- eller dubbelrotationen ovan, eftersom bda resulterar i flera rda noder i fljd. I detta fall mste frlderns syskon och den nya
rotnoden i subtrdet samtliga frgas rda, vilket visas fr enkelrotationsfallet i figur 27.

20

s
enkelrotation

C
A

Figur 27. Bottom-up-splayning d splaynodens frlders syskon r rtt.

ven i dubbelrotationsfallet kommer roten i det roterade trdet att vara rd, vilket innebr problem
om frldranoden till subtrdet ocks r rd. Man skulle kunna fortstta att rotera uppt till dess
tv rda noder i fljd inte lngre frekommer eller till dess roten ns och d terstlls till svart.
Detta innebr dock ett pass tillbaka upp i trdet, precis som i AVL-trdet, vilket man vill undvika.
2.4.4.2 Insttning i top-down rd-svarta trd
I ett top-down-splaytrd utfrs frgbyten och rotationer redan p vgen ner genom trdet p ett stt
som garanterar att frldranodens syskon r svart. Detta innebr att ett rtt lv kan sttas in utan
ytterligare tgrd eller med endast en enkel- eller dubbelrotation fr att slutjustera trdet.
x

Figur 28. Omkastning av frger.

Om man p vgen ner har en nod x med tv rda barn, se figur 28, frgas noden rd och barnen
svarta, dvs frgerna kastas om (color flip). Antalet svarta noder p vgen mellan x och lven ndras
inte men om x:s frlder r rd finns nu tv rda noder i fljd. Nu visar det sig att syskonet till x:s
frlder inte kan vara rtt och drmed kan ngon av rotationerna i figur 26 anvndas fr att justera
trdet och terstlla egenskap 3. Antag att 42 ska sttas in i trdet i figur 29 nedan.
32

32

21
17
11

25

58
45

17

87
63

58

21

72

75

96

25

11

45
38 51

72
87

63
75

38 51
a. efter att frgen p 45, 38, 51 kastats om.

b. efter enkelrotation 72-58 och frgbyte (58 och 72).

32
58

21
17
11

96

45

25

38 51
42

72
87

63
75

96

c. efter insttning av 42, som en rd nod.


Figur 29. Insttning av 42 i trdet i figur 25.
21

Nr skningen nr noden 45 r detta en nod med tv rda barn. Omkastning av frgen medfr att
45 blir rd, 38 och 51 svarta, se figur 29 a. Detta ger tv rda noder i fljd, 58 och 45. Notera att
syskonet till 58 r svart. Noden 45 r en utsidesnod i frhllande till farfrldern 72, s en enkelrotation utfrs mellan frldern 58 och farfrldern 72, med tillhrande omfrgning av noder, se
figur 29 b. En rd nod med 42 stts sedan in och eftersom dess frlder r svart r insttningen klar.
Om frldern varit rd hade ytterligare en rotation behvts.

2.4.5 Splaytrd
Splaytrdet r ett sjlvjusterande binrt sktrd med amorterad logaritmisk kostnad per operation.
Detta innebr att en enskild operation kan vara kostsam men att en sekvens av operationer
garanteras uppfr sig som om varje enskild operation i sekvensen hade uppfrt sig logaritmisk.
Idn bakom splaytrd r att ofta efterfrgade element ska befinna sig nra roten och drmed ha en
kortare skvg n mindre efterfrgade element. I vissa sksituationer r vissa element mer efterfrgade n andra. Man brukar tala om 90/10-principen, vilket avser att i 90 procent av skningarna
r det endast 10 procent av elementen som efterfrgas. I sdana fall kan splaytrdet vara vl lmpat.
Fr att efterfrgade element ska befinna sig nra roten utfrs splayning i samband med varje skning, vilket innebr att skt elementet flyttas (roteras) till roten. Om inte det skta elementet finns
splayas i stllet ngot nrliggande element.
Det finns flera varianter av splaytrd, bl.a. bottom-up-splaytrd och top-down-splaytrd. I
bottom-up-fallet sks frst efterfrgat element med en vanlig trdskning och splayas sedan till
roten. I top-down-fallet grs splayning redan p vgen ner och endast ett pass genom trdet
behvs.
2.4.5.1 Bottom-up-splaytrd
En skning i ett bottom-up-splaytrd inleds med en vanlig trdskning. D det skta elementet
hittats roteras noden i frga, splaynoden, till roten genom en fljd av dubbelrotationer, utom d
splaynoden hamnat direkt under rotnoden, i vilket fall en avslutande enkelrotation utfrs.
Tre slags rotationer kan frekomma i ett bottom-up-splaytrd, zig, zig-zag respektive zig-zig, var
och en i en symmetrisk vnster- och hgervariant.
zig-left och zig-right r enkelrotationer som endast utfrs d splaynoden r vnster- respektive
hgerbarn till rotnoden och motsvarar enkelrotation med vnster barn respektive med hger
barn i ett AVL-trd, se figur 20.
zig-left-zag-right och zig-right-zag-left r dubbelrotationer som motsvarar dubbelrotation med
vnster barn respektive dubbelrotation med hger barn i ett AVL-trd, se figur 22.
zig-zig-left r en dubbelrotation som utfrs d splaynoden r vnsterbarn till sin frlder och
frldern r vnsterbarn till sin frlder, se figur 30. Zig-zig-right utfrs d splaynoden r
hgerbarn till sin frlder och frldern r hgerbarn till sin frlder. Zig-zig-rotationerna
saknar motsvarighet i AVL-trdet.
k3

k1

k2

k2
D

k1

C
A

k3
B

Figur 30. Zig-zig-left i ett bottom-up-splaytrd.

22

Insttning i ett bottom-up-splaytrd grs p samma stt som i ett enkelt binrt sktrd varefter den
nya noden med det insatta elementet, en lvnod, splayas till roten.
Vid borttagning sks frst det vrde (x) som ska tas bort upp, vilket medfr splayning till roten. I
det allmnna fallet har den uppsplayade noden tv subtrd, TV till vnster och TH till hger, se det
vnstra trdet i figur 31.
x

k
TV

TH

TV

TV

Figur 31. Borttagning i bottom-up-splaytrd, efter att vrdet som ska tas bort, x, skts upp.

Efter att noden med vrdet som ska tas bort splayats till roten sks antingen inorder fregngare
eller inorder efterfljare upp. Det senare innebr att det minsta elementet (k) i hger subtrd sks
upp och splayas till roten av hger subtrd, se mittrdet i figur 31. Den uppsplayade noden k saknar
vnsterbarn och dr kan TV placeras. Noden med x kan nu lnkas ur och noden k gras till ny rotnod, se det hgra trdet i figur 31. Om vrdet som ska tas bort r det minsta vrdet kommer TH att
vara tomt och roten TV kan direkt gras till ny rot i splaytrdet d x tas bort.
2.4.5.2 Top-down-splaytrd
Top-down-splayning utfrs redan i samband med skningen ner genom trdet. Trdet delas i samband med detta upp i tre deltrd, ett vnstertrd, ett mittrd och ett hgertrd, se figur 32.
V

H
M

Figur 32. Principen fr uppdelning av ett top-down-splaytrd vid splayning.

Frn brjan r vnster- och hgertrden tomma och mittrdet utgr splaytrdet. Vid skningen
flyttas delar av mittrdet successivt till sidotrden. Vnstertrdet fr ta emot deltrd med element
som r mindre n det skta, hgertrdet element som r strre.
Rotnoden i de deltrd som flyttas till vnster kommer inte att ha ngot hger subtrd och rotnoden
i de deltrd som flyttas till hger kommer inte att ha ngot vnster subtrd. Denna lediga position
hlls reda p och nsta deltrd som flyttas ut till den sidan kommer att placeras dr. Djupet dr
insttning av nsta deltrd grs kar drfr med enbart en niv per utflyttning. "Hacket" i de
symboliserade hger- och vnstertrden i figur 32 avser den egenskapen. Detta framgr lite mer i
detalj nr de olika rotationerna beskrivs nedan.
D ett skt elementet finns i trdet hamnar noden med detta till slut i mittrdets rot. Eventuella
kvarvarande subtrd flyttas drefter ut till motsvarande sidotrd och sedan flyttas vnstertrdet till
rotnodens vnstra sida och hgertrdet till dess hgra sida. Slutresultatet r allts ett trd dr skt
vrde sitter i roten.
Om det skta vrdet inte finns i trdet kommer skningen att upphra d antingen inorder fregngare eller inorder efterfljare hamnat i mittrdets rot. Endast ett subtrd till rotnoden kan finnas
i detta fall (dr det skta vrdet inte kan finnas). Detta flyttas till motsvarande sidotrd och sedan
hngs sidotrden in under rotnoden i mittrdet.
Efter splayningen som beskrivs ovan slutfrs den operation som franledde splayningen. Om det
enbart var fr att ta reda p om ett vrde finns i trde r det bara att kontrollera om det r detta som
23

nu finns i rotnoden. Om det gllde insttning kan det vara fel om vrdet redan finns i trdet, i annat
fall stts en ny nod med det vrdet in som ny rotnod. Vid borttagning br vrdet finnas i roten,
annars kan det vara fel, och det ska d tas bort p ngot lmpligt stt (se figur 38). Insttning och
borttagning beskrivs lite mer ingende nedan men frst top-down-splaytrdets rotationer.
De splayrotationer som finns fr top-down-splaytrd har motsvarigheter i bottom-up-splaytrd och
benmns lika, dvs zig, zig-zag och zig-zig. Utfrandet r annorlunda men effekten r i princip
densamma. S lnge en dubbelrotation kan utfras s vljs det, enkelrotation i princip endast som
en sista rotation i en sekvens av splayrotationer. Det finns dock frenklad zig-zag som innebr att
endast en zig utfrs nr situationen egentligen motsvarar en zig-zag. Anledningen r att detta ger
ptagligt enklare implementering.
Enkelrotation zig-left utfrs enligt figur 33. Frutsttningen fr att denna ska utfras r att k1 r det
skta elementet eller att det subtrd till k1 dr det skta elementet hr hemma r tomt, A om skt
elementet r mindre n k1, B om strre n k1.
k2

k1

k1
A

C
A

k2

zig-left

C
Figur 33. Enkelrotation zig-left.

Enkelrotation zig-left innebr att rotnoden i mittrdet (k2) och dess hgerbarn (C) flyttas till hger
sidotrd (H) och k1 blir ny rot i mittrdet. Om k1 var det skta elementet kan subtrden A och B
bda innehlla noder eller vara tomma. Om k1 inte var det skta elementet mste tminstone ngot
av subtrden A eller B vara tomt, det trd dr skt element skulle ha funnits.
Dubbelrotation zig-zag utfrs om skt vrde hr hemma i vnster eller hger innertrd till mitttrdets rot. I figur 34 antas skt element finnas i subtrdet med k2 som rot. En dubbelrotation
zig-left-zag-right utfrs genom att roten i mittrdet (k3) och dess hgra barn D flyttas till hger
sidotrd, vnsterbarnet (k1) och dess vnstra subtrd A flyttas till vnster sidotrd. Subtrdet med
k2 som rot blir nytt mittrd. Noderna k1 och k3 kommer alltid att sakna hger respektive vnster
subtrd och det r till dessa positioner som nsta utflyttning grs.
k3

k2

k1
D

k2

k1

k3

zig-left-zag-right

A
B

Figur 34. Dubbelrotation zig-left-zag-right.

Frenklad zig-zag-rotation innebr att man i en sdan situation endast utfr en enkelrotation, i en
zig-left-zag-right-situation endast zig-left. Om situationen r den som visas figur 34 utfrs allts en
zig-left enligt figur 33. I figur 34 flyttas k3 och D till H och k1 blir ny rotnod i mittrdet med k2
som hgerbarn. Det extra varv som detta medfr i huvudslingan fr splayalgoritmen uppvgs av
den frenkling av koden som erhlls genom att specifik kod fr zig-zag-rotationerna elimineras.
Observera att detta inte pverkar vad som ska gras i nsta varv det beror helt p mitttrdets (nya)
struktur vilken slags rotation som ska vljas, om ytterligare splayning behvs.

24

k3

k2

k1

k1

k2

k3

zig-left-zag-right

A
B

Figur 35. Frenklad zig-left-zag-right.

Dubbelrotation zig-zig utfrs om skt vrde hr hemma i vnster eller hger yttertrd till mittrdets
rot. I figur 36 antas skt element finnas i subtrdet med k1 som rot. Dubbelrotation zig-zig-left
utfrs genom att enkelrotation utfrs med rotnoden (k3)och dess vnstra barn (k2) och att detta
roterade deltrd flyttas till hger sidotrd. Subtrdet med k1 som rot blir nytt mittrd. Noden k2
saknar alltid vnster subtrd och nsta subtrd som flyttas ut till hger sidotrd placeras dr.
k3

k1

k2
D

k1

zig-zig-left

k2

k3

C
A

Figur 36. Dubbelrotation zig-zig-left i top-down-splaytrd.

Om insttning ska gras ska en ny nod sttas in som rot i trdet noderna i det splayade trdet ska
lnkas p lmplig plats, se figur 37. Om det nya elementet x r mindre n k ska noden med k vara
hgerbarn till den nya rotnoden, se mittrdet. Om det nya elementet x r strre n k ska noden med
k vara vnsterbarn till den nya rotnoden, se det hgra trdet.
x

x
k

TV

TH

TV

TH
TV

TH
x<k

x>k

Figur 37. Insttning i top-down-splaytrd, efter inledande skning.

Om borttagning ska gras har elementet som ska tas bort splayats till rotnoden. Sedan sks det
strsta elementet i vnster subtrd (TV), vilket innebr att noden med det elementet (k) splayas till
roten av Tv. Den noden kommer inte att ha ngot hgerbarn och dit flyttas hger subtrd (TH). I
figur 38 visas hur borttagning av ett element x grs, efter att x har splayats till roten av trdet. Alternativt kan det minsta elementet i Th vljas fr att erstta x.
x

x
TV

TH

TH

find_max

Figur 38. Borttagning ur top-down-splaytrd, efter inledande skning.


25

TH

Innan man sker strsta vrdet i vnster subtrd kontrolleras att subtrdet inte r tomt, vilket r
fallet om det element som ska tas bort r det minsta vrdet i trdet. Om vnster subtrd r tomt blir
hger subtrd (TH) det nya splaytrdet. Om vrdet som ska tas bort r det strsta i trdet blir Tv det
nya splaytrdet.

2.4.6 B-trd
B-trd r en vanlig skstruktur fr sekundrminneslagrade data. Det finns flera varianter men
gemensamt r att de r sktrd av vanligtvis hg grad, eller ordning, typiskt flera hundra. I
kombination med att B-trden r balanserade ger detta sktrd med mycket litet djup.
Ett B-trd av ordning M (grad M) r ett trd med fljande egenskaper:
Dataposter lagras i lvnoderna.
Lvnoderna ligger samtliga p samma djup och ska innehlla mellan L/2 (gller ej rotnod, se
nedan) och L dataposter.
Inre noder kan lagra upp till M-1 nycklar och kan ha upp till M motsvarande subtrd. Den i:te
nyckeln r den minsta nyckeln i subtrd i+1 (det hgra subtrdet)
Alla inre noder, utom rotnoden, ska ha mellan M/2 och M barn.
Rotnoden r antingen ett lv med 1-L dataposter eller en inre nod med mellan 2 och M barn.
Ett B-trd med just dessa egenskaper brukar betecknas B+-trd. En annan variant r B*-trd, dr
inre noder ska innehlla minst 2M/3 nycklar och lven minst 2L/3 element. Det som sgs nedan
avser B+-trd d det gller sdana aspekter.
De krav som stlls p antalet barn till inre noder och antalet dataposter i lven innebr att noderna
mste vara minst fyllda till hlften och drmed att trdet inte kan degenerera till motsvarande ett
binrt trd. Strukturen hos en inre nod i ett B-trd av ordning M visas i figur 39. Det aktuella antalet
barn, m, ska vara M/2 m M och antalet nyckelvrden m-1. I subtrdet till vnster om nyckel ki
finns poster med nycklar k < ki och i subtrdet till hger finns poster med nycklar k ki.
k1

km-1

kM-1

m barn
Figur 39. Inre nod i ett B-trd av ordning M.

Det finns ett par speciella former av B-trd som kallas 2-3-trd och 2-3-4-trd, vilket r B-trd med
ordning 3 respektive 4. Beteckningen 2-3 kan man associera med att en inre nod i ett 2-3-trd kan
ha antingen 2 eller 3 barn, och beteckningen 2-3-4 att en inre nod i ett 2-3-4-trd kan ha 2, 3 eller
4 barn.
Vrdena p M och L vljs s stora som mjligt med tanke p att en nod ska rymmas i ett
sekundrminnesblock. En inre nod ska ha plats fr M-1 nycklar och M adresser till andra block Om
de aktuella nycklarna upptar 16 byte och adresserna 4 byte, gr det t 16M-16 byte fr nycklarna
och 4M byte fr adresserna, totalt 20M-16 byte. Om ett sekundrminnesblock rymmer 8192 byte
kan ordningen M maximalt vara 410. Om de aktuella dataposterna upptar 256 byte, ryms det
maximalt 32 poster i ett lv.
2.4.6.1 Insttning i B-trd
Insttning i ett B-trd inleds med en trdskning, vilken leder till den lvnod dr den datapost som
ska sttas in hr hemma. Om det finns plats i noden kan dataposten sttas in utan ytterligare
tgrder, i annat fall har ett verskott uppsttt. verskott kan hanteras p tv stt, antingen genom
noddelning eller genom att frska hitta plats i en syskonnod.
26

Noddelning innebr att en ny hger syskonnod skapas. Posterna, inklusive den nya posten, frdelas
jmnt mellan de tv noderna. Detta kallas att balansera, vilket mste gras fr att uppfylla
fyllnadsgradskravet p minst L/2 poster i en lvnod. Den nya noden ska nu sttas in i frldranoden, direkt till hger om den delade noden. Det innebr att alla nycklar och adresser i frldranoden till hger om den delade nodens position mste flyttas ett steg t hger fr att lmna plats t
den nya nodens nyckel och adress. Om frldranoden r full gr inte detta utan antingen delas den
inre noden, ett nytt hgersyskon skapas och hlften av nycklarna och adresserna flyttas ver dit,
eller s kontrolleras om det finns plats i ett nrmaste syskon ett antal nyckel-adresspar flyttas ver
genom balansering. Om samtliga noder i skvgen inklusive rotnoden r fulla och noddelning alltid grs, kommer delningsfrfarandet att till slut medfra att rotnoden delas. Det leder till att en ny
rotnod skapas och p detta stt kar ett B-trd i djup. Detta frfarande gr ocks att alla lv
kommer att finnas p samma djup, utan att det behvs ngra speciella tgrder fr att uppfylla det
kravet.
Vid frsk att hitta plats i en syskonnod inskrnks detta till att endast underska ett nrmaste
syskon, till exempel nrmast hgersyskon. Om verskottsnoden rkar vara det hgraste syskonet i
syskonskaran, undersks i stllet nrmaste vnstersyskon. Skulle ven syskonnoden var full grs
noddelning enligt ovan. Finns det ledigt utrymme i syskonnoden frdelas elementen i de tv noderna jmnt, dvs noderna balanseras. Det skulle rcka att endast flytta ver en post till syskonnoden,
men genom att balansera undviks nytt verskott i den annars fortsatt fulla verskottsnoden redan
vid nsta insttning.
Som exempel anvnds ett B+-trd av ordning M=3, dvs ett 2-3-trd, och vi antar att L=4. Fr enkelhets skull lagras heltal, vilka allts fr representera bde sknycklar och elementen fr vrigt.
Normalt r sknyckeln bara ett bland vriga vrden som ett element bestr av men speciellt i och
med att det identifierar posten. Fljande element ska sttas in:
64 18 96 58 21 85 37 51 72 45 75 82 54 87 44

I figur 40 a visas trdet efter att de fyra frsta elementen, 64, 18, 96 och 58 satts in. D 21 ska sttas
in uppstr verskott i lvnoden och en noddelning utfrs. Noddelning innebr att en ny lvnod skapas och att de fem elementen frdelas jmnt p de tv noderna, i detta fall tre i den vnstra och tv
i den hgra. Detta medfr i sin tur att en inre nod mste skapas, med de tv lvnoderna som barn
och med den minsta nyckeln i den hgre noden som utvald sknyckel. Resultatet visas i figur 40 b.

18
58
64
96

64

64

18 64
21 96
58

18 64
21 85
37 96
58

51

18
21
37

64

51 64
58 85
96

51

18
21
37
45

64

51 64
58 72
85
96

Figur 40. Insttning i B-trd av ordning 3 av: 64, 18, 96, 58, 21, 85, 37, 51, 72, 45.

I figur 40 c visas lget efter att ytterligare tv element, 85 och 37, satts in. Nsta vrde som ska
sttas in r 51 och det ger verskott i det vnstra lvet. I detta fall skulle man kunna utnyttja att det
finns plats i det hgra syskonet och balansera men noddelning vljs och det resulterar i det trd som
visas i figur 40 d. Elementen 72 och 45 kan sedan sttas in utan att verskott uppstr, se figur 40 e.
Nsta vrde, 75, ger verskott i det hgraste lvet. Noddelning ger ett fjrde lv och drmed verskott i frldranoden, dvs rotnoden. Delning av denna ger tv inre noder med vardera tv lv och
dessutom en ny rotnod, se figur 41 a.

27

64

64

51

18
21
37
45

85

51
58

64
72
75

85
96

64

51

18
21
37
45

85

51
54
58

64
72
75
82

85
87
96

44

18
21
37

51

44
45

85

85
87
96

64
72
75
82

51
54
58

Figur 41. Insttning i B-trd av ordning 3, forts: 75, 82, 54, 87, 44.

I figur 41 b visas lget efter insttning av 82, 54 och 87. Nr till slut 44 stts in uppstr verskott i
det vnstraste lvet, vilket efter noddelning, balansering och insttning i frldern ger trdet i
figur 41 c.
2.4.6.2 Borttagning ur B-trd
Vi borttagning ur ett B-trd sks frst det lv upp dr posten med den aktuella nyckeln ska finnas.
Efter att posten tagits bort kontrolleras fyllnadsgraden. Om antalet terstende poster r strre n
eller lika med L/2 r borttagningen klar, i annat fall har ett underskott uppsttt. Vid underskott
hmtas ett nrmaste syskon, till exempel alltid nrmaste hgersyskon om sdant finns. Om underskottsnoden r den hgraste noden i en syskonskara hmtas i stllet nrmaste vnstersyskon. Om
syskonet har fler n L/2 poster, lnas poster drifrn. I annat fall sls de tv noderna ihop genom
att alla poster i den hgra noden flyttas till den vnstra. Den hgra noden, dess motsvarande
nyckelvrde och adress i frldranoden tas bort och de nycklar och adresser som eventuellt finns
till hger om denna position i frldranoden flyttas ett steg t vnster. Detta kan i sin tur leda till
underskott i frldranoden och d upprepas proceduren med att i frsta hand frska lna frn ett
nrmaste syskon och i andra hand sammanslagning med detta syskon. Om samtliga noder i
skvgen rkar ha precis M/2 barn, om inga ln r kan gras och rotnoden endast har 2 barn,
kommer sammanslagning att ske p varje niv nda upp till rotnoden. Nr de tv barnen till rotnoden sls ihop bildar den sammanslagna noden ny rotnod och den gamla tas bort. B-trdets djup
minskar.
Fr att visa borttagning ur ett B-trd utgr vi frn det trd som blev slutresultatet i insttningsexemplet ovan, se figur 41 c. Fljande element ska i tur och ordning tas bort:
72 51 64 82 85 37 44

Borttagning av 72 medfr inget annat n att elementet tas bort ur lvet. Borttagning av 51 ger inte
heller ngot underskott men innebr att det minsta elementet i noden tas bort. Dess sknyckel finns
d i en inre nod uppe i trdet, i detta fall i frldranoden. Den erstts med 54, den nu minsta nyckeln
i lvet. Borttagning av 64 innebr ocks att det minsta elementet i ett lv tas bort. I detta fall hittar
vi sknyckel i rotnoden, dr den erstts med 75. Borttagning av 82 leder till underskott. I detta fall
innehller syskonnoden fler n L/2 element och ln kan gras. Elementen ska frdelas jmt
mellan noderna, balanseras, men i detta fall flyttas endast ett vrde, 85, ver till underskottsnoden
(upp till L/4 poster kan komma att flyttas, om syskonnoden r full). Vid ln kommer de minsta
elementen att flyttas ver, s sknyckeln i frldranoden ndras alltid. I detta fall erstts 85 med
87. Efter dessa fyra borttagningar ser B-trdet ut enligt figur 42 a.

28

54

75

44

18
21
37

54

44
45

44

87

75
85

54
58

87
96

18
21
37

75

54
58

44
45

54

75
87
96

75

18 54
21 58
45

75
87
96

Figur 42. Borttagning ur B-trd: 72, 51, 64, 82, 85, 37, 44.

Borttagning av 85 leder till underskott. Inget ln kan gras, eftersom det enda syskonet har exakt
L/2 element. Noderna sls ihop genom att 87 och 96 flyttas ver till den vnstra noden. Nr sedan
nyckeln 87 och den tillhrande adressen ska tas bort ur frldranoden uppstr underskott ven dr.
I detta fall gr det att lna frn syskonet, eftersom den noden har fler n M/2 barn. Balanseringen
innebr att det hgraste lvet, det med 54 och 58, flyttas ver till den hgra sidan. Efter detta ser
trdet ut som i figur 42 b.
Borttagning av 37 kan sedan gras utan underskott och inget annat pverkas heller. Efterfljande
borttagning av 44 ger dremot underskott. Inget ln kan genomfras och lven i det vnstra
subtrdet sls ihop. Detta ger underskott i frldranoden och i detta fall gr det inte att lna, eftersom det hgra subtrdet har exakt M/2 barn. De inre noderna under rotnoden sls ihop och blir
ny rotnod. Trdet ser efter detta ut som i figur 42 c.

29

30

3 Hashtabeller
En hashtabell r en skstruktur dr varje nyckel avbildas p en adress i tabellen. Skning beror d
inte p hur mnga poster som finns i tabellen och kan drfr i princip utfras i konstant tid.
I realiteten r inte situationen vanligtvis inte s idealisk. Hashfunktionen som avbildar nyckelvrden p adresser, s kallade hemadresser, kan vanligtvis inte avbilda varje nyckelvrde p en
unik adress. Tv eller flera nycklar kan f samma hemadress, vilket kallas kollision. D kollision
intrffar mste en alternativ plats hittas fr den post som inte kan lagras p sin hemadress och fr
det anvnds en kollisionshanteringsmetod.
Dimensionering av hashtabeller r i allmnhet viktigt. Hashfunktioner kan krva specifika tabellstorlekar fr att fungera bra, till exempel att storleken ska vara ett primtal. Fr flera av de
kollisionshanteringsmetoder som behandlas nedan fr inte heller tabellen bli fr full. Vid en
fyllnadsgrad p 70-80% brjar prestanda fr vissa metoder att sjunka ptagligt. Fr att s kallad
kvadratisk sondering ska fungera bra gr grnsen vid 50%. Detta betyder att man dels mste vlja
lmplig tabellstorlek, dels kan behva verdimensionera 20-30%, eller mer.

3.1 Hashfunktioner
En hashfunktion ska vara reproducerbar, snabb och ger en slumpmssig spridning av nyckelvrdena ver adressrymden.
Det r inte enkelt att finna bra hashfunktioner och speciellt inga universalfunktioner. Ett problem
r att nyckelvrdesmngden ofta r mycket strre n adressrymden. Personnummer ger en nyckelvrdesmngd som i princip omfattar 1010 mjliga nycklar. Om personnummer anvndes som
nyckel men inte fler n 10.000 personer behver hanteras r det nskvrt att dimensionera
hashtabellen drefter.
Olika slags nyckelvrden krver olika former av transformationer fr att ge en god spridning av
adresserna. Ett personnummer kan lagras som en teckenstrng men det r ocks tnkbart att lagra
det som ett heltal. Vilken av dessa representationer som anvnds innebr att helt olika transformationer krvs fr att ge ett bra resultat.
Ofta r det inte i frvg knt exakt vilka nycklar bland de tnkbara som kommer att upptrda och
ofta inte heller exakt hur mnga poster som kommer att behva lagras.
D det gller att sprida nyckelvrdena jmnt ver adressrymden, vore det idealiskt om varje nyckel
kunde transformeras till en unik adress. En funktion med den egenskapen kallas fr en perfekt
hashfunktion. Om dessutom hashfunktionen kan generera samtliga adresser, s att hashtabellen
kan fyllas till 100%, kallas hashfunktionen fr en minimal perfekt hashfunktion. Det r endast
under mycket speciella frutsttningar som sdana ideala funktioner kan konstrueras. D det gller
hashfunktioner bygger mycket p empiriska studier och p frmgan att gra bra uppskattningar.
3.1.1 Frbearbetning av nycklar
Innan en nyckel transformeras kan frbearbetning (preconditioning) av nyckelvrdet behvas.
Nyckelns storlek kan annars gra det svrt eller omjligt att bearbeta den direkt med aritmetiska
eller logiska operationer, vilket mnga transformationer utgrs av. Till exempel alfanumeriska
nycklar, strngar, behver normalt frbearbetas innan sjlva hashfunktionen kan appliceras.
Frbearbetning av alfanumeriska nycklar kan gras genom att infra en heltalskod fr varje tecken.
Siffertecknen 0-9 kan exempelvis kodas med heltalen 1-10, bokstverna A- med heltalen 11-38,
specialtecken som +, -, %, ? med heltal 39, 40, osv. De heltal som erhlls fr de tecken som ingr
i en nyckel kombineras p ngot lmpligt stt. Nyckeln AB3 kan transformeras till heltalet 11124

31

genom att helt enkelt byta ut tecknen i teckenstrngen till motsvarande sifferkoder. ven andra
manipulationer av heltalskoderna tnkas fr att erhlla ett lmpligt heltal.
Ofta nskas ett resultat som kan lagras i ett datorord (till exempel 32 bitar) s att datorinstruktioner
kan appliceras direkt. Sjlva hashfunktionen appliceras sedan p det erhllna talet.
En annan mjlighet att frbearbeta alfanumeriska nycklar r att utnyttja numeriska koder som
anvnds i datorer fr att representera tecken, till exempel ASCII-kod eller Unicode. Nyckeln AB3
kan kodas som heltalet 656651 genom att stta samman de teckenkoderna, 65, 66 och 51.
Ibland r det att fredra att stta ihop de binra teckenkoderna. Om 8-bitars ISO-kod anvnds och
nyckeln A1 transformeras, erhlls 1100000111110001, eftersom tecknet A har koden 11000001
och tecknet 1 har koden 11110001.
3.1.2 Val av hashfunktion
Val av hashfunktion beror av mnga saker:
Kan hashfunktionen vlja s att den passar de nycklar som upptrder? I en kompilator kan detta
inte gras, eftersom det r oknt vilka identifierare som program kommer att innehlla. I ett
databassystem, speciellt om det anvnds under lng tid, kan dremot s vara fallet.
r berkningstiden fr hashfunktionen kritisk? Om hashtabellen lagras p sekundrminne r det
mjligt att tkomsttiderna fr lsning och skrivning r s lnga att en i sig kostsam metod som
minimerar antalet sekundrminnesoperationer nd kan lna sig. I en kompilator dremot, som
lagrar symboltabeller i primrminnet, nskas en s snabb metod som mjligt.
Hur lnga r nycklarna? Om berkningstiden r kritisk kanske inte divisionsmetoden kan
anvndas om nycklarna r lngre n ett datorord. Om nd division nskas anvndas, kan denna
kombineras med folding som frbearbetningsmetod.
r adresserna binra eller decimala? En del metoder bygger p specifika maskininstruktioner,
som frutstter antingen binr eller decimal form.
Kan index i hashtabellen vljas? Lagras data p sekundrminne kan detta inte gras, eftersom
adresserna redan r valda i filsystemet. En del metoder krver att tabellstorleken exempelvis
r en potens av 2 eller av 10, vilket stller krav p att vi mste kunna vlja index.
Hur ser nycklarna ut, finns det ngot mnster? Vissa hashfunktioner kan ge hg kollisionsfrekvens om det finns ngon form av likformighet hos nycklarna. andra sidan kan nyckelvrdena vara s vl spridda och ha en sdan form att det inte behvs ngon hashfunktion alls,
ngot som kan vara fallet om nycklar kan vljas.
Det finns ett antal beprvade nyckeltransformationer beskrivna i litteraturen och det r bland dessa
som man normalt frsker hitta en lmplig hashfunktion. Nrdetta r gjort, gller det att bestmma
vissa parametrar hos den valda transformationen fr att anpassa den till de specifika nycklarna. Sist
i denna versikt tas ett antal vanliga transformationer upp.
3.1.2.1 Divisionsmetoden
En metod som ofta anvnds i kurslitteratur r divisionsmetoden. Den bygger p att nycklarna r
heltal eller kan frbearbetas s att ett motsvarande heltal fr varje nyckel erhlls. Nycklarna
divideras med tabellstorleken T och den rest (mellan 0 och T-1) som uppstr anvnds som adress i
hashtabellen. Om inte frsta positionen i hastabellen indexeras 0 fr man addera det offset som
gller till frsta positionen, till exempel 1.

32

3.2 Kollisionshantering
Nr en ny post som ska sttas in hamnar p samma hemadress som en redan befintlig post har en
kollision (collision) intrffat och en alternativ plats mste hittas fr den nya posten. Det finns i
princip tv alternativ, antingen sks en ledig plats inom hashtabellen upp eller s anvnds ett separat minnesutrymme. Inom dessa tv huvudalternativ finns olika varianter, varav ngra vanliga tas
upp nedan.
Att kollisioner intrffar innebr vanligtvis ocks att klungbildning (cluster) uppstr. I grunden
innebr klungbildning att poster klumpar ihop sig p vissa stllen i tabellen men en klunga kan
ocks best poster som ligger utspridda men ingr i en gemensam skvg.
Nr klungor har uppsttt har de ofta en tendens att vxa till ytterligare. Klungor innebr ett kat
skarbete, s det r nskvrt att frska eliminera eller minska risken fr klungbildning. Man
brukar i detta sammanhang skilja mellan primr klungbildning och sekundr klungbildning.
Primr klungbildning om en kollision intrffar vid insttning kommer den klunga som man
hamnat i att utkas genom den nya posten stts in sist i klungan. Detta r en direkt konsekvens
av hur kollisionshanteringsmetoden linjr sondering fungerar, se nedan.
Sekundr klungbildning avser klungor som bestr av poster med samma hemadress och dr
kollisionshanteringsmetoden besker samma alternativadresser. Kollisionshanteringsmetoderna linjr sondering och kvadratisk sondering lider bda av sekundr klungbildning.
Fr att eliminera eller reducera klungbildning kan man frska angripa orsakerna till klungbildningen. Fr primr klungbildning r strategin att under sonderingen hoppa ur den klunga som
man hamnat i, vilket r iden bakom kollisionshanteringsmetoden kvadratisk sondering. Fr att
komma t sekundr klungbildning mste kollisionshanteringsmetod, beroende p nycklarna,
kunna variera vilka positioner som besks i sonderingen, vilket r vad kollisionshanteringsmetoden dubbelhashning gr.
3.2.1 Linjr sondering
Linjr sondering (linear probing) innebr att linjrskning grs frn hemadressen och framt i
tabellen. Om slutet av tabellen ns fortstter skningen frn brjan och kan till slut terkomma till
hemadressen. Vid insttning skulle detta innebra att tabellen r full men s lngt ska det aldrig g
i realiteten. Fljande formler definierar berkningen av hemadressen h0 och, om kollision uppstr,
den linjra sonderingen. Hashtabellens storlek r T och adresserna gr frn 0 till T1:
h0 = hash(nyckel)
hi = (h0 + i) mod T

hemadressen
i = 1, 2, , T.

Till metodens frdelar hr dess enkelhet och att den ger fullstndig tabelltckning.
Till dess nackdelar hr att det finns bengenhet till klungbildning. Hamnar man i en
klunga vid insttning kommer man inte ur klungan, utan den vxer garanterat till p
slutet. Kodningsmssigt kan det vara enklare att anvnda fregende adress och ka
den med 1:
hi = (hi-1 + 1) mod T

i = 1, 2, , T.

3.2.2 Kvadratisk sondering


Kvadratisk sondering (quadratic probing) innebr att alternativa platser i tabellen sks p ett
avstnd frn hemadressen som kar med kvadraten p antalet frsk. Frsta frsket grs en (12)
position framt i tabellen frn hemadressen. r inte den platsen ledig grs det andra frsket fyra
(22) positioner framt i tabellen frn hemadressen, tredje frsket grs nio (32) steg framt frn
hemadressen, osv.

33

I detta fall r det inte uppenbart att tabelltckningen r fullstndig och man kan dessutom visa att
efter T/2 sksteg kan adresser som redan underskts komma att terbeskas, vilket om inte annat
innebr att skningen blir ineffektiv. Drfr br sonderingen avbrytas efter T/2 steg, avrundat
nedt. I praktiken ska sonderingen normalt inte behva fortg s lngt.
Hemadressberkning och kvadratisk sondering beskrivs av fljande formler fr en tabell med storlek T och med adresser frn 0 till T1:
h0 = hash(nyckel)
hi = (h0 + i2) mod T

hemadressen
i = 1, 2, , T/2.

Iden r att nr en ledig adress hittats innebr detta ocks att vi hoppat ur klungan,
dvs inte hamnade i frsta lediga positionen efter klingan, som i fallet linjr sondering, utan en bit ifrn. Kvadreringen av i i formeln ovan kan undvikas med fljande
alternativa formel:
hi = (hi-1 + i) mod T

i = 1, 2, , T/2.

Detta ger visserligen inte exakt samma positioner som vid kvadrering av i (avstnd
1, 4, 9, 16, 25, frn hemadressen) men ngot liknande (1, 3, 6, 10, 15, ).
3.2.3 Dubbelhashning
Dubbelhashning r i princip linjr sondering men att det steg som anvnds i sonderingen slumpas
ur den aktuella nyckeln. I linjr sondering anvnds alltid steget 1. Iden med dubbelhashningen r
att olika nycklar ska ge olika steg och drmed att olika positioner i tabellen besks i sonderingen.
Om en nyckel ger steget 2 kommer adresserna h0+2, h0+4, h0+6, o.s.v. att beskas. Om en annan
nyckel med samma hemadress ger steget 5 kommer positionerna h0+5, h0+10, h0+15, och s vidare
att beskas. Ibland kommer samma position att underskas, till exempel h0+10 i detta fall, men i
princip anses sekundr klungbildning nd vara eliminerad.
Hemadressberkning och dubbelhashning beskrivs av fljande formler fr en tabell med storlek T,
som adresseras frn 0 till T-1:
h0 = hash(nyckel)
c = R - (nyckel mod R)
hi = (h0 + ic) mod T

hemadressen
R r ett primtal, sdant att R < T
i = 1, 2, , T.

I formeln fr c ovan frutstts nyckel vara ett heltal, vilket kan innebra att den mste frarbetas.
Om den hashfunktion som anvnds r divisionsmetoden med inbyggd frbearbetning kan den
anvndas med i s fall R i stllet fr T som divisor. Sonderingssteget c kommer d att hamna mellan
1 och R. Fr att erhlla maximal spridning av sonderingssteget c, vljs R som det strsta primtalet
som r strngt mindre n tabellstorleken T. ven i detta fall kan en alternativ formel som undviker
multiplikationen anvndas:
hi = (hi-1 + c) mod T

i = 1, 2,

34

3.2.4 Separat lnkning


Ett stt att hantera kolliderade poster r att varje tabellingng fr vara en
lnkad lista. Poster med samma hemadress lggs in i en lnkad lista,
vilken kommer att utgra en klunga p den adressen.
Iden med separat lnkning (separate chaining) r att ven om skning i
de lnkade listorna r en linjr operation kommer listorna att vara korta
och skningen tillrckligt effektiv.
Fyllnadsgraden 100% inte r en vre grns fr en hashtabell med separat
lnkning, utan snarare en lmplig fyllnadsgrad. En lgre fyllnadsgrad
frbttrar inte ptagligt prestanda och en, inom rimliga grnser, hgre
fyllnadsgrad r acceptabel och kan innebra att utrymme sparas, jmfrt
med om man mste verdimensionera tabellen.

3.3 Omhashning
Omhashning (rehashing) innebr att en tabell utkas om fyllnadsgraden verskrider en viss niv,
till exempel 70%. En ny, strre tabell skapas och alla poster i den gamla tabellen flyttas ver. verflyttningen grs med en ny hashfunktion som r anpassad till den nya tabellens storlek, drav namnet omhashning. Om divisionsmetoden anvnds r omhashningen enkel, eftersom den anvnder
just tabellstorleken som divisor. Den nya tabellens storlek kan till exempel bestmmas genom att
dubblera den gamla tabellens storlek och sedan vlja det primtal som r nrmast strre.

3.4 Linjrhashning
Utmrkande fr linjrhashning (linear hashing) r att hashtabellens storlek kas och minskas
dynamiskt och att flera hashfunktioner anvnds samtidigt. I samband med att tabellens storlek frndras anpassas hashfunktionerna s att hela tabellen alltid adresseras. Linjr hashning utformades
ursprungligen fr externa hashtabeller men har senare modifierats och visat sig anvndbar fr ven
interna tabeller.
Hashtabellen organiseras i hinkar (buckets), vilka kan ha variabel eller fix storlek. Initialt finns M
hinkar i den tomma tabellen och de numreras 0, 1, , M-1, dr M 2.
Olika kriterier kan anvndas fr att bestmma d storleken hos hashtabellen ska kas eller minskas,
till exempel fyllnadsgraden. kning av antalet hinkar sker d ett bestmt trskelvrde fr fyllnadsgraden verskrids i samband med insttning, minskning sker d ett annat trskelvrde fr fyllnadsgraden underskrids efter att en post har tagits bort.
Om hashtabellen har fix hinkstorlek kan hinkdelning initieras ven vid verskott, det vill sga d
en ny post hamnar i en hink som redan r full. Hinkdelning sker i en bestmd ordning drfr r det
vanligtvis inte den hink dr ett verskottet uppstr som delas.
Utkning av en hashtabell sker genom delning av hinkar enligt ett frutbestmt schema. I det enkla
fallet delas en hink i taget, i lite mer komplicerade strategier delas flera hinkar d tabellen vxer.
Nedan beskrivs endast tillvxt med en hink i taget.
Hinkdelning kan gras enligt fljande schema fr en tabell med initial storlek M hinkar:
Frst delas hink nummer 0 och posterna i hink 0 frdelas med en annan hashfunktion mellan
hink 0 och den nya hinken, som fr nummer M.
Nsta gng delas hink nummer 1 och de poster som finns i den frdelas mellan hink 1 och en
ny hink M+1.

35

Delningen fortskrider i hinkordning till dess hink M-1 delats och givit upphov till hink 2M-1.
Drmed har samtliga ursprungliga hinkar delats och tabellens storleken har frdubblats till 2M.
Vid fortsatt hinkdelning brjar man om med hink 0 och delar sedan successivt hinkarna i ordning
till dess hink 2M-1 delats och tabellens storlek kat till 4M hinkar. D brjar man ter om
hinkdelningsproceduren med hink 0, osv.
Efter borttagning kontrolleras om fyllnadsgraden underskrider ett bestmt trskelvrde. Om s r
fallet minskas tabellens storlek genom att tv hinkar sls ihop. Om hink i var den senaste delade
hinken kommer den och den motsvarande hink som skapades vid delningen att sls ihop.
D nya hinkar lggs till mste skproceduren modifieras. I skproceduren anvnds drfr en fljd
av hashfunktioner, hash0, hash1, hash2, , sdana att
hashi(k) = k mod (2iM) i = 0, 1, 2...
Dessa hashfunktioner motsvarar tabellstorlekarna M, 2M, 4M och s vidare, fr vxande i. Initialt
innehller hashtabellen M hinkar och d anvnds enbart funktionen hash0. D hink 0 delats och en
ny hink M lagts till p slutet av tabellen kan den nya hinken inte adresseras av hash0 men vl av
hash1. Funktionen hash1 adresserar en tabell som innehller 2M hinkar, vilket nnu inte r fallet,
och hash1 fr drfr endast anvndas p nycklar som frst placeras i hink 0 av hash0. Funktionen
hash0 gller fortfarande fr poster som finns i de odelade hinkarna, liksom fr nya poster med
nycklar som placeras i en odelad hink av hash0. Fr varje delad hink gller allts, fr val av
hashfunktion, fljande princip:
1.

om ingen hink har delats, sk i den hink som hash0 anger

2.

om hinkar har delats, och hash0 ger adressen fr en odelad hink, sk i den hinken

3.

i annat fall, sk i den hink som hash1 anger.

D samtliga M hinkar i den ursprungliga tabellen har delats innehller tabellen 2M hinkar, 0 till
2M-1, och samtliga poster har frdelats med funktionen hash1. Det innebr att hash0 inte lngre r
av intresse. D tabellen behver utkas ytterligare startar hinkdelningsproceduren om frn hink 0
och fortstter upp till hink 2M-1. Fr odelade hinkar anvnds funktionen hash1 och hash2 anvnds
fr delade hinkar. D samtliga dessa 2M hinkar ocks har delats har hashtabellen utkats till 4M
hinkar, numrerade 0 till 4M-1, och samtliga poster har frdelats med funktionen hash2. Delningsproceduren startar om frn hink 0, denna gng med 4M hinkar och med hashfunktionerna hash2
och efter delning hash3.
Skproceduren kan beskrivas med fljande algoritm, dr k r sknyckeln, n anger antalet delade
hinkar och m den hink som k ska skas i.
m = hashi(k)
om n > 0 och m < n
(m<n innebr att m r en delad hink)
m = hashi+1(k)
Sk nyckeln k i hink nummer m.
I figur 43 visas fyra situationer fr en linjr hashtabell. Lngst till vnster visas en tom hashtabell
med initialt M=2 hinkar. Hinkstorleken frutstts vara variabel och i varje hink lagras posterna i
en lnkad lista. vriga tre delfigurer visar hur nycklar lagras och hinkar delas fr indatasekvensen
7, 2, 9, 5, 8, 4, 3. Hinkdelning har gjorts d fyllnadsgraden verskridit 2 poster per hink i genomsnitt.

36

#0

#1

#0

#1

#0

#1

#2

#0

#1

#2

#3

Figur 43. Linjrhashningstabell med M=2.

3.5 versikt av hashfunktioner


3.5.1 Sifferurvalsmetoden, sifferanalysmetoden
Sifferurval kan anvndas fr sdana nycklar som utgrs av sifferstrngar, till exempel personnummer. Idn r att vlja ut ett antal siffror ur nyckeln, vilka tillsammans fr utgra en adress. Hur
mnga siffror som vljs beror p adressrymden och siffrorna vljs med tanke p spridningen av
adresserna. Om populationen r knd i frvg kan en sifferanalys gras fr att hitta de siffror som
ger den bsta spridningen. Sifferurvalsmetoden kallas ocks sifferanalysmetoden.
Antag att hgst 10.000 personer ska kunna lagras i en hashtabell med adresserna 0-9999 och att
personnummer anvnds som nyckel. En enkel transformation vore att vlja de fyra frsta siffrorna
i personnumret. Ett uppenbart problem att det inte kan ge alla adresser i hashtabellen, utan endast
1200 av de 10.000, nmligen 1-12, 101-112, , 9901-9912. Detta ger att en dlig spridning och
hg kollisionsfrekvens redan vid lg fyllnadsgrad.
Ett bttre val av siffror vore att vlja de tv frsta, som varierar mellan 0-99, den fjrde, som
varierar mellan 0-9, och den sjtte, som varierar mellan 0-9. Detta kommer att kunna ge samtliga
adresser 0-9999. Om en analys grs upptcker man dock att spridningen inte blir likformig. Detta
beror p att siffrorna 1 och 2 frekommer mer frekvent i mnadsnumrens sista siffra och att siffran
1 frekommer ngot mer frekvent i dagnumrens sista siffra.
Man mste ocks tnka p r hur de verkligt frekommande personnumren kan frvntas vara
frdelade. Det kan ju vara s att materialet endast utgr ett speciellt urval av befolkningen.
Ytterligare en sak att tnka p r mjligheten att det kan finnas beroenden mellan siffror. Det kan
vara s att vissa sifferkombinationer r vanligare n andra, vilket kan stra frdelningen.
Korrelationsanalys mellan olika siffror r drfr lmpligt att utfra.
3.5.2 Divisionsmetoden
En av de mer effektiva nyckeltransformationsmetoderna r division. Nyckelvrdet divideras, efter
eventuell frbearbetning fr att erhlla ett heltalsvrde, med tabellstorleken och resten vid
divisionen fr utgra adressen.
D nycklar transformeras med divisionsmetoden bibehlls till viss del regelbundenheter som finns
i nyckelmngden. Nrliggande nyckelvrden kommer att ge nrliggande adresser. Om man
dividerar med till exempel 31 kommer nycklarna 993, 994 och 1000 att ge adresserna 1, 2 respektive 8, liksom ven nycklarna 838, 839 respektive 845. Denna egenskap r negativ och kan
medfra klungbildning p vissa adresser.

37

Tabellstorleken br vljas med omsorg, till exempel ett stort primtal, vilket gr det osannolikt att
olika nycklar har detta tal som gemensam faktor. I praktiken har det visat sig fungera bra med udda
divisorer utan gemensamma faktorer mindre n 20. Jmna divisorer ska undvikas eftersom de
systematiskt transformerar udda och jmna nycklar till udda respektive jmna adresser.
3.5.3 Mittkvadratmetoden
I mittkvadratmetoden multipliceras nyckeln med sig sjlv, kvadreras, och drefter vljs ett lmpligt
antal siffror eller, om p binr niv, bitar ur resultatets mitt.
Nyckeln 123456 kvadrerad ger 15241383963 och de tre mittersta siffrorna, 138, kan exempelvis
vljas som adress. Varfr det r viktigt att vlja vrdet mitt i resultatet, ser man av fljande:
123456
123456
740736
617280
493824
370368
246912
+ 123456
15241383963

Antag att de tre siffrorna lngst till hger, 963, vljs som adress. Om man studerar hur detta vrde
uppkommit ser man att det skett genom multiplikationer som endast berr de tre lngst till hger
stende siffrorna i nyckel. Alla nycklar som slutar p 456 kommer att transformeras till adressen
963, vilket r ngot som br undvikas. Fr de tre mittersta siffrorna dremot gller att de tillkommit
med hela nyckelvrdet inblandat. En ndring av ngon siffra i nyckeln ger med stor sannolikhet en
annan adress. Det finns fler metoder som bygger p multiplikation.
3.5.4 Folding-metoder
I foldingmetoderna (vika, lgga ihop) delas nyckelvrdet frst upp i ett antal delar, vilka var och
en har samma lngd som den nskade adressen, med undantag fr ena eller bda nddelarna om
nyckellngden inte r jmnt delbar med den nskade adresslngden. Adressen erhlls genom att
adderas delarna, eventuellt spill som uppstr vid addition av de mest signifikanta siffrorna
ignoreras. Addition kan ersttas med exklusivt-eller-operationer om berkningar grs binrt.
Om en fyrsiffrig adress ska berknas ur nyckeln 4869273510, kan detta gras genom att dela upp
nyckeln i tre delar, 486, 9273 och 510, och addera dessa:
486
9273
+ 510
11269

Ettan till vnster i resultatet ignoreras, vilket ger adressen 269. Detta stt att addera delarna brukar
kallas fold-shift-metoden. En variant r att ta siffrorna i frsta och sista delen i omvnd ordning vid
additionen, vilket kallas fold-boundary-metoden:
684
9273
+ 015
9972

Folding gr det mjlighet att transformera lnga nyckelvrden till kortare adresser och dr samtliga
siffror i nyckeln kommer att ing i berkningen. Ofta anvnds folding i kombination med andra

38

metoder. Folding anvnds d frst fr att erhlla ett vrde som exempelvis ryms i ett maskinord,
och sedan appliceras ytterligare ngon hashfunktion fr att erhlla den nskade adressen.
3.5.5 Lngdberoendemetoder
I lngdberoendemetoden ingr nyckelvrdets lngd som en faktor i berkningen, tillsammans med
nyckelvrdet. Detta kan vara speciellt intressant nr nycklarnas lngd inte r fix. Lngdberoendemetoder anvnds till exempel fr nycklar som utgrs av strngar med variabel lngd.
En enkel berkning som visat goda resultat innebr att addera teckenkoderna fr det frsta och det
sista tecknet i en strng med vrdet fr strngens lngd skiftad vnster fyra binra steg (det kan
gras genom att multiplicera med 16). Strngen "PASCAL" ger med denna berkning adressen
252 (80 + 76 + 16 6).
Lngdberoendemetoder kan anvndas fr frbearbetning av nycklar, till exempel kan divisionsmetoden appliceras p det heltalsvrde som en lngdberoendemetod ger.
3.5.6 Slumpmetoden
En mjlighet att generera adresser r att anvnda en slumptalsgenerator, det vill sga en funktion
som genererar pseudoslumptal utifrn ett initialvrde, ett s kallat fr (seed). Fr ett givet fr
kommer slumptalsgeneratorn alltid att ge samma fljd av slumptal.
Om nyckelvrden efter lmplig frbearbetning fr utgra frn, levererar slumptalsfunktionen en
hemadress fr varje nyckel. Olika nycklar kan ge samma frsta slumptal, s kollisioner kan uppst.
I sdana fall anropas slumptalsfunktionen igen, men nu utan fr fr att ge en ny adress. Skulle ven
denna position i hashtabellen vara upptagen anropas slumptalsfunktionen igen, och s vidare. I och
med att slumptalsfunktionen ger samma slumptalsfljd fr ett givet fr, kommer alltid en viss post
att kunna terfinnas.
3.5.7 Radixmetoden
Radixmetoden bygger p att nyckelvrden transformerar genom att arbeta med olika radix. Antag
att nycklar bestr av strngar av oktala siffror. Radix r allts 8. Siffrorna i strngen betraktas dock
som om de hade en annan bas, sg 11. nskas en decimal adress omvandlas talet i bas 11 till bas
10. Detta kommer att rra om bland bitarna/siffrorna och sedan kan, p samma stt som i mittkvadratmetoden (se ovan), ett lmpligt antal siffror i resultatets mitt vljas som adress.
3.5.8 Perfekta hashfunktioner
Perfekta hashfunktioner kan endast erhllas under speciella omstndigheter. Ett villkor r att alla
nyckelvrden som kan upptrda r knda p frhand. I kompilatorer kan man tnka sig anvnda en
sdan hashtabell fr att avgra om en inlst strng r ett reserverat ord eller inte. Det inlsta strngen transformeras och innehllet i hashtabellen p den erhllna adressen jmfrs med den inlsta
strngen.
Ett problem r att berkningsarbetet fr att erhlla hashfunktionen kan bli s stort att det i praktiken
r omjligt att gra detta, ven om det endast behver gras en gng fr en viss tillmpning.
Berkningsarbetet vxer exponentiellt med antalet nycklar och kan bli oacceptabelt stort redan nr
antalet nyckelvrden verstiger ngra hundratal.
Ett exempel p en perfekt hashfunktion fr de reserverade orden i Modula-2 r1:
hash(w) = length + g(w[1]) + g(w[length]) + a

1. Sebesta och Taylor, Journal of Pascal, Ada & Modula-2, mars/april 1986.

39

dr w r ett ord, length r ordets lngd och a anger det alfabetiska ordningstalet (dr bokstaven A
har ordningstalet 0) fr den nst sista bokstaven i ordet. Funktionen g (som kan vara mycket
kostsam att ta fram) associerar ett heltal med varje bokstav enligt fljande:
tecken
A
B
C
D
E
F
G

g
18
16
3
-3
-11
4

tecken
H
I
J
K
L
M
N

g
14
15

15
1
-4

tecken

tecken

O
P
Q
R
S
T
U

7
1
22
-1
3
0
8

V
W
X
Y
Z

22
-2

14

Fr det reserverade ordet MODULE erhlls sledes adress 7 i tabellen enligt fljande:
hash("MODULE") = 6 + g(M) + g(E) + 11 = 7
Den fullstndiga hashtabellen fr Modula-2 r:
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]

ELSE
EXIT
END
WHILE
THEN
REPEAT
ELSIF
MODULE
TYPE
DO
SET
POINTER
EXPORT
NOT
CASE

[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
[29]

MOD
PROCEDURE
DEFINITION
RETURN
RECORD
FOR
IN
OR
FROM
VAR
BEGIN
CONST
OF
TO
IF

40

[30]
[31]
[32]
[33]
[34]
[35]
[36]
[37]
[38]
[39]

DIV
AND
QUALIFIED
BY
LOOP
WITH
UNTIL
ARRAY
IMPORT
IMPLEMENTATION

4 Prioritetsk och heap


En prioritetsk ger tkomst till data p ett ordnat men begrnsat stt. I en prioritetsk rangordnas
data och endast det minsta (alternativt strsta) vrdet r tkomligt. Fr att komma t nsta vrde i
ordning mste det minsta vrdet frst tas bort. Nr ett vrde lggs till i en prioritetsk ordnas det
in i efter rang och kan sedan inte kommas t frrn det hamnat frst i kn.
I en prioritetsk kan det finnas flera element med samma rang och d gller ingen absolut ordning
mellan sdana vrden. Det innebr att vrden med lika rang inte behver komma ut ur prioritetskn
i samma inbrdes ordning som de sattes in.
Prioritetsker kan implementeras p olika stt. Logiskt sett r en prioritetsk en rangordnad lista
och en mjlighet r att anvnda ett en fltliknande struktur. En fullstndig rangordning krvs dock
inte i en prioritetsk, utan det rcker att komma t det minsta vrdet medan vriga vrden kan vara
frhllandevis lst ordnade. En datastruktur som har denna egenskap r heap, se nedan.
De tre grundlggande operationerna p en prioritetsk r att stta in ett nytt vrde i rangordning
(insert), att visa det minsta vrdet i prioritetskn utan att det tas bort (find-min) och att ta bort det
minsta vrdet utan att returnera det (delete-min). Fr vrigt det finnas en operation fr att underska om en prioritetsk r tom (empty), kanske ven fr att ta reda p hur mnga vrden som finns
i en prioritetsk (length), samt fr att tmma en prioritetsk (clear).

4.1 Heap
En heap r en trdstruktur dr data r ordnade enligt heapordning. Ett stt att definiera en heap r:
En min-heap r ett trd vars vrden finns i stigande ordning utmed varje vg frn roten till lven.
Mellan syskon och subtrd finns dremot ingen ordning. Ett alternativt stt att definiera en heap r:
En min-heap r ett trd dr roten innehller det minsta vrdet och vars subtrd r min-heapar.
Analoga definitioner kan gras fr heapar dr vrdena r lagrade i sjunkande ordning frn rot till
lv, max-heapar. I figur 44 illustreras min-heapordning med ett symboliserat trd, dr r str fr
rang.
r

...

Figur 44. Min-heap.

I figur 45 visas tv exempel p min-heapar, till vnsater en min-heap med grad 3, till hger en minheap med grad 2.
1
2

1
4

5
6

Figur 45. Exempel p min-heapar.

41

2
3
5

En heap kallas en komplett heap om trdet som lagrar heapens vrden r ett komplett trd. En
komplett heap kan med frdel lagras i ett flt.

4.1.1 Binr heap


En binr heap r ett heapordnat, komplett binrt trd. Att trdet r komplett innebr att en binr
heap kan lagras i ett flt, se figur 46 a. Detta kallas implicit representation fr ett trd.
1

2
9

5
8

2
5

1 2 4 2 5 7 5 9 8 6 5

5
8

1 2 4 2 5 7 5 9 8 6 5

b) en tom nod har satts in sist

a) binr heap
Figur 46. Binr min-heap.

4.1.1.1 Insttning i binr min-heap


Nr ett vrde ska sttas in i en binr heap, insert, lggs frst en ny tom nod till i trdet, ett hl. Det
enda stllet en ny nod kan sttas in i en heap r nsta lediga position i fltet, annars blir trdet inte
komplett. Se figur 46 b ovan.
1

2
9
1 2

5
8

4
5

2 5 4 5 9 8 6 5 7

5
8

4
5

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

a) hlet har vandrat upp s att 3 kan sttas in

b) 3 har satts in

Figur 47. Insttning i binr min-heap.

S lnge vrdet i frldranoden r strre n vrdet som ska sttas in, flyttas vrdet i frldranoden
ner till hlet och hlet vandrar upp en niv. Detta upprepas till dess, antingen vrdet i frldranoden
till hlet r mindre n eller lika med vrdet som ska sttas in, eller att hlet har vandrat nda upp
till roten. Det nya vrdet stts in hlet. Se figur 47. Man kan se detta som om det nya vrdet direkt
sattes in i det nya lvet och att sedan vrdet vandrar uppt i heapen genom att successivt byta plats
med vrdet i frldranoden till dess heapordning erhlls, vilket skulle fungera men vara mindre
effektivt. Att lta ett hl, eller ett vrde, vandra uppt i en heap p detta stt kallas p engelska fr
percolate-up, walk-up eller sift-up.
En analys av insert ger att insttning av n vrden har tidskomplexiteten O(nlogn). Ett nytt vrde
kan direkt sttas in som ett nytt sista lv, dvs i konstant tid, O(1). Eftersom trdet r komplett, r
vglngden upp till roten garanterat logn, vilket innebr att percolate-up har tidskomplexiteten
O(logn).
I speciella fall kan ett alternativt stt att stta in i en binr heap anvndas. Om alla vrden som ska
sttas in i en heap finns tillgngliga kan vrdena frst placeras i heapen, utan tanke p heapordningen, genom att stta in dem uppifrn-och-ner, bredden-frst. Den operationen kallas toss.

42

Drefter ordnas vrdena i heapen med en operation som kallas fix-heap eller build-heap. I figur 48
nedan visas hur fljande 10 vrden stts in i en min-heap med toss och sedan ordnas med fix-heap.
3

10

Frst placeras de 10 vrdena (n=10) i heapen med toss, se figur 48 a.


3

10
6

4
1

8
9

4
10

3 8 5 10 4 2 9 6 1 7

3 8 2 1 4 5 9 6 10 7

a) heapen fylld med vrden (toss)

b) tre subtrd heapordnade

6
8

4
10

3
9

4
10

3 1 2 6 4 5 9 8 10 7

1 3 2 6 4 5 9 8 10 7

c) rotens vnstra subtrd heapordnat

d) hela heapen ordnad

Figur 48. Generering av min-heap med toss och fix-heap.

Med brjan i sista icke-lvet vandrar man sedan nod fr nod, nivvis frn hger till vnster, upp
till roten. Eftersom heapen r lagrad i ett flt r detta enkelt:
Sista icke-lvet hittas i fltet i position n/2, d.v.s. i detta fall position 5 (dr vrdet 4 finns).
Att vandra nod fr nod till roten innebr att successivt stega ner positionen till 1.
Fr varje nod p vgen till roten heapordnas det subtrd som noden r rotnod i och till slut heapordnas hela heapen. Fr att heapordna ett subtrd grs percolate-down (walk-down, sift-down) p
subtrdets rotvrde till dess heapordning erhlls.
Arbetet med att ordna heapen i figur 48 a inleds i noden med vrdet 4. I detta fall finns bara ett barn
och dess vrde (7) r strre n 4, s detta subtrd r redan en min-heap.
Nsta subtrd att behandla r det som har 10 i roten. Hr finns tv barn och bde r mindre n 10
(6 och 1). Vrdet i det hgra subtrdet (1) r minst och fr byta plats med 10 (percolate-down utfrs
p 10). Den nod som 10 flyttas ner i har inga barn och drmed r detta subtrd ordnat.
Drefter str subtrdet med 5 i roten p tur. Det finns tv barn men det r bara vrdet i det vnstra
subtrdet (2) som r mindre n 5 och kan byta plats med 5.Nu ser heapen ut som i figur 48b.
Det subtrd som ska heapordnas hrnst r det som har sin rot i noden med vrdet 8, se figur 48b.
Det finns tv barn och i detta fall r det subtrd som redan heapordnats i tidigare steg. Bda subtrden har ett vrde i sin rot som r mindre n 8 (1 resp. 4). Vrdet i det vnstra subtrdet (1) r
minst och det fr byta plats med 8. Den nod som 8 hamnar i efter bytet r i detta fall inget lv, och
proceduren upprepas fr detta subtrd. Det finns tv barn med vrdena 6 resp. 10, 6 r minst och
mindre n 8, s 6 och 8 byter plats. Nu hamnar 8 i ett lv och subtrdet r heapordnat, se figur 48c.
Vi har nu kommit till heapens rot (3). Den har tv barn och bda har vrden i sin rot som r mindre
n 3 (1 och 2) men vrdet i det vnstra subtrdet (1) r minst och fr byta plats med 3. Efter detta

43

byte ser heapen ut som i figur 48d. Vrdena i de bda subtrden till den nod som 3 hamnade i r i
detta fall strre n 3 (6 resp. 4) och inget byte ska gras. Hela heapen r nu ordnad.
ven i detta fall fr ett hl vandra ner d percolate-down utfrs, i stllet fr att successivt byta plats
p tv vrden. Det vrde som finns i roten av det subtrd som behandlas tas frst ut ur trdet och
det hl som d uppstr i noden fr vandrar ner i subtrdet till dess vrdet kan sttas in i heapordning.
Frdelen med att utfra toss och fix-heap i stllet fr insert r att heapen kan genereras p ett
effektivare stt. En analys visar att toss och fix-heap kan gras i linjr tid, dvs O(n). Toss innebr
att stega igenom fltet frn brjan och placera in de n vrdena, vilket uppenbart r O(n). Vrdena
ska sedan heapordnas enligt beskrivningen ovan, vilket inte lika uppenbart r O(n).
4.1.1.2 Borttagning ur binr min-heap
Borttagning ur en binr min-heap innebr att vrdet i roten ska tas bort, delete-min. Ett hl uppstr
d i roten och om det finns barn ska det med lgst rang eller ngot av barnen om de har lika rang,
flyttas upp till roten. Detta upprepas fr det subtrd dit hlet flyttas. Samtidigt mste man tnka p
att heapens storlek ska minskas med ett och att den nod som ska tas bort r det sista lvet, annars
kommer inte heapen vara komplett efter borttagningen.
Efter att vrdet i roten tagits bort flyttar man drfr upp vrdet i sista lvet (x) till hlet i roten och
sedan upprepas fljande.
Om det finns tv barn byter x och barnet med lgst rang plats, om detta har lgre rang n x. Har
bda barnen samma rang och lgre rang n x byter ngot av barnen plats med x.
Om det bara finns ett barn och det har lgre rang r n x, byter x och barnet plats.
Om noden med x inte har ngra barn, har x hamnat i ett lv.
I praktikenkan man vnta med att flytta vrdet i sista lvet till dess man hittat rtt plats fr det i
vriga heapen. I stllet fr hlet i roten vandra nedt i heapen till dess vrdet i sista lvet kan flyttas
till hlet med bibehllen heapordning och frst drefter tas noden som utgr sista lvet bort. I
figur 49 visas delete-min med utgngspunkt frn den heap som visas i figur 47 b.
2
2

2
9

5
8

2
5

2 3 2 5 4 5 9 8 6 5 7

2 2 3

a) vrdet i roten r borttaget, ett hl har uppsttt

5 4 5 9 8 6 5 7

b) hlet har vandrat ner s 7 kan sttas in


2

5
8

2
5

2 2 3 7 5 4 5 9 8 6 5

5
8

4
5

2 2 3 7 5 4 5 9 8 6 5

c) vrdet i sista lvet har flyttats till hlet

d) sista lvet borttaget

Figur 49. Borttagning ur binr min-heap (delete-min).

44

5 Sortering
Sortering r vanligt i samband med lagring, bearbetning och presentation av data. Det finns mnga
olika sorteringsmetoder och de kan kategoriseras p olika stt.
Interna metoder sorterar i arbetsminnet och det r vanligtvis frga om att sortera data som r
lagrade i flt. Varje elementen i ett flt kan direkt kommas t via ett index och det ger stora mjligheter att konstruera sorteringsmetoder p olika stt. Externa metoder sorterar data som r lagrade
p sekundrminnesfiler. Filerna lses sekventiellt och mjligheterna att variera konstruktionen av
externa sorteringsmetoder r begrnsad och det r i princip s kallad samsorteringsteknik som
externa metoder bygger p.
I jmfrande metoder jmfrs tv eller flera element i taget. Antingen flyttas ett eller flera element
till en annan sekvens dr de placeras i ordning eller s fr elementen byta plats s att de komma i
inbrdes ordning. I distributiva metoder undersks varje enskilt element fr sig. och placeras med
utgngspunkt frn ngot kriterium i en av flera mjliga utdatasekvenser. Distributiva metoder har
begrnsningar men kan vara mycket snabba.
Sorteringsmetoder bygger vanligtvis p ngon av de grundlggande teknikerna urval (selection),
insttning (insertion), utbyte (exchange), samsortering (merge) och distribution.
En stabil sorteringsmetod bibehller inbrdes ordning p lika element, element med lika
sorteringsnycklar, vilket kan vara viktigt d det r frga om att sortera annat n enkla element och
att sortera i olika avseenden vid olika tillfllen.
En naturlig metod lgger ner ett arbete som str i proportion till initialordningen hos indata, ju mer
ordnade indata desto mindre arbete.
En enkel metod bygger p ngon enkel, rttfram metod fr att ordna data. Sdana metoder r enkla
att implementera men ofta inte s effektiva. Avancerade metoder innebr att man anvnder mer
komplicerade algoritmer, som r svrare att implementera men normalt betydligt effektivare,
speciellt fr strre datamngder.
I vissa metoder byter element plats med varandra, vilket motsvarar tre frflyttningar. I vissa
metoder flyttas element frn en sekvens till en annan. Nr man analyserar metoder berknar man
typiskt antal byten/jmfrelser och antal frflyttningar som behvs fr att ordna data.
Avancerade metoder har typiskt tidskomplexiteten O(nlogn), vilket ocks r en undre grns fr
jmfrande metoder, medan enkla metoder typiskt har tidskomplexiteten O(n2). Distributiva
metoder kan i speciell fall ha tidskomplexiteten O(n). Fr sm datamngder kan enkla metoder
vara mer effektiva n avancerade p grund av att de senare har en hgre kostnad per delmoment,
per pass. Avancerade metoder lnar sig vanligtvis genom att frre pass behver utfras, till exempel ett, sett till datamngdens storlek, logaritmiskt i stllet fr linjrt antal gnger.
Nr man analyserar sorteringsmetoder brukar man studera tre fall avseende ordningen hos indata,
ordnade, omvnt ordande och slumpmssigt ordnade. Dessa representerar vanligtvis ocks bsta
fallet, vrsta fallet och allmna fallet fr metoderna. Vilket som gller fr en specifik metod kan
variera, till exempel kan ordnade indata vara vrsta fallet fr en viss metod.
En inversion r ett tv godtyckliga element som r inbrdes oordnade. Antalet inversioner r ett
mtt p graden av oordning i indata. Sekvensen [5, 3, 6, 1, 4, 2] har 10 inversioner, (5, 3), (5, 1),
(5, 4), (5, 2), (3, 1), (3, 2), (6, 1), (6, 4), (6, 2) och (4, 2).
I mnga enkla interna metoder delas datamngden upp i tv delar. I den ena finns de nnu oordnade
elementen, kllsekvens. I den andra delen finns element som antingen r slutgiltigt sorterade eller
sorterade inbrdes men nnu inte slutgiltigt, destinationssekvens.

45

Mnga interna metoder behver inte mer minne n antalet element som ska sorteras, plus en hjlpvariabel fr att kunna byta plats p element. Det finns dock metoder som krver dubbelt eller tre
gnger s mycket minne som det finns element.
Nr man ska vlja metod fr man ta hnsyn till exempelvis antalet element som ska sorteras, om
det kan frvntas en viss ordning i indata, om sorteringen mste vara stabil, etc.

5.1 Interna sorteringsmetoder


De metoder som vanligtvis anvnds fr att sortera data internt r jmfrande metoder. Det finns ett
stort antal sdana metoder som bygger p olika tekniker dr det kan finnas bde enkla och
avancerade variationer p en viss teknik. ven distributiva metoder kan dock komma ifrga. De
element som ska sorteras lagras vanligtvis i flt.
5.1.1 Bubblesort
Bubblesort r en enkel utbytesmetod. Den bygger p att n-1 pass utfrs p de n elementen i ett flt.
Element p direkt intilliggande positioner jmfrs parvis och fr byta plats om de inte ligger i
ordning. Under det frsta passet kommer det minsta elementet att flyttas, bubbla, till sin slutgiltiga plats och behver sedan inte behandlas mer. I det andra passet kommer det nst minsta
elementet att hamna p sin plats. Efter n-1 pass r de n elementen i fltet sorterade.
I figur 50 visas tv exempel p hur bubblesort arbetar. Den frsta raden visar elementens
initialordning och vilka byten som sker i frsta passet. Den andra raden visar ordningen efter frsta
passet och vilka byten som grs i det andra passet, osv. I det vnstra exemplet krvs samtliga n-1
pass innan alla element kommit p plats. Det strsta elementet, 11, flyttas bara en position i taget
mot sin slutgiltiga plats. I det hgra exemplet r samtliga element r p plats redan efter fem pass
och terstende fem pass genomfrs utan att ngra byten sker, enbart jmfrelser.
11 4 8 2 10 7 1 3 6 9 5

3 4 8 2 10 7 1 11 6 9 5

1 11 4 8 2 10 7 3 5 6 9

1 3 4 8 2 10 7 5 11 6 9

1 2 11 4 8 3 10 7 5 6 9

1 2 3 4 8 5 10 7 6 11 9

1 2 3 11 4 8 5 10 7 6 9

1 2 3 4 5 8 6 10 7 9 11

1 2 3 4 11 5 8 6 10 7 9

1 2 3 4 5 6 8 7 10 9 11

1 2 3 4 5 11 6 8 7 10 9

1 2 3 4 5 6 7 8 9 10 11

1 2 3 4 5 6 11 7 8 9 10

De sista fem passen sker utan byten.

1 2 3 4 5 6 7 11 8 9 10
1 2 3 4 5 6 7 8 11 9 10
1 2 3 4 5 6 7 8 9 11 10
1 2 3 4 5 6 7 8 9 10 11
Figur 50. Tv exempel p hur Bubblesort arbetar.

46

En analys av Bubblesort ger att samtliga n-1 pass alltid genomfrs. I det i:te passet utfrs n-i
jmfrelser, i bsta fall inga byten, i vrsta fall n-i byten. Detta ger en tidskomplexitet som r
O(n2), Bubblesort r en kvadratisk metod. Ett vrsta fall r om data ligger i helt omvnd ordning,
vilket innebr att det i varje pass kommer att utfras maximalt antalet byten.
Man skulle kunna upptcka om ett pass har genomfrts utan byten och avbryta. Det skulle reducera
antalet pass och drmed antalet jmfrelser men dremot inte antalet byten. Man skulle ocks
kunna notera var sista bytet i ett pass gjordes och flytta grnsen fr den frdigsorterade delen med
dit direkt. Det skulle reducera antalet jmfrelser i ett pass men inte pverka antalet byten.
5.1.2 Shakersort
Som framgr av exemplet i figur 50 finns en asymmetri i Bubblesort. Ett litet element bubblar
direkt till sin slutgiltiga plats, medan ett stort element bara flyttas ett steg per pass. Genom att kra
varannat pass i motsatt riktning skulle man kunna tgrda den asymmetrin. Denna variant kallas
Shakersort. I Shakersort brukar man ocks noterar var det sista bytet i ett pass grs och flytta
grnsen mellan frdigsorterade och osorterade element dit direkt.
11 4 8 2 10 7 1 3 6 9 5
1 11 4 8 2 10 7 3 5 6 9
1 4 8 2 10 7 3 5 6 9 11
1 2 4 8 3 10 7 5 6 9 11
1 2 4 3 8 7 5 6 9 10 11
1 2 3 4 5 7 6 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11
Figur 51. Shakersort.

5.1.3 Selectionsort
Selectionsort r en enkel urvalsmetod och representerar det kanske mest intuitiva sttet att sortera.
I selectionsort utfrs n-1 pass om antal element som ska sorteras r n. I det frsta passet genomsks
hela fltet och positionen fr det minsta elementet sparas. Det minsta elementet fr sedan byta plats
med det element som lg frst. Destinationssekvensen utgrs nu av detta minsta element. I det
andra passet sks det nst minsta elementet i terstoden av fltet och placeras nst frst i fltet
genom att det fr byta plats med det element som lg dr, osv. I figur 52 visas hur detta successivt
gr till fr de n-1 passen.
En tilltalande egenskap hos selectionsort r att det i varje pass bara grs ett byte, dvs antalet byten
totalt r O(n). Antalet jmfrelser i det i:te passet r dremot alltid maximala n-i. Med avseende p
jmfrelser r selectionsort en O(n2)-metod och klassificeras drmed som en kvadratisk metod.

47

11 4 8 2 10 7 1 3 6 9 5
1 4 8 2 10 7 11 3 6 9 5
1 2 8 4 10 7 11 3 6 9 5
1 2 3 4 10 7 11 8 6 9 5
1 2 3 4 10 7 11 8 6 9 5
1 2 3 4 5 7 11 8 6 9 10
1 2 3 4 5 6 11 8 7 9 10
1 2 3 4 5 6 7 8 11 9 10
1 2 3 4 5 6 7 8 11 9 10
1 2 3 4 5 6 7 8 9 11 10
1 2 3 4 5 6 7 8 9 10 11
Figur 52. Selectionsort.

5.1.4 Insertionsort
Insertionsort r en enkel insttningsmetod. Nr sorteringen brjar utgr det frsta elementet
destinationssekvens och vriga kllsekvens. Sedan utfrs n-1 pass, dr i varje pass det frsta
elementet i kllsekvensen ordnas in bland elementen i destinationssekvensen. Destinationssekvensen r allts i detta fall inte slutgiltigt ordnad, som i bubblesort och selectionsort.
11 4 8 2 10 7 1 3 6 9 5
4 11 8 2 10 7 1 3 6 9 5
4 8 11 2 10 7 1 3 6 9 5
2 4 8 11 10 7 1 3 6 9 5
2 4 8 10 11 7 1 3 6 9 5
2 4 7 8 10 11 1 3 6 9 5
1 2 4 7 8 10 11 3 6 9 5
1 2 3 4 7 8 10 11 6 9 5
1 2 3 4 6 7 8 10 11 9 5
1 2 3 4 6 7 8 9 10 11 5
1 2 3 4 5 6 7 8 9 10 11
Figur 53. Insertionsort.

En variation p insertionsort r linjr insttning. Man flyttar frst elementet som ska ordnas in till
en hjlpvariabel. Sedan gr man en linjrskning i destinationssekvensen frn hger och varje
element som r strre n det som ska sttas in flyttas en position t hger. Man flyttar allts ett
hl till den position dr elementet som ska ordnas in ska finnas hlet.
I det i:te passet i linjr insttning grs mellan 1 och i stycken jmfrelser. Att flytta elementet som
ska sttas in till hjlpvariabeln och sedan till hlet innebr tv frflyttningar. Om elementet
ifrga r strre n eller lika med det sista i destinationssekvensen, dvs det ska inte flyttas, grs inga
fler frflyttningar. I annat fall grs mellan 1 och i frflyttningar av hlet in i destinations-

48

sekvensen. Den frvntade skvgen r halva destinationssekvensen, dvs det frvntade antalet
jmfrelser och frflyttningar i det i:te passet vid linjr insttning r O(n). Antalet pass r O(n) och
linjr insttning fljaktligen en O(n2)-metod.
Eftersom destinationssekvensen r ordnad kan man anvnda binrskning fr att hitta den plats dr
nsta element ska placeras in. Denna variant av insertionsort kallas binr insttning. Detta innebr
att skningen i destinationssekvensen frbttras till O(2logn), i stllet fr O(n). Antalet frflyttningar pverkas inte, s ven binr insttning r en O(n2)-metod. Man kan notera att fr ordnade
eller nstan ordnade indata r linjr insttning ett bttre val bttre n binr insttning.
5.1.5 Shellsort
Shellsort har ftt sitt namn efter sin upphovsman, Donald Shell. Det r en avancerad insttningsmetod som bygger p idn att det borde vara effektivare att flytta element ver lnge avstnd n
ett fr att elementen snabbare ska komma till sin slutliga position.
Shellsort har subkvadratisk tidskomplexitet. Den finns i ett antal varianter som r mer eller mindre
svra eller rent av omjliga att analysera formellt. Empiriskt beter sig vanligtvis Shellsort som om
den har en tidskomplexitet som r O(n2logn) eller O(n3/2).
Implementeringen av Shellsort omfattar bara ett par rader kod mer n insertionsort. Shellsort r
dessutom iterativ, till skillnad frn mnga andra avancerade metoder, vilka r rekursiva.
I Shellsort kommer ett antal pass att genomfras. I varje sdant pass delas elementen upp i delsekvenser vars element finns p ett visst inbrdes avstnd, gap. I frsta passet anvnds ett stort gap
och fr varje efterfljande pass minskas gapet successivt fr att i sista passet alltid vara 1. Valet av
gap r vsentligt och det r detta val som skiljer de olika varianterna av Shellsort t. Ett annat namn
p Shellsort p engelska r diminishing gap sort.
I varje pass utfrs insttningssortering p varje delsekvens. Principen r densamma som fr enkel
insttningssortering (gap 1). Elementen i kllsekvensen ordnas i tur och ordning in i destinationssekvensen men det sker allts p ett avstnd som r lika med gapet fr passet i frga.
I den ursprungliga varianten av Shellsort vljs det frsta gapet som n/2. Sedan minskas gapet
successivt i de efterfljande passen, genom att gapet fr fregende pass halveras. Detta brukar
kallas Shells gapsekvens.
I figur 54 har vi 11 element som ska sorteras. Med Shells variant blir frsta gapet 5, det efterfljande 2 och sist 1. Det innebr att det blir tre pass men i figuren visas endast de tv frsta, det
sista passet r en vanlig Insertionsort.
Figur 54a visar de fem delsekvenser som uppstr fr gapet 5. Figur 54b visar hur den frsta
delsekvensen av dessa successivt sorteras med insertionsort. Tre element ger tv pass, dr frst 7
ordnas med 11 och sedan 5 med 7 och 11. De vriga fyra delsekvenserna omfattar endast tv
element vardera och det medfr endast ett pass i insttningen, vilket visas i figur 54c. Resultatet
efter att de fem delsekvenserna fr gapet 5 sorterats inbrdes visas i figur 54d.
I figur 54e visas de tv delsekvenser som uppstr fr gapet 2. Den frsta innehller 6 element och
det ger de fem insttningspass som visas i figur 54f. Den andra delsekvensen innehller fem
element och fr dessa genomfrs de fyra insttningspass som visas i figur 54g (elementen rkade
ligga i ordning, s inget frndrades). Resultatet efter andra huvudpasset fr gapet 2 visas i
figur 54h. Efter detta genomfrs ett tredje och sista huvudpass med gapet 1, men det r ju en vanlig
Insertionsort s det visar vi ej hr.

49

11 4 8 2 10 7 1 3 6 9 5

5 1 3 2 9 7 4 8 6 10 11

11 4 8 2 10 7 1 3 6 9 5

5 1 3 2 9 7 4 8 6 10 11

11 4 8 2 10 7 1 3 6 9 5

e) uppdelning med gap 2.

11 4 8 2 10 7 1 3 6 9 5

3 1 5 2 9 7 4 8 6 10 11

11 4 8 2 10 7 1 3 6 9 5

3 1 5 2 9 7 4 8 6 10 11

a) uppdelning med gap 5.

3 1 4 2 5 7 9 8 6 10 11

7 4 8 2 10 11 1 3 6 9 5

3 1 4 2 5 7 6 8 9 10 11

5 4 8 2 10 7 1 3 6 9 11

3 1 4 2 5 7 6 8 9 10 11

b) sortering av frsta delsekvensen.

f) sortering av frsta delsekvensen.

5 1 8 2 10 7 4 3 6 9 11

3 1 4 2 5 7 6 8 9 10 11

5 1 3 2 10 7 4 8 6 9 11

3 1 4 2 5 7 6 8 9 10 11

5 1 3 2 10 7 4 8 6 9 11

3 1 4 2 5 7 6 8 9 10 11

5 1 3 2 9 7 4 8 6 10 11

3 1 4 2 5 7 6 8 9 10 11

c) sortering av vriga delsekvenser.

g) sortering av andra delsekvensen.

5 1 3 2 9 7 4 8 6 10 11

3 1 4 2 5 7 6 8 9 10 11

d) resultat efter frsta passet.

h) resultat efter andra passet.

Figur 54. Shellsort med gapen n {1, 2, 5}. Sista passet med gap 1 visas ej (vanlig insertionsort).

Fr att Shellsort ska fungera vl r det vsentligt att gapsekvensen gr att elementen frn olika
delsekvenser i ett pass blandas s mycket som mjligt i delsekvenserna i efterfljande pass, fr att
minimera jmfrelse av element som redan har jmfrts.
Man kan visa att i vrsta fall kan Shellsort vara O(n2). Detta intrffar fr Shells gap om antalet
element som ska sorteras r en jmn multipel av tv, alla stora element finns p jmna index och
alla sm element finns p udda index. I det allmna fallet kan man visa att om antalet element r
en multipel av 2 r tidskomplexiteten O(n3/2), vilket r en avsevrd frbttring jmfrt med
Insertionsort.
En mindre modifiering av gapsekvensen kan frhindra det kvadratiska beteendet. Om gapet efter
division med 2 blir ett jmnt vrde, adderas 1 fr att gra det udda. Man kan d visa att tidskomplexiteten i vrsta fallet r O(n3/2). Det allmna fallet r oknt men vid experiment tycks det
vara O(n5/4).
En annan modifiering r att dividera fregende gap med 2,2 i stllet fr 2. Det finns ingen
teoretisk grund fr detta men det fungerar vl i praktiken. Tidskomplexiteten frefaller hamna
under O(n5/4), eventuellt O(n7/6). I detta fall mste man se upp med r att gapet 1 inte missas. Detta
kallas fr Gonnets increment, efter upphovsmannen.
Andra vlknda gapsekvenser fr Shellsort r Hibbards {1, 3, 7, 2k-1}, Knuths {1, 4, 13,,
(3k-1)/2} och Sedgewicks {1, 5, 19, 41, 109,}, dr varje term r p formen 94k-92k+1 eller
4k-32k+1.

50

5.1.6 Heapsort
Heapsort r en avancerad intern metod som utnyttjar en prioritetsk. Genom att placera elementen
som ska ordnas i en binr min-heap och sedan utfra delete-min n gnger erhlls elementen i
stigande ordning. Detta skulle krva dubbelt s mycket minne som antalet element om heapen r
en separat struktur men det kan undvikas.
Genom att heapstorleken minskar varje gng ett element tas ut och det fristllda utrymmet alltid r
sist i heapen kan man sortera p plats. I detta fall anvnds en max-heap. Elementet som ska tas ut
fr byta plats med elementet i sista lvet, heapstorleken minskas med ett och heapordningen terstlls. Detta upprepas till dess heapen har minskats i storlek till ett. I figur 55 visas delar av detta
frlopp.
11

11

2
3

10
6

10
1

9
2

11 4 8 2 10 7 1 3 6 9 5

11 10 8 6 9 7 1 3 2 4 5

10

6
3

5
2

6
1

11

8
5

10 11

10 9 8 6 5 7 1 3 2 4 11

9 6 8 4 5 7 1 3 2 10 11

d
8

6
4
3

7
5

2
1

10 11

3
5

10 11

8 6 7 4 5 2 1 3 9 10 11

1 2 3 4 5 6 7 8 9 10 11

f
Figur 55. Heapsort.

Figur 55a visar de osorterade elementen efter att de placerats i heapen, dels hur vi ser p heapen
logiskt, som ett trd, dels hur elementen lagras fysiskt, i ett flt. I figur 55b visas lget efter att
heapen ordnats som en max-heap. Figur 55c-e visar tre successiva pass, dr i respektive pass
rotelementet och elementet i sista lvet byter plats (11 och 5 i figur 55b), heapens storlek minskas
med ett (noden/elementet skuggas) och till slut hur heapordningen terstlls (i figur 55c har
elementet 5 flyttats ner till position 5, varvid elementet 10 och 9 flyttas upp). Figur 55f visar lget
efter ytterligare sex pass, d heapstorleken har reducerats till ett och sorteringen drmed r klar.

51

5.1.7 Mergesort
Mergesort r en intern sorteringsmetod som bygger p samsortering, en teknik som normalt
anvnds fr extern sortering. Mergesort tillhr en kategori av metoder som betecknas som
sndra-och-hrska-metoder, fr vilka man kan visa att de har en tidskomplexitet som r O(nlogn).
tminstone teoretiskt tillhr drmed Mergesort de snabbare metoderna.
I figur 56 visas principen fr samsortering av tv redan sorterade sekvenser, med fyra element
vardera. I kllsekvenserna markerar pilarna positionen fr det frsta av de terstende elementen i
respektive sekvens. I utdatasekvensen markerar pilen den position dr nsta element ska placeras.
2 4 7 8

1 3 5 6

2 4 7 8

1 3 5 6

2 4 7 8

1 3 5 6

1 2

2 4 7 8

1 3 5 6

1 2 3

2 4 7 8

1 3 5 6

1 2 3 4

2 4 7 8

1 3 5 6

1 2 3 4 5

2 4 7 8

1 3 5 6

1 2 3 4 5 6

2 4 7 8

1 3 5 6

1 2 3 4 5 6 7 8

Figur 56. Samsortering av tv sorterade flt.

Den frsta raden i figur 56 visar utgngslget. De frsta elementen i de tv kllsekvenserna ska
jmfras och det minsta flyttas till destinationssekvensen. Den andra raden visar lget efter att det
frsta elementet, 1, har flyttats till utdatafltet.
Sedan visas, ner till nst sista raden, hur ett element i taget flyttas frn ngon av kllsekvenserna
till destinationssekvensen. Den nst sista raden visar lget efter att elementet 6 har flyttats till
destinationssekvensen och den hgra kllsekvensen drmed har tmts. De tv terstende elementen i den vnstra kllsekvensen, 7 och 8, kan nu flyttas till destinationssekvensen utan att ngra
jmfrelser grs.
I figur 57 visas principen fr Mergesort. Datamngden halveras rekursivt till dess endast ett
element terstr i varje delsekvens. Drefter samsorteras delsekvenserna parvis, enligt den princip
som visats i figur 56 ovan, till dess destinationssekvensen utgrs av alla element.
Djupet i delningsfrfarandet bestms av hur mnga gnger som n kan delas med 2 och fortfarande
vara strre n eller lika med 1, dvs 2logn. P varje delningsniv mste varje element samsorteras i
sitt delflt, vilket innebr O(n) jmfrelser och O(n) frflyttningar. Mergesort r allts en
O(nlogn)-metod.
En nackdel med Mergesort r att sorteringen inte kan utfras p plats, utan det krvs dubbelt s
mycket minne som det finns element som ska sorteras. Detta minne kan skapas d sorteringen
inleds och terlmnas d sorteringen r klar, se figur 58 nedan. En frdel med Mergesort r att den
r enkelt och naturligt kan gras stabil. Det r vanligt att Mergesort anvnds i programbibliotek
som bibliotekens stabila sorteringsalgoritm, under exempelvis namn som stable_sort.

52

11 4 8 2 10 7 1 3 6 9 5
Sndra

11 4 8 2 10
11 4

7 1 3 6 9 5

8 2 10

11

2 10
2

Hrska

8
4 11

7 1 3
7

1 3

10

2 10

2 8 10

6 9 5
6
3

1 3

9
6

1 3 7

2 4 8 10 11

9 5
5
5 9
5 6 9

1 3 5 6 7 9

1 2 3 4 5 6 7 8 9 10 11
Figur 57. Principen fr Mergesort.

I figur 58 visas ngra steg d de tv sista delsekvenserna i figur 57 ovan samsorteras. temp r ett
hjlpflt, r r index till nsta lediga position i destinationssekvensen, h r index fr nsta element
i den hgra kllsekvensen, t r index fr nsta element i temp, den vnstra kllsekvensen.
a)

r:

temp:

b)

i:

temp:

c)

i:

9
temp:

d)

1 3 5 6 7 9

r: 11

2 4 8 10 11
1 2 3 4

5 6 7 9

8 10 11
1 2 3 4 5 6 7 8 9

h:

t:

h:

t:

h: 11
t:

10 11
1 2 3 4 5 6 7 8 9 10 11

temp:

h: 11
t:

Figur 58. Fyra steg i samsortering av tv sorterade delsekvenser.

I figur 51a visas situationen efter att den vnstra kllsekvensens element har flyttats till temp. Figur
51b visar lget efter att fyra element har samsorterats. I figur 51c har nio element samsorterats och
den hgra kllsekvensens element har tagit slut. Figur 51d visar slutresultatet, efter att de terstende elementen i temp flyttats till destinationssekvensen.

53

5.1.8 Quicksort
Quicksort r en avancerad utbytesmetod. Den bygger p idn att, eftersom sortering gr ut p att
flytta varje element till sin slutliga position, vore ett steg i rtt riktning att flytta ett element, x, till
sin slutliga position. Ett stt att hitta slutpositionen fr x vore att flytta om elementen, s att alla
element som r mindre n x ska hittas till vnster om x och alla elementet som r strre n x ska
hittas till hger om x. Nr det r gjort kan frfarandet upprepas rekursivt p elementen till vnster
respektive till hger om x, till dess endast ett eller inget element kvarstr i varje del. Det element
som bestmmer uppdelningen, x, kallas i fortsttningen fr pivot och de delar som uppstr fr
partitioner.
Quicksort r en sndra-och-hrska-metod. Den delar successivt delar upp elementen i partitioner
som sedan behandlas var fr sig. Till skillnad frn Mergesort utfrs frflyttningarna i samband
med uppdelningen, s nr uppdelningen r klar r ocks sorteringen klar. En annan skillnad jmfrt
med Mergesort r att delning inte grs exakt i mitten, utan det beror p pivot. I vrsta fall kan
delningsdjupet blir linjrt och inte som nskat logaritmiskt. Detta intrffar om pivot i varje delning
skulle rka vljas som det mista eller strsta elementet. Tidskomplexiteten fr Quicksort blir i s
fall O(n2). I allmnhet r dock Quicksort en O(n2logn)-metod och en mycket snabb sdan.
Quicksort kan varieras p flera stt. Gemensamt r att tv index anvnds fr att stega igenom och
dela upp elementen i en partition. Ett index stegas frn vnster till hger och ett stegas frn hger
till vnster. Nr indexen mts r uppdelningen klar, positionen fr pivot bestmd och drmed ocks
uppdelningen infr nsta steg.
Valet av pivot r vsentligt. Ett mjlighet r att vlja det frsta elementet i den aktuella partitionen.
Om data redan r ordnade eller har en frhllandevis hg grad av ordning kan dock detta val
innebra att uppdelningen urartar eller blir ptagligt skev. Ett bttre val skulle vara att vlja mittelementet, fr att eliminera risken att drabbas av ett degenererat beteende. Fr varje deterministisk
delningsteknik finns dock alltid ett degenererat fall. Det optimala valet av pivot vore medianen
men d mste elementen frst sorteras. En mer rimlig lsning r att vlja det frsta, det mittersta
och det sista elementet i partitionen, berkna medianen av dessa tre och anvnda som pivot. Hur
man n gr ska pivot vara ett element som ingr i partitionen.
I figur figur 59 visas ett exempel p sortering med en enkel variant av Quicksort. Pivot vljs i detta
fall som det frsta elementet i den aktuella partitionen och fr vara kvar bland vriga element d
uppdelningen grs. Delfigur, a-d, i figur 59 visar de fyra frsta passen, vilket leder fram till att
rekursionen bottnar fr frsta gngen, i den vnstraste partitionen. Algoritmen fr partitioneringen
r fljande.
1. det frsta elementet i partitionen vljs som pivot
2. v stts till det frsta elementet i partitionen och h till det sista elementet
3. s lnge v r mindre n h och pivot r mindre n elementet i h, ska h stegas ner.
4. om v r mindre n h ska elementen i h och v byta plats, v ska stegas upp med 1, fortstt sedan
med punkt 5, annars r uppdelningen klar och pivot p plats (i v)
5. s lnge v r mindre n h och elementet i v r mindre n pivot ska v stegas upp.
6. om v r mindre n h ska elementen i h och v byta plats, h ska stegas ner med 1, fortstt sedan
med punkt 1, annars r uppdelningen klar och pivot p plats (i h)
Ovanstende upprepas s lnge det finns fler partitioner att behandla med fler n ett element.

54

11 4 8 2 10 7 1 3 6 9 5
v
h

3 4 1 2 5 7 10 8 6 9 11
h
v

5 4 8 2 10 7 1 3 6 9 11
v
h

2 4 1 3 5 7 10 8 6 9 11
h
v

5 4 8 2 10 7 1 3 6 9 11
v
h
a) frsta passet

2 3 1 4 5 7 10 8 6 9 11
h
v

2 1 3 4 5 7 10 8 6 9 11
h
v
c) tredje passet

5 4 8 2 10 7 1 3 6 9 11
h
3 4 8 2 10 7 1 5 6 9 11
v
h

2 1 3 4 5 7 10 8 6 9 11
v
h

3 4 5 2 10 7 1 8 6 9 11
v
h

1 2 3 4 5 7 10 8 6 9 11
v
h
d) fjrde passet

3 4 1 2 10 7 5 8 6 9 11
v
h
3 4 1 2 5 7 10 8 6 9 11
v
h
b) andra passet
Figur 59. Quicksort.

I figur 59a visas det frsta passet i tre delfigurer. Efter det frsta passet har allts alla element utom
pivot hamnar i den vnstra partitionen, den hgra blev tom och vi fick ett degenererat fall. I
figur 59b visas hur den vnstra partitionen frn figur 59a delas upp. Elementet 5 blir pivot i detta
fall och efter fyra erhlls en vnsterpartition med fyra element, {3, 4, 1, 2}, och en hgerpartition
med 5 element, {7, 10, 8, 6, 9}. I figur 59c behandlas vnsterpartitionen frn figur 59 b, vilket ger
en vnsterpartition med 2 element, {2, 1}, och en hgerpartition med endast ett element, {4}. I
figur 59d visas behandlingen av den vnstra partitionen frn figur 59c. Vnsterpartition innehller
bara ett element, vilket kommer att avbryta rekursionen fr denna del i nsta steg. nnu obehandlade partitioner till vnster i den andra uppdelningen (5 som pivot) r antingen tomma eller innehller endast ett element. Drmed r denna del klar och elementen ordnade, {1, 2, 3, 4}. Samma
procedur ska nu utfras p den hgra partitionen i den andra delningen, dvs fr {7, 10, 8, 6, 9}.
I en del partitioneringstekniker flyttas pivot ut ur partitionen (gms), sedan delas vriga element
upp och slutligen flyttas pivot in till sin rtta plats. Pivot flyttas exempelvis lngst ut till hger i den
aktuella partitionen genom att byta plats med det elementet. Delfigur a-c i figur 60 visar de tre
frsta passen i en sdan Quicksort. Algoritmen fr partitioneringen r fljande:
1. vlj mittelementet som pivot
2. byt plats med det hgraste elementet, v stts till det frsta elementet i partitionen och h till det
nst sista
3. s lnge v r mindre n h och elementet i v r mindre n pivot stegas v upp
4. s lnge v r mindre n h och elementet i h r strre n pivot stegas h ner
5. om v < h ska elementen i v och h byta plats och proceduren upprepas frn punkt 3, annars r
6. partitioneringen klar, pivot och elementet i v ska byta plats
Ovanstende upprepas s lnge det finns fler partitioner att behandla med fler n ett element.

55

I figur 60a visas i frsta delfiguren att mittelementet, 7, vljs som pivot. I nsta delfigur har pivot
bytt plats med elementet lngst till hger och indexen v och h har givits sina startpositioner. Tredje
delfiguren visar vilka positioner v och h anger efter att bde v och h har stegats frsta gngen, 11
ska byta plats med 6. I fjrde delfiguren har 11 och 6 bytt plats och v och h har stegats till nsta par
som ska byta plats, 8 och 3. Femte delfiguren visar lget efter att 8 och 3 har bytt plats och indexen
stegats. I sjtte delfiguren har 10 och 1 bytt plats och indexen stegats. I och med det r uppdelningen klar och pivot byter plats med elementet i position v.
11 4 8 2 10 7 1 3 6 9 5

6 4 3 2 1 5 7 8 11 9 10

11 4 8 2 10 5 1 3 6 9 7
v
h

6 4 5 2 1 3 7 8 11 9 10
v
h

11 4 8 2 10 5 1 3 6 9 7
v
h

6 4 5 2 1 3 7 8 11 9 10
v
h

6 4 8 2 10 5 1 3 11 9 7
v
h

1 4 5 2 6 3 7 8 11 9 10
v
h

6 4 3 2 10 5 1 8 11 9 7
v
h

1 2 5 4 6 3 7 8 11 9 10
v
h

6 4 3 2 1 5 10 8 11 9 7
v
h

1 2 3 4 6 5 7 8 11 9 10
b) andra passet

6 4 3 2 1 5 7 8 11 9 10

1 2 3 4 6 5 7 8 11 9 10

a) frsta passet

2 1 3 4 6 5 7 8 11 9 10
v
h
1 2 3 4 6 5 7 8 11 9 10
c) tredje passet
Figur 60. Quicksort med undangmd pivot.

Ett lite mer avancerat stt att bestmma pivot r att vlja medianen av det frsta, mittersta och sista
elementet i partitionen. Genom att ordna dessa tre element inbrdes i fltet, fr man medianen i
mitten och de andra elementen hamnar i den halva de ska vara ven efter uppdelningen och de
behver allts inte ing i sjlva uppdelningen. Pivot gms undan genom att byta plats med elementet nst lngst till hger i partitionen. Detta kallas medianen-av-tre-uppdelning.
Dessutom visas i detta exempel att rekursionen inte alltid krs i botten, utan avbryts d en viss
minimistorlek p partitionerna uppns, s kallad cutoff. Partitionerna slutsorteras med ngon enkel
metod, till exempel Insertionsort: Detta utnyttjar frhllandet att enkla metoder r effektivare n
avancerade fr sm datamngder. Empiriska frsk har visat att cutoff upp till 20 element ger bra
resultat. Anvnder man medianen-av -tre-uppdelning r det minsta meningsfulla antalet element i
en partition fyra, s cutoff lika med tre r i det fallet det minsta tnkbara.
Algoritmen fr partitioneringen r i grunden densamma som fregende men med tillgg fr
cutoff-hantering och medianen-av-tre-berkning av pivot:
1. om antalet element r mindre n eller lika med cutoff ska partitionen inte delas upp ytterligare,
g annars till punkt 2
2. ordna elementen i frsta, mittersta och sista positionen i partitionen inbrdes, medianen av
dessa hamnar i mittpositionen och vljs som pivot

56

3. byt plats p pivot och det andra elementet frn hger i partitionen, v stts till det frsta
elementet i partitionen och h till det tredje elementet frn hger i partitionen
4. s lnge v r mindre n h och elementet i v r mindre n pivot stegas v upp
5. s lnge v r mindre n h och elementet i h r strre n pivot stegas h ner
6. om v < h ska elementen i v och h byta plats och proceduren upprepas frn punkt 3, annars r
7. partitioneringen klar, pivot och elementet i v ska byta plats
Upprepa frn punkt 1 ovan s lnge det finns obehandlade partitioner.
I figur 61 nedan visas ett exempel p Quicksort med medianen-av-tre-uppdelning och cutoff vid 3.
Cutoff vid 3 innebr att det ska finnas minst fyra element kvar i en partition fr att ytterligare en
partitionering ska genomfras.
a) frsta passet:

b) andra passet:

11 4 8 2 10 7 1 3 6 9 5
5 4 8 2 10 7 1 3 6 9 11

medianen-av-tre

5 4 8 2 10 9 1 3 6 7 11
v
h

gm pivot

5 4 8 2 10 9 1 3 6 7 11
v
h

stega v och h

5 4 6 2 10 9 1 3 8 7 11
v
h

byt och stega v och h

5 4 6 2 3 9 1 10 8 7 11
v
h

byt och stega v och h

5 4 6 2 3 1 9 10 8 7 11
h
v

byt och stega v och h, h stegas frbi v

5 4 6 2 3 1 7 10 8 9 11

flytta pivot till position v genom byte

5 4 6 2 3 1 7 10 8 9 11
1 4 5 2 3 6 7 10 8 9 11

medianen-av-tre

1 4 3 2 5 6 7 10 8 9 11
v
h

gm pivot

1 4 3 2 5 6 7 10 8 9 11
h
v

stega v och h, v stegas frbi h

1 4 3 2 5 6 7 10 8 9 11

flytta pivot till position v (samma)

Figur 61. Quicksort med medianen-av-3-partitionering och cutoff vid 3.

57

c) tredje passet:

1 4 3 2 5 6 7 10 8 9 11
1 2 3 4 5 6 7 10 8 9 11
1 3 2 4 5 6 7 10 8 9 11
h v

medianen-av-tre
gm pivot, stega v och h

1 2 3 4 5 6 7 10 8 9 11
v h

flytta pivot till v:s position

1 2 3 4 5 6 7 10 8 9 11

terstr sedan delen t.h. om 7

cutoff

cutoff

cutoff

Figur 61 (forts). Quicksort med medianen-av-3-partitionering och cutoff vid 3.

Efter tredje uppdelningen i figur 61 erhlls cutoff i partitionerna till vnster och till hger om 2 och
sedan i den hgra partitionen till den delning som hade 5 som pivot. terstr behandling av
partitionen till hger om den frsta delningen vid 7, {10, 8, 9, 11}.

5.2 Distributiva sorteringsmetoder


Den grundlggande idn bakom distributiva metoder r att data som ska sorteras kan placeras olika
destinationssekvenser med hjlp av indexering, utan att det frekommer ngra jmfrelser nycklar
emellan. En frutsttning fr att detta slags metoder ska kunna anvndas r att nycklar antingen
direkt eller genom ngon bearbetning kan anvndas som index. r detta mjligt behver indata
endast lsas igenom fr att utfra sorteringen och tidskomplexiteten blir allts O(n).
Att data p ngot vis ska kunna anvndas som index, innebr naturligtvis en ptaglig begrnsning
och detta slags metoder r inte s vanliga men vrda att knna till.
5.2.1 Count Sort
Count Sort, ven kallad Pigeonhole Sort eller Bucket Sort. Genom att ha rknare, dr varje vrde
som kan frekomma motsvaras av en egen rknare, kan de sorterade talen genereras ur rknarna.
Om heltal ska sortera heltal lses talen igenom och respektive tal anvnds som index i en frekvenstabell dr det i varje positionen finns en rknare som stegas upp. Sedan gr man igenom tabellen
och fr varje position terskapas talet lika mnga gnger som rknaren anger.
Arbetet med att lsa igenom indata r proportionellt mot antalet element, s tidskomplexiteten fr
detta r O(n). Att g igenom frekvenstabellen och generera varje tal lika mnga gnger som dess
rknare anger r ocks en aktivitet med tidskomplexiteten O(n), och Count Sort r fljaktligen en
O(n)-metod. Detta r bttre n vad ngon jmfrande metod kan stadkomma i normalfallet,
O(nlogn) men det finns ptagliga begrnsningar.
En begrnsning fr Count Sort som redan nmnts r att de element som ska sortera mste kunna
anvndas som index, direkt eller genom ngon bearbetning. Om vrdeintervallet fr de data som
ska sorteras r mycket stort krvs mycket minne fr att lagra frekvenstabellen och om antalet
element som ska sorteras ptagligt underskrider storleken p frekvenstabellen, innebr det dligt
minnesutnyttjande. Om vrdemngden r stor och fljaktligen ven frekvenstabellen men de
element som faktiskt frekommer r en liten delmngd, blir utnyttjandet av frekvenstabellen dlig
genom att endast ett litet antal av rknarna kommer att anvndas. Ett omfattande initieringsarbete
lggs ner p att nollstlla rknare dr de flesta aldrig anvnds och en stor frekvenstabell dr de
flesta rknarna r 0, mste sedan gs igenom d utdata ska genereras.

58

5.2.2 Radix Sort


Radix Sort, ven kallad Digit Sort, bygger p principen att element som ska sorteras har nycklar
som kan behandlas som om varje element bestod av en fljd av siffror, drav namnet Digit Sort.
Decimala heltal, dr varje element bestr av en fljd de decimala siffrorna 0-9 r ett exempel. Varje
siffra har en vikt, beroende p dess position i talet, entalssiffran har vikten 1 (100), tiotalssiffran
har vikten 10 (101), osv. Det finns olika varianter av Radix Sort, hr beskrivs LSD (Least Sigificant
Digit) Radix Sort, vilken brjar distribuera med avseende p den minst signifikanta siffran. Radixsortering anvndas fr alla slags element som bestr av en fljd av symboler ur ett ordnat alfabet.
Fr att genomfra sorteringen anvnds ker, lika mnga som det finns symboler i alfabetet. De
element som ska sorteras gs igenom lika mnga gnger som det maximala antalet symboler som
kan frekomma i ett element. I det frsta passet betraktas symbolerna i den minst signifikanta
positionen och symbolen avgr i vilken k som elementet ska placeras. Nr alla element r lsta
och distribuerade ver kerna, sls kerna ihop i alfabetisk ordning. I det andra passet tas den nst
minst signifikanta symbolen och elementen frdelas p nytt ver kerna, vilka sedan sls ihop. I
det sista passet behandlas den mest signifikanta positionen och nr kerna sls ihop fr sista
gngen r elementen sorterade.
Som exempel sorteras tresiffriga decimala heltal i intervallet 0..999. Antalet ker som behvs r
allts 10 och tre pass behver genomfras. Fljande element ska sorteras:
189

203

305

099

858

974

056

008

273

021

I det frsta passet frdelas elementen med avseende p den minst signifikanta, sista siffran. De tio
kerna innehller fljande efter detta:
0

1
021

3
203
273

4
974

5
305

6
056

8
858
008

9
189
099

Kerna sls ihop, frn vnster, och vi fr fljande resultat av det frsta passet:
021

203

273

974

305

056

858

008

189

099

Elementen r nu ordnade med avseende p den minst signifikanta siffran. Det andra passet genomfr och elementen frdelas nu med avseende p den andra siffran. Kerna innehller efter detta:
0
203
305
008

2
021

5
056
858

7
273
974

8
189

9
099

Sammanslagning av kerna ger fljande, talen r ordnade efter de tv minst signifikanta siffrorna:
203

305

008

021

056

858

273

974

189

099

I det tredje och sista passet frdelas elementen med avseende p den mest signifikanta, frsta
siffran,. Detta leder till fljande innehll i kerna:
0
008
021
056
099

1
189

2
203
273

3
305

59

8
858

9
974

Sista sammanslagningen av kerna grs och ger slutresultatet:


008

021

056

099

189

203

273

305

858

974

Om man frsker uppskatta tidskomplexiteten hos radixsortering, kan man konstatera att det br
vara en funktion av antalet element n som ska sorteras, radix r och antalet symboler d i nycklarna.
Momentet att sprida elementen frn en (sammanslagen) lista till dellistorna innebr n frflyttningar. Operationen att sl ihop listorna beror p hur listan och dellistorna r realiserade,. Om man antar
att de r lnkade listor innebr sammanslagning att lnka ihop de r dellistorna. Antalet pass beror
av antalet siffror, dvs d. Man fr allts en tidskomplexitet som r O(d (n + r)). Fr fixa element p
d och r r allts radixsortering O(n) men observera att d kan som mest n = rd distinkta nyckelelement hanteras. D n kar mste vid vissa grnser antingen r eller d kas, vilket fr d innebr att
d rlogn. Komplexiteten fr radixsortering kan i sken av detta sgas vara O(rlog n (n + r)).

5.3 Externa sorteringsmetoder


Externa sorteringsmetoder avser sortering av sekundrminneslagrade data, dvs sortering av data p
filer. Anledningen till att anvnda en extern metod kan vara att datamngden r s stor att alla data
inte kan tas in i primrminnet p en gng eller att det av andra skl inte r nskvrt eller ndvndigt
att tillgripa en intern metod.
Externa metoder bygger vanligtvis p samsorteringsteknik, dvs att ur korta sorterade delsekvenser
successivt generera allt lngre sorterade delsekvenser till dess en enda sorterad sekvens terstr.
Man kan urskilja tv kategorier av samsortering, balanserad och naturlig. Balanserad samsortering
bygger p att man arbetar med bestmda, successivt kande delsekvenslngder, medan naturlig
samsortering innebr att man i varje pass frsker generera s lnga sorterade delsekvenser som
mjligt. Som exempel p dessa tv grundlggande varianter tas balanserad tvvgs samsortering
och naturlig tvvgs samsortering upp nedan.
Vid samsortering genererar man ibland sorterade delsekvenser (runs) innan sjlva samsorteringen
startar. Det har frdelen att antalet pass i sjlva samsorteringen reduceras ptagligt och att sdana
initiala delsekvenser kan genereras effektivt genom intern sortering. Ska delsekvenser av lngd m
genereras, lses m element i taget in frn indatafilen och sorteras. Varje sorterad delsekvens skrivs
p ngon av tv eller flera utdatafiler. Hur mnga filer och hur delsekvenserna distribueras p
filerna beror p samsorteringsmetoden ifrga.
5.3.1 Balanserad tvvgs samsortering
Balanserad tvvgs samsortering innebr att man anvnder tv indatafiler och tv utdatafiler i varje
pass, och att lngden p de sorterade delsekvenserna frdubblas i varje pass. De initiala delsekvenserna av lngd m, genereras genom att lsa in m element i taget frn den fil som ska sorteras, sortera
med en intern metod och skriva ut delsekvenserna vxelvis p de tv filer som ska vara indatafiler
i det frsta samsorteringspasset. Sedan ppnas de tv filerna fr lsning och delsekvenserna
samsorteras parvis till delsekvenser av lngd 2m, som vxelvis skrivs p tv utdatafiler. I nsta pass
samsorteras till delsekvenser av lngd 4m. Detta upprepas till dess en sorterad sekvens med de n
element erhlls. Nedan visas detta med m=1, dvs de initiala delsekvenserna bestr av bara ett
element. A, B, C och D representerar filer, som vxelvis anvnds som indata- eller utdatafiler.
Fljande data som ska sorteras:
11 43 82 21 10 78 16 35 69 97 54

Frsta grs uppdelning p tv filer, A och B, i detta exempel genom att skriva element vxelvis p
filerna. Lodstrecken avgrnsar delsekvenserna.

60

A: 11 | 82 | 10 | 16 | 69 | 54
B: 43 | 21 | 78 | 35 | 97

Fyra samsorteringspass krvs fr att erhlla en sorterad sekvens. Delsekvensernas lngd blir 2, 4,
8 och 16. Som framgr rcker inte alltid elementen till fr att fylla den sista delsekvensen som
genereras i ett pass.
C: 11 43 | 10 78 | 69 97
D: 21 82 | 16 35 | 54
A: 11 21 43 82 | 54 69 97
B: 10 16 35 78 |
C: 10 11 16 21 35 43 78 82 |
D: 54 69 97 |
A: 10 11 16 21 35 43 54 69 78 82
B:

Antalet pass r 2log(n) fr m=1, dvs O(logn). Fr m>1 fr vi 2log(n/m) , dvs log(n/m) pass. Fr
m>1 tillkommer arbetet med att generera de initiala delsekvenserna. I varje pass flyttas samtliga n
element frn indatafilerna till utdatafilerna, vilket ger tidskomplexiteten O(n). Om den aktuella
delsekvenslngden r d, s varierar antalet jmfrelser mellan d/2 och d1. Det minsta antalet
jmfrelser fr man om samtliga element i den ena delsekvensen r mindre n eller lika med det
frsta i den andra delsekvensen, flest jmfrelser fr man om det endast terstr ett element i en
delsekvens nr den andra tmts. Antalet jmfrelser per pass r O(n).
5.3.2 Naturlig tvvgs samsortering
Naturlig tvvgs samsortering innebr att man genererar s lnga sorterade delsekvenser som
mjligt i varje pass, i stllet fr att anvnda fixa delsekvenslngder. Frdelen med detta r att
antalet pass kan reduceras. Med samma indata som i exemplet fr balanserad tvvgs samsortering
ovan, erhlls fljande frlopp.
A: 11
B: 43

82
21

10
78

16
35

69
97

C: 11 43 82 35 54
D: 10 16 21 69 78

54

97

A: 10
B: 35

11
54

16 21
97

43

69

78

82

C: 10
D:

11

16

35

43

54

69

21

78

82

97

Punkterna markerar de delsekvenser som genererats. Jmfrt med exemplet p balanserad tvvgs
samsortering ovan blev det ett pass mindre men antalet jmfrelser per pass blir fler i naturlig
samsortering. Samtliga element i indatafilerna, utom de som terstr i den ena filen nr den andra
helt tmts, jmfrs bde med ett element i den andra indatafilen och med det sista elementet som
placerades i utdatafilen, fr att avgra om det gr att bygga vidare p den aktuella delsekvensen
eller inte.

61

5.3.3 Mngvgs samsortering


Med anvndning av flera filer kan man frvnta att antalet pass minskar. Den balanserade tvvgs
samsorteringen, till exempel, kan generaliseras till en balanserad k-vgs samsortering, med k
indatafiler och k utdatafiler, dvs totalt 2k filer. Det blir naturligtvis mer komplicerat att hitta det
minsta av k element, ett stt r att anvnda en prioritetsk. Efter att de initiala delsekvenserna med
lngd m genererats, blir antalet pass som krvs fr att samsortera i detta fall klog(n/m) .
5.3.4 Polyphase Merge
Polyphase Merge r en avancerad balanserad samsorteringsmetod, som gr k-vgs samsortering
med endast k+1 filer. Den bakomliggande idn r att endast en indatafil tms helt i varje pass och
att frdelningen av antalet delsekvenserna p de olika filerna grs optimal med tanke p detta. Den
bsta distributionen r relaterad till Fibonaccitalen, vilka definieras enligt fljande.
F0 = 0, F1 = 1, Fn = Fn-1 + Fn-2
De tio frsta Fibonaccitalen r allts 0, 1, 1, 2, 3, 5, 8, 13, 21, 34. Fibonaccital kan anvndas fr att
bestmma distributionen fr en tvvgs Polyphase Merge enligt fljande. Antag att de 21 talen
nedan ska sorteras. Den initiala delsekvenslngden vljs fr enkelhets skull till 1.
21 58 85 18 64 96 37 47 72 51 29 87 13 69 44 82 25 75 32 93 54

Den frsta uppdelningen av de 21 (F8) elementen grs med 8 (F6) element p fil A och 13 (F7)
element p fil B.
A: 21 | 58 | 85 | 18 | 64 | 96 | 37 | 47
B: 72 | 51 | 29 | 87 | 13 | 69 | 44 | 82 | 25 | 75 | 32 | 93 | 54

En utdatafil anvnds i en tvvgs Polyphase Merge. I varje pass kommer den kortaste av de tv
indatafilerna att tmmas. Den lngre kommer att vara indatafil ven i nsta pass, d den kommer
att tmmas. Frloppet visas nedan och det behvs allts 6 pass fr att sortera de 21 elementen.
A:
B: 25 | 75 | 32 | 93 | 54
C: 21 72 | 51 58 | 29 85 | 18 87 | 13 64 | 69 96 | 37 44 | 47 82
A: 21 25 72 | 51 58 75 | 29 32 85 | 18 87 93 | 13 54 64
B:
C: 69 96 | 37 44 | 47 82
A: 18 87 93 | 13 54 64
B: 21 25 69 72 96 | 37 44 51 58 75 | 29 32 47 82 85
C:
A:
B: 29 32 47 82 85
C: 18 21 25 69 72 87 93 96 | 13 37 44 51 54 58 64 75
A: 18 21 25 29 32 47 69 72 82 85 87 93 96
B:
C: 13 37 44 51 54 58 64 75
A:
B: 13 18 21 25 29 32 37 44 47 51 54 64 69 72 75 82 85 87 93 96
C:

I en k-vgs Polyphase Merge, anvnds k:te ordningens Fibonaccital fr distributionen.

62

5.3.5 Replacement Selection


Replacement selection anvnds fr att generera initiala delsekvenser p ett stt som kan vara bttre
n att bara lsa in m element frn en indatafil, sortera dem internt och skriva ut dem p en utdatafil.
Algoritmen bygger p att det blir en intern plats ledig nr ett element skrivs p utdatafilen. och att
denna lediga plats kan anvndas fr nsta element i indatafilen. Det kan d uppst tv fall:
nsta element r strre n eller lika med det utskrivna elementet och kan ing i den delsekvens
som hller p att skapas och kan ordnas in i den interna strukturen.
nsta element r mindre n det utskrivna elementet och kan inte ing i den aktuella delsekvensen
men om den interna strukturen kan delas upp i en del med element som ingr i den aktuella delsekvensen lagras och en del med element som inte gr det, kan ett sdant element lsas och gra
det mjligt att komma t fler element i indatafilen som kan ing i den aktuella delsekvensen.
En datastruktur som uppfyller dessa krav r en prioritetsk (binr heap). Frst lses m element in
frn indatafilen och stts in i en min-heap. Sedan grs delete-min och elementet som tas ut ur
prioritetskn skrivs p utdatafilen. Nsta element lses frn indata. Om det r strre n eller lika
med det element som just skrivits p utdatafilen kan det ing i den aktuella delsekvensen och stts
in i priortetskn med operationen insert. I annat fall placeras elementet i det i det tomma utrymme
som uppstod nr prioritetskns storlek minskade d delete-min utfrdes. Detta upprepas till dess
prioritetskns storlek blir 0. D pbrjas en ny delsekvens, genom att terstlla storleken p
prioritetskn och heapordna de element som finns i det tidigare dda utrymmet. Som exempel
visas hur ngra delsekvenser genereras fr fljande element:
64 21 96 58 18 85 37 72 47 51 75 82 13 87 44 93 25 29 32 69 54

I figur 62 visas, steg fr steg, hur den frsta delsekvensen genereras med en prioritetsk med
storlek 3. De klamrade siffrorna 1, 2 och 3 avser positionerna i den binra heap som implementerar
prioritetskn. De skuggade elementen ingr inte i den del av minnet som prioritetskn omfattar.

operation
toss
fix-heap
delete-min
insert(58)
delete-min
18 < 58
delete-min
insert(85)
delete-min
37 < 85
delete-min
72 < 96

prioritetsk
[1] [2] [3]
64
21
96
21
64
96
64
96
58
96
64
64
95
64
96
18
96
18
85
96
18
96
18
96
37
18
37
18
72
37
18

utdata

21
21
21
21
21
21
21
21
21
21

58
58
58
58
58
58
58
58

64
64
64
64
64
64

85
85
85 96
85 96

Figur 62. Generering av frsta delsekvensen.

I figur 63 visas, lite mindre detaljerat n i figur 62, hur den andra delsekvensen genereras. I detta
fall finns redan tre element frn fregende steg p plats, s den frsta tgrden r att ordna
elementen med fix-heap.

63

operation
fix-heap
delete-min, insert(47)
delete-min, insert(51)
delete-min, insert(75)
delete-min, insert(82)
delete-min, gm 13
delete-min, insert(87)
delete-min, gm 44
delete-min, insert(93)
delete-min, gm 25

prioritetsk
[1] [2] [3]
18
37
72
37
72
47
47
72
51
51
72
75
72
75
82
75
82
13
82
87
13
87
44
13
93
44
13
25
44
13

utdata
18
18
18
18
18
18
18
18
18

37
37
37
37
37
37
37
37

47
47
47
47
47
47
47

51
51
51
51
51
51

72
72
72
72
72

75
75 82
75 82 87
75 82 87 93

Figur 63. Generering av andra delsekvensen.

De tre element som terstr efter andra passet kommer att generera en tredje och sista delsekvens.
En 3-vgs sortering skulle i detta fall bli klar i ett pass. Om vi hade lst in och sorterat tre element
i taget, hade sju delsekvenser erhllits och en 3-vgs sortering hade d behvt tre pass fr att bli
klar.
Om indata r slumpvis ordnade kan man visa att replacement selection genererar delsekvenser vars
lngd i genomsnitt r 2m. Detta kan dock innebra att antalet pass inte reduceras men med lite tur
kan det bli s och med tanke p att extern sortering r lngsam r varje insparat pass vrdefullt. I
situationer dr extern sortering anvnds r det dessutom ganska vanligt att indata r nstan ordnade
och d kommer replacement selection att producera endast ett ftal mycket lnga initiala delsekvenser och drmed f pass. Detta sammantaget gr replacement selection till en vrdefull
metod fr att generera delsekvenser.

5.4 Indirekt sortering


Indirekt sortering innebr att de element som ska sorteras ligger i en struktur och i en annan struktur
lagras enbart adresserna till respektive element. Sortering grs genom att ordna adresserna s att
de hamnar i en ordning som vid en sekventiell genomlsning ger elementen i ordning.

64

6 Interpolationsskning
Interpolationsskning tillhr en grupp av skmetoder som bygger p en teknik som kallas tudelningsskning. Mest knd bland dessa r halveringsskning, ofta kallad binrskning. Tudelningsskning bygger p att man har en linjr skstruktur dr elementen r direktadresserbara,
exempelvis ett flt, och att elementen r ordnade enligt en sknyckel.
Tudelningskning innebr att man vljer ut en position ngonstans i den del av skstrukturen man
fr tillfllet opererar p, initialt hela strukturen. Om nyckelvrdena r unika gller d att alla
nyckelvrden till vnster om den valda positionen r mindre n nyckelvrdet i den valda positionen
och alla nyckelvrden till hger r strre n nyckelvrdet i den valda positionen. Man jmfr
nyckelvrdet i den utvalda positionen med skt nyckelvrde. Tre fall kan d intrffa:
nycklarna r lika, man har funnit det man sker och kan avbryta skningen.
sknyckeln r mindre n nyckelvrdet i den utvalda positionen och man kan eliminera den del
av skintervallet som ligger till hger drom.
sknyckeln r strre n nyckelvrdet i den utvalda positionen och man kan eliminera den del av
skintervallet som ligger till vnster drom.
S lnge man inte finner skt vrde reducerar man successivt skintervallet genom delning och
eliminering av den ena intervallhalvan, till dess man antingen finner skt vrde eller inget element
terstr i skintervallet.
I halveringsskningsfallet vljer man ut det mittersta elementet fr att jmfra med. Om skstrukturen r ett flt och l och r anger index fr skintervallets ndpunkter berknad delningspunkten p
som p = (l+r)/2, vilket r hrlett ur fljande uttryck.
1
p = l + --- ( r l )
2

Mittpunkten i intervallet berknas genom att lgga till halva intervalllngden till dess vnstra
ndpunkt.
I varje steg i halveringsskningen eliminerar man halva antalet element i den terstende delen av
skstrukturen. Om det inte finns ngra statistiska faktorer, som att skmngden har en speciell
sammansttning eller att skning normalt gller exempelvis frmst sm nycklar, r halveringsskning det optimala valet av tudelningsskning, svida man inte vljer interpolationsskning.
Interpolationsskning syftar till att frska optimera valet av delningspunkt, genom att utifrn sknyckelns vrde x och nyckelvrdena i skintervallets ndpunkter, a[l].key respektive a[r].key,
interpolera en lmplig delningspunkt p. Det r allts faktorn 1/2 man erstter med en uppskattning
av var skt element borde finnas, genom att interpolera.
a[l]

x a [ l ].key
p = l + ----------------------------------------------- ( r l )
a [ r ].key a [ l ].key

a[r]
p

I vrsta fall r interpolationsskning mycket smre n halveringsskning men detta innebr att man
skulle rka vlja sknyckelsekvenser som r mycket osannolika. I normala fall, vilket avser att
valet av sknycklar r likfomigt frdelat, r den frvntade tidskomplexiteten avsevrt mycket
bttre n den fr halveringsskning, nmligen O(log log n), jmfrt med halveringsskningen
O(log n).

65

6.1 Litteratur
Sedgewick, R. (1990), Algorithms in C, Addison-Wesley, sid.201-202.
Lewis H. R., Denenberg L. (1991), Data Structures and Their Algorithms, HarperCollins, sid 184187.

66

You might also like