cse332: data abstractions lecture 7: avl trees tyler robison summer 2010 1

31
CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

Post on 19-Dec-2015

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

CSE332: Data Abstractions

Lecture 7: AVL Trees

Tyler RobisonSummer 2010

1

Page 2: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

2

The AVL Tree Data StructureAn AVL tree is a BST

In addition: Balance property:balance of every node isbetween -1 and 1

balance(node) = height(node.left) – height(node.right)

Result: Worst-case depth is O(log n)

How are we going to maintain this? Worry about that later…

4

131062

115

8

14127 9

15

Page 3: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

3

111

84

6

10 12

70

0 0

0

1

1

2

3

Is it an AVL tree?

BST? CheckHeight/balance property?Start at leaves, move upward

At each node, check:Are heights of left & right within 1 of each other?

Page 4: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

4

3

1171

84

6

2

5

0

0 0 0

1

1

2

3

4

Is this an AVL tree?

Null child has height of -1; this is an imbalance

Page 5: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

5

The shallowness bound: Proving that the AVL balance property is ‘enough’

Let S(h) = the minimum number of nodes in an AVL tree of height h If we can prove that S(h) grows exponentially in h, then a tree

with n nodes has a logarithmic height

Step 1: Define S(h) inductively using AVL property S(-1)=0, S(0)=1, S(1)=2 For h 2, S(h) = 1+S(h-1)+S(h-2) Build our minimal tree from smaller

minimal trees, w/ heights within 1 of each other

Step 2: Show this recurrence grows really fast Similar to Fibonacci numbers Can prove for all h, S(h) > h – 1 where

is the golden ratio, (1+5)/2, about 1.62 Growing faster than 1.6h is “plenty” exponential

h-1h-2

h

Notational note:Oval: a node in the treeTriangle: a subtree

Page 6: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

6

Before we prove it

Good intuition from plots comparing: S(h) computed directly from the definition ((1+5)/2) h

S(h) is always bigger Graphs aren’t proofs, so let’s prove it

Page 7: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

7

The Golden Ratio

62.12

51

This is a special number: If (a+b)/a = a/b, then a = b

• Aside: Since the Renaissance, many artists and architects have proportioned their work (e.g., length:height) to approximate the golden ratio

• We will need one special arithmetic fact about : 2= ((1+51/2)/2)2

= (1 + 2*51/2 + 5)/4 = (6 + 2*51/2)/4 = (3 + 51/2)/2

= 1 + (1 + 51/2)/2 = 1 +

Page 8: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

8

The proof

Theorem: For all h 0, S(h) > h – 1 Proof: By induction on hBase cases:

S(0) = 1 > 0 – 1 = 0 S(1) = 2 > 1 – 1 0.62

Inductive case (k > 1):Inductive hypotheses: S(k) > k – 1 and S(k-1) > k-1 – 1Show S(k+1) > k+1 – 1

S(k+1) = 1 + S(k) + S(k-1) by definition of S > 1 + k – 1 + k-1 – 1 by inductive hypotheses

= k + k-1 – 1 by arithmetic (1-1=0) = k-1 ( + 1) – 1 by arithmetic (factor k-1 )

= k-1 2 – 1 by special property of = k+1 – 1 by arithmetic (add exponents)

S(-1)=0, S(0)=1, S(1)=2For h 2, S(h) = 1+S(h-1)+S(h-2)

Page 9: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

9

Good news

Proof means that if we have an AVL tree, then find is O(log n)

But as we insert and delete elements, we need to:1. Track balance2. Detect imbalance3. Restore balance

Is this AVL tree balanced?How about after insert(30)?

92

5

10

7

15

20

Page 10: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

10

An AVL Tree

20

92 15

5

10

30

177

0

0 0

011

2 2

3 …

3

value

height

children

Track height at all times!

10 key

Page 11: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

11

AVL tree operation overview

AVL find: Same as BST find

AVL insert: First BST insert, then check balance and

potentially “fix” the AVL tree Four different imbalance cases

AVL delete: The “easy way” is lazy deletion Otherwise, like insert we do the deletion and then

have several imbalance cases

Page 12: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

12

Insert: detect potential imbalance

1. Insert the new node as in a BST (a new leaf)2. For each node on the path from the root to the new

leaf, the insertion may (or may not) have changed the node’s height

3. So when returning from insertion in a subtree:1. Update heights, if necessary2. Detect height imbalance3. Perform a rotation to restore balance at that node, if

necessary

Fact that makes it a bit easier: We’ll only need to do one type of rotation in one place

to fix balance That is, a single ‘move’ can fix it all

Page 13: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

13

Insertion Imbalance ExampleInsert(6)Insert(3)Insert(1)

Third insertion violates balance property• happens to be

detected at the root

What is the only way to fix this?

6

3

1

2

1

0

6

3

1

0

60

Page 14: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

14

Fix for ‘left-left’ case: Apply ‘Single Rotation’

Single rotation: The basic operation we’ll use to rebalance Move child of unbalanced node into parent position Parent becomes the “other” child (always okay in a BST!) Other subtrees move in only way BST allows

3

1 600

1

AVL Property violated here

Intuition: 3 must become rootnew-parent-height = old-parent-height-before-insert

6

3

0

1

2

1

Page 15: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

15

4 Different rotation cases Do the BST insertion, recurse back up the tree

and check for an imbalance at each node If an imbalance is detected at node c, we’ll

perform 1 of 4 types of rotations to fix it, depending on which subtree the insertion was in c

X VUZ

ab

1 2 3 4

Page 16: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

16

Back to our example (case 1) Node imbalanced due to insertion somewhere in

left-left grandchild that increased the height First we did the insertion, which would make node a

imbalanced

63

0

1

2

1

a

Z

Y

b

X

h h

hh+1

h+2 a

Z

Y

b

X

h+1 h

hh+2

h+3

Before insertion After insertion

Page 17: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

17

The general left-left case Rotate at node a, using the fact that in a BST:

X < b < Y < a < Z

• A single rotation restores balance at the node– To same height as before insertion (so ancestors now

balanced)

a

Z

Y

b

X

h+1 h

hh+2

h+3 b

ZY

ah+1 h h

h+1

h+2

X

Page 18: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

18

Another example: insert(16)

10 4

22 8

15

3 6

19

17 20

24

16

Page 19: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

19

Another case 1 example: insert(16)

10 4

22 8

15

3 6

19

17 20

24

16

10 4

8

15

3 6

19

17

2016

22

24

Page 20: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

20

The general right-right case (case 4)

Mirror image to left-left case, so you rotate the other way Exact same concept, but need different code

a

ZY

X

h

hh+1

h+3

bh+2 b

ZY

a

X

h h

h+1h+1

h+2

Page 21: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

21

Two cases to goUnfortunately, single rotations are not enough

for insertions in the left-right subtree or the right-left subtree

Simple example: insert(1), insert(6), insert(3) First wrong idea: single rotation like we did for left-

left

3

6

1

0

1

2

6

1 3

1

0 0

Page 22: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

22

Two cases to goUnfortunately, single rotations are not enough

for insertions in the left-right subtree or the right-left subtree

Simple example: insert(1), insert(6), insert(3) Second wrong idea: single rotation on the child of

the unbalanced node

3

6

1

0

1

2

6

3

1

0

1

2

Page 23: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

23

Sometimes two wrongs make a right

First idea violated the BST property Second idea didn’t fix balance But if we do both single rotations, starting with the

second, it works! (And not just for this example.) Double rotation:

1. Rotate problematic child and grandchild2. Then rotate between self and new child

3

6

1

0

1

2

6

3

1

0

1

2

00

1

1

3

6

Intuition: 3 must become root

Page 24: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

24

The general right-left case

a

X

bc

h-1

h

h

h

VU

h+1

h+2

h+3

Z

a

X

c

h-1

h+1h

h

VU

h+2

h+3

Z

b

h

c

X

h-1

h+1

h

h+1

VU

h+2

Z

b

h

ah

Page 25: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

25

Comments Like in the left-left and right-right cases, the height of the

subtree after rebalancing is the same as before the insert So no ancestor in the tree will need rebalancing

Does not have to be implemented as two rotations; can just do:

a

X

bc

h-1

h

h

h

VU

h+1

h+2

h+3

Z

c

X

h-1

h+1

h

h+1

VU

h+2

Z

b

h

ah

Page 26: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

26

The last case: left-right

Mirror image of right-left Again, no new concepts, only new code to write

a

h-1

h

hh

VU

h+1

h+2

h+3

Z

X

b

c

c

X

h-1

h+1

h

h+1

VU

h+2

Z

a

h

bh

Page 27: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

27

4 Different rotation cases Do the BST insertion, recurse back up the tree

and check for an imbalance at each node If an imbalance is detected at node c, we’ll

perform 1 of 4 types of rotations to fix it, depending on which subtree the insertion was in c

X VUZ

ab

1 2 3 4

Page 28: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

28

Insert, summarized Insert as in a BST

Check back up path for imbalance, which will be 1 of 4 cases: 1. node’s left-left grandchild is too tall 2. node’s left-right grandchild is too tall 3. node’s right-left grandchild is too tall 4. node’s right-right grandchild is too tall

Only one case occurs because tree was balanced before insert

After the appropriate single or double rotation, the smallest-unbalanced subtree has the same height as before the insertion So all ancestors are now balanced

Page 29: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

29

Now efficiencyHave argued rotations restore AVL property but

do they produce an efficient data structure?

Worst-case complexity of find: Worst-case time to do a rotation? Worst-case complexity of insert:

O(logn)O(1)O(logn)

Page 30: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

30

Pros and Cons of AVL TreesArguments for AVL trees:1. All operations logarithmic worst-case because trees are

always balanced.2. The height balancing adds no more than a constant factor

to the speed of insert (and delete)

Arguments against AVL trees:

3. Difficult to program & debug4. More space for height field5. Asymptotically faster but rebalancing takes a little time6. Most large searches are done in database-like systems on

disk and use other structures (e.g., B-trees, our next data structure)

Page 31: CSE332: Data Abstractions Lecture 7: AVL Trees Tyler Robison Summer 2010 1

31

What we’re missing Splay Trees

BST No balance condition (don’t need to store height) No O(logn) guarantee; can be O(n) Instead, amortized guarantee: O(logn) over the

course of a large number of operations Neat caching behavior: when you access a node

(find, insert), you ‘splay’ it to the top: it becomes the new root