augmenting avl trees

20
Augmenting AVL trees

Upload: casey-hopkins

Post on 04-Jan-2016

49 views

Category:

Documents


0 download

DESCRIPTION

Augmenting AVL trees. How we’ve thought about trees so far. Good for determining ancestry Can be good for quickly finding an element. Other kinds of uses?. Any thoughts? Finding a minimum/maximum… (heaps are probably just as good or better) Finding an average? - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Augmenting AVL trees

Augmenting AVL trees

Page 2: Augmenting AVL trees

How we’ve thought about trees so far

Good for determining ancestryCan be good for quickly finding an element

Good for determining ancestryCan be good for quickly finding an element

Page 3: Augmenting AVL trees

Other kinds of uses?

• Any thoughts?• Finding a minimum/maximum…– (heaps are probably just as good or better)

• Finding an average?• More complicated things?!!!11one

Enter: idea of augmenting a tree

Enter: idea of augmenting a tree

Page 4: Augmenting AVL trees

Augmenting

• Can quickly compute many global properties that seem to need knowledge of the whole tree!

• Examples:– size of any sub-tree– height of any sub-tree– averages of keys/values in a sub-tree– min+max of keys/values in any sub-tree, …

• Can quickly compute any function f(x) so long as you only need to know f(x.left) and f(x.right)!

Page 5: Augmenting AVL trees

Augmenting an AVL tree

• Can augment any kind of tree• Only balanced trees are guaranteed to be fast• After augmenting an AVL tree to compute

f(x), we can still do all operations in O(lg n)!

Page 6: Augmenting AVL trees

• We are going to do one simple example• Then, you will help with a harder one!

• Problem: augment an AVL tree so we can do:– Insert(key): add key in O(lg n)– Delete(key): remove key in O(lg n)– Height(node): get height of sub-tree rooted at

node in O(1)

Simple first example

A regular AVL tree already does this

A regular AVL tree already does this

How do we do this?How do we do this?Store some extra data at each node… but what?

Store some extra data at each node… but what?

Page 7: Augmenting AVL trees

• Function we want to compute: Height(u) = H(u)• If someone gives us H(uL) and H(uR),

can we compute H(u)?• What formula should we use?

• If u = null then– H(u) = 0

• Else– H(u) = max{H(uL), H(uR)}+1

Can we compute this function quickly?

uLuL uRuR

uu

H(uL)H(uR)

H(u)=?

Page 8: Augmenting AVL trees

Augmenting AVL tree to compute H(u)• Each node u contains– key: the key– left, right: child pointers– h: height of sub-tree rooted at u

• How?

The usual stuff…

Secret sauce!Secret sauce!

d, 0

Insert(d)a, 0

Insert(a)

d, 1

Insert(e)

e, 0

b, 0Insert(b)

a, 1

c, 0Insert(c)

e, 0

d, 2

b, 0

a, 1 c, 0a, 0 c, 0

b, 1

d, 2d, 1d, 2

Page 9: Augmenting AVL trees

Algorithm idea:• From the last slide, we develop an algorithm

Insert(u):1 BST search for where to put u2 Insert u into place like in a regular AVL tree3 Fix balance factors and rotate as you would in

AVL insert, but fix heights at the same time. (Remember to fix heights all the way to the root.

Don’t stop before reaching the root!)

• (When you rotate, remember to fix heights of all nodes involved, just like you fix balance factors!)

Page 10: Augmenting AVL trees

Harder problem: overpaid employees!

• You have a record for each employee in your company with salary and age.

• We want to quickly find overpaid employees of age <= A.

Page 11: Augmenting AVL trees

Breaking the problem down

• You must design a data structure D of employee records to efficiently do:– Insert(D; x): If x is a pointer to a new employee

record, insert the record pointed to by x into D.– Delete(D; x): If x is a pointer to an existing

employee record in D, remove that record from D.– MaxSal(D; A): Return the largest salary, amongst

all employees in D whose age is <= A; if there is no such employee, then return -1.

• All functions must run in O(lg n)

Page 12: Augmenting AVL trees

Part 1

• Give a precise and full description of your data structure

• Illustrate this data structure by giving an example of it on some collection of employee records of your own choice.

Page 13: Augmenting AVL trees

Figuring out the data structure• Iterative process…

hard to get it right the first time!

• What function do we want to compute?• Maximum salary for employees with age <= A

• What info should we store at each node u?• Maybe maximum salary for all employees in the

sub-tree rooted at u? Let’s call this value MS(u).

• How can we compute MS(u) quickly (i.e., by looking at a small number of descendents of u)?

Page 14: Augmenting AVL trees

Organizing nodes inside the tree

• How can we turn maximum salary in a sub-tree into maximum salary for those with age <= A?

• For sure, need to relate age with sub-trees!– Things are organized into sub-trees by key…

• So, age must be related to key.– Let age be the key of each node…– May have 2+ nodes with same key, but that’s okay.

Page 15: Augmenting AVL trees

Age=17000, MS=

Age=1590, MS=

Age=3801, MS=

Age=1100, MS=

Age=1247, MS=

Age=24100, MS=

Age=30000, MS=

Answer to part 1

Age=17000, salary=36000,

MS=

Age=1590, salary=28000,

MS=

Age=3801, salary=41000,

MS=

Age=1100, salary=31000,

MS=

Age=1247, salary=29000,

MS=

Age=30000, salary=75000,

MS=

Age=30000, salary=90000,

MS=

Age=1247, salary=29000,

MS=29000

Age=1100, salary=31000,

MS=31000

Age=3801, salary=41000,

MS=48000

Age=1590, salary=28000,

MS=48000

Age=30000, salary=90000,

MS=90000

Age=30000, salary=75000,

MS=90000

Age=17000, salary=36000,

MS=90000

Age Salary1100 310001247 290001590 280001590 480003801 4100017000 3600030000 9000030000 75000

Age Salary1100 310001247 290001590 280001590 480003801 4100017000 3600030000 9000030000 75000

Age=1590, MS=

Age=1590, salary=48000,

MS=

Age=1590, salary=48000,

MS=48000

Page 16: Augmenting AVL trees

Part 2• Explain how to implement Insert(D, x), Delete(D, x) and

MaxSal(D, A) in O(log n) time

Insert:1 Do regular AVL-insert(D, <x.age, x.salary, MS=0>), except:2 As you move up the tree fixing balance factors, fix MS(u)

for every node on the path to the root3 After each rotation, fix each MS(u) for each node

that was involved in the rotation4 Remember to fix heights all the way to the root.

(Don’t stop early, even if done balance factors/rotations!)Delete:Same as Insert, but “Do regular AVL-delete[…]”How do we do MaxSal???

What does “fix MS(u)” mean?What formula do we use?

What does “fix MS(u)” mean?What formula do we use?

Set MS(u) = max{u.salary, MS(uL), MS(uR)}Set MS(u) = max{u.salary, MS(uL), MS(uR)}

Page 17: Augmenting AVL trees

How can we compute MaxSal?

• Write a recursive function!– Recursion is often very natural for trees

• Big problem: want MaxSal(D, A) =largest salary for age <= A in tree

• Smaller problem: MaxSal(u, A) =largest salary for age <= A in sub-tree rooted at u

• Recursive/inductive measure of problem size: size of sub-tree

• Therefore, smaller problem = smaller sub-tree.

Page 18: Augmenting AVL trees

Code for MaxSal

// u is a node, A is an ageMaxSal(u, A) if u = null then return -1 else if A < u.age then return MaxSal(uL, A)

else return max{u.salary, MaxSal(uR,A), MaxSal(uR,A)}

uL: salary, age, MS uR: salary, age, MS

u: salary, age, MS

Calling MaxSal on BOTH sub-trees can take O(n) time!

Calling MaxSal on BOTH sub-trees can take O(n) time!

Page 19: Augmenting AVL trees

Code for MaxSal

// u is a node, A is an ageMaxSal(u, A) if u = null then return -1 else if A < u.age then return MaxSal(uL, A)

else return max{u.salary, MaxSal(uR,A), MS(uL)}

uL: salary, age, MS uR: salary, age, MS

u: salary, age, MS

Page 20: Augmenting AVL trees

Why O(lg n) time?• Insert/Delete: normal AVL operation = O(lg n)– PLUS: update MS(u) for each u on path to the root• Length of this path <= tree height, so O(lg n) in an AVL tree

– PLUS: update MS(u) for each node involved in a rotation• At most O(lg n) rotations (one per node on the path from

the root <= tree height)• Each rotation involves a constant number of nodes• Therefore, constant * O(lg n), which is O(lg n).

• MaxSal– Constant work + recursive call on ONE child– Single recursive call means O(tree height) = O(lg n)