Binära träd Annat Upplägg Binära träd: repetition Binära sökträd

Binära träd
Annat
Mittkursutvärdering
Algoritmer och Datastrukturer
Gör!
Markus Saers
[email protected]
Inlämningsuppgift
Upplägg
Binära träd: repetition
Binära träd (9)
Träd där varje nod har exakt två barn
som är binära träd eller tomma
Binära sökträd (10.1)
Balanserade binära sökträd (10.2)
Associativa strukturer (12)
Frågor?
Idéer?
Kan ses som en grammatik:
R Æ RR
RÆØ
Barnen är ordnade och ligger antingen till
vänster eller höger om modern
Sortering (11)
Binära sökträd: repetition
Binära sökträd: repetition
Binära träd där noderna är strikt ordnade
Om vi söker efter något i trädet kan vi
försäkra oss om att vi kommit rätt så fort
vi når ett löv eller ett tomt träd
Roten i ett binärt sökträd representerar en
nyckel
Alla nycklar som föregår rotens ligger i det
vänstra barnet
Alla nycklar som efterföljer rotens ligger i det
högra barnet
Kan användas för att representera
mängder
Vi behöver aldrig gå längre än trädets höjd
För fulla (och kompletta) träd är höjden
log2(n) (avrundat uppåt)
Vi kan söka i trädet med en tidskomplexitet
på O(log n) – ”logaritmisk tid”
Hur kan vi göra träden så fulla som
möjligt?
1
Balanserade binära sökträd
När behöver/bör
trädet balanseras?
Balanserar upp obalanser efter insättning
och borttagning
Insättning/borttagning + balansering
måste vara billigare i längden
Balanserar så att det fortsätter att vara
ett binärt sökträd
Flera olika balansmekanismer
AVL-träd (Adelson-Velsky och Landis 1962)
10.2
Vilket det blir om höjden kan garanteras
vara ”typ log n” – O(log n)
O(log n) tillåter ytterligare faktorer som inte
är beroende av n
2 x log n = O(log n)
15 x log n + 20 = O(log n)
Balanseringen får inte vara beroende av
trädets totala storlek (beroende av n)
Röd-svarta träd (RB-trees, 70-talet)
12.1
B-träd, Splayträd, etc.
När behöver/bör
trädet balanseras?
Hur balanserar man ett träd?
Balanseringen måste vara lokal
Genom rotationer
Balanseringen måste tillåta viss obalans
En rotation av ett träd gör ett av rotens
barn till rot
Total balans tvingar oss att ha fulla träd
När ska trädet balanseras?
Olika beroende på olika balansmekanismer
Rotation (av en kedja)
3
Vänster
Rotation
5
3
5
Vänsterrotation
8
Rotens vänstra barn blir rot
Massa flyttas från vänster till höger
5
8
5
Rotens högra barn blir rot
Massa flyttas från höger till vänster
Högerrotation
8
Höger
Det går att rotera åt höger eller vänster
beroende på vilket barn som blir den nya
roten
3
8
Kallas ibland för sick (zig) och sack
(zag). Oklart vilken som är höger
respektive vänster
3
2
Rotationer av ett träd
(vänsterrotation runt 80)
Rotationer av ett träd
(vänsterrotation runt 80)
80
80
60
90
90
60
85
95
90
80 85
85
92
95
60
95
92
92
Rotationer av ett träd
(vänsterrotation runt 80)
Är rotationer lokala?
M
80
90
90
80
60
90
80 85
95
80
95
90
60
85
95
60
92
60
85 92
95
85
92
92
Egentligen rotation av kedja
(med lite bagage)
Är rotationer lokala?
M
M
95
85
92
60
X
95
85
M
90
80
80
90
60
M
90
80
X
92
X
80
90
60
95
85
92
60
95
85
92
X
X
3
Går det alltid
att rotera bort obalanser?
Går det alltid
att rotera bort obalanser?
90
50
30
90
95
50
70
30
30
90
70
80
Går det alltid
att rotera bort obalanser?
95
80
Går det alltid
att rotera bort obalanser?
90
30
95
70
80
50
50
90
95
50
70
30
80
90
95
70
50
80
Går det alltid
att rotera bort obalanser?
70
95
80
30
Dubbelrotation
Två möjliga dubbelrotationer
90
50
30
70
90
95
70
70
50
80
95
80
50
30
Höger runt höger barn följt av vänster
Vänster runt vänster barn följt av höger
Kallas ibland för sick-sack (zig-zag)
90
80
95
30
4
Rotationer: sammanfattning
AVL-träd
Är lokala operationer
Använder rotationer för att balansera ett
träd efter insättning/borttagning
Modern påverkas inte
Träden under de roterade noderna påverkas
inte
Varje nod fungerar som en våg
Höjdskillnaden mellan vänster och höger
barn får vara högst 1.
Kan utföras i konstant tid
När höjdskillnaden överstiger 1 roterar
trädet så att det åtgärdas
Alla inblandade träd är fortfarande binära
sökträd
Vänster- och högerrotationer är
symmetriska
Insättning som skapar obalans
Insättning som skapar obalans
30
+1
30
+1
50
0
A
B
50
0
A
C
30
+2
B
50
+1
A
C
B
C
90
Insättning som skapar obalans
30
+1
B
50
0
30
+2
50
0
A
C
30
0
50
+1
A
B
Insättning som skapar obalans
C
A
50
-1
C
B
30
0
90
90
5
Insättning som skapar obalans
50
-1
30
0
Insättning som skapar obalans
50
-1
50
-2
30
0
30
+1
50
-1
30
0
30
+1
40
0
50
-2
50
-2
40
-1
30
+1
40
0
40
-1
30
+1
30
0
30
0
Observationer om
när AVL-träd ska roteras
I första fallet hade vi ett
högertungt träd med ett
högertungt högerbarn
40
0
30
0
50
-2
50
-2
40
0
Insättning som skapar obalans
30
0
Insättning som skapar obalans
50
-2
50
-1
40
0
40
0
Insättning som skapar obalans
30
0
50
-1
30
+1
40
0
50
-1
30
+2
50
-2
30
+2
50
+1
Vänsterrotation
50
0
I andra fallet hade vi ett
vänstertungt träd med ett
högertungt vänsterbarn
Vänsterrotation av vänsterbarnet
Skapar vänstertungt träd
med vänstertungt vänsterbarn
Kan åtgärdas enligt ovan
50
-2
30
+1
6
AVL-träd i boken
Lite matematik om
balanserade binära sökträd
10.2
AVL-träd
Beskriver en effektiv lösning
Inte särskilt konceptuellt modellerad
Höjden kan visas vara högst 1,75 x log2(n)
O(log n)
RB-träd
Höjden är något högre än AVL-träd
O(log n)
Snabbare insättning/borttagning
Långsammare sökning
Implementeras av TreeSet och TreeMap
Associativa strukturer
Träd som associativa strukturer
Associerar en nyckel med ett värde
Går alldeles utmärkt!
Kan användas för exempelvis
frekvensordlistor
Som mängd:
Nyckel = ordtyp
Värde = frekvens
Kallas för Map i java.util
”Mappar” nycklar till världen
Klassen TreeMap finns ju trots allt…
Varje nod representerar en medlem i
mängden
Som associativ struktur:
Varje nod representerar ett nyckel–värdepar där nyckeln är ”medlem” i trädet
Värdet kan vara vad som helst!
Sortering
Sortering
Simpla metoder
Kan vi slå n2 med det vi vet så här långt?
(11.2.1 – 11.2.3)
Insertion sort
Sätt in varje element på sin plats
Selection sort
Välj ut nästa element att sätta in
Bubble sort
Träd verkar vara bra till mycket…
Binära sökträd ordnar nycklarna i en strikt
ordning (sorterar)!
Hur snabbt blir det?
Byt positioner på dåligt sorterade element tills
listan är sorterad
Värsta tid: O(n2)
Kvadratisk tidskomplexitet
7
Skillnaden mellan n log n och n2
Sortering med träd
100
Vad behöver vi göra?
90
Lägga in alla elementen som ska sorteras i
ett träd: O(n log n)
80
70
Vi ska lägga in n element och varje element tar
log n tid att lägga in
60
50
Traversera trädet i ordning: O(n)
40
n log n + n = O(n log n)
30
Log-linjär tidskomplexitet
20
Tillåter inte dubbletter…
10
Går att lösa med en lista som värde
0
0
10
20
30
40
n log2(n)
Skillnaden mellan n log n och n2
50
60
n^2
70
80
90
100
2^n
Varför fungerar det?
10 000
Algoritmprincipen ”söndra och härska”
tillämpas (divide and conquer)
9 000
8 000
Vid varje nod i trädet delas
sorteringsproblemet upp till två hälften så
stora problem
7 000
6 000
5 000
4 000
Det finns sorteringsalgoritmer som löser
det här problemet utan att använda
trädstrukturer explicit
3 000
2 000
1 000
Tar mindre plats att utföra
0
0
10
20
30
40
n log2(n)
50
60
n^2
70
80
90
100
2^n
Sortering i n log n-tid
Stabil och instabil sortering
Merge sort (11.4.1)
Ofta finns mer information än den man
sorterar på
Dela listan i två tills delarna kan sorteras
trivialt
”Merga” de två sorterade delarna till en
sorterad version av ursprungslistan
Quick sort (11.4.3)
Algoritmer som garanterat behåller
originalordningen på dubbletter kallas
stabila
Välj ett pivot-tal ur listan
Skapa två listor, en med tal som är mindre
och en med tal som är större.
Tillämpa quick sort på de två nya listorna
och sammanfoga dem till en sorterad
version av ursprungslistan
8
Jämförelse mellan
sorteringsalgoritmer
Vilken sorteringsalgoritm
ska man välja?
Insertion sort
Om stabilitet krävs
Stabil, kvadratisk tid
Selection sort
Instabil, kvadratisk tid
Bubble sort
Stabil, kvadratisk tid
Merge sort med insertion sort som trivialt steg
Typ det som används i java.util
Annars
Quick sort
Merge sort
Stabilitet beroende på hur ”trivial sortering” utförs,
log-linjär tid
Quick sort
Instabil, log-linjär tid
9