csc 2300 data structures & algorithms february 16, 2007 chapter 4. trees

26
CSC 2300 Data Structures & Algorithms February 16, 2007 Chapter 4. Trees

Post on 22-Dec-2015

219 views

Category:

Documents


0 download

TRANSCRIPT

CSC 2300Data Structures & Algorithms

February 16, 2007

Chapter 4. Trees

Today – AVL and Splay Trees

AVL Trees Double Rotation Splay Trees Animation:

http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm

AVL Trees – Insert

Let α denote the node that must be rebalanced. Since any node has at most two children and a

height imbalance requires that α’s two subtrees’ heights differ by two, we see that a violation may occur in four cases:

1. An insertion into the left subtree of the left child of α.

2. An insertion into the right subtree of the left child of α.

3. An insertion into the left subtree of the right child of α.

4. An insertion into the right subtree of the right child of α.

Cases 1 and 4 are mirror image symmetries with respect to α, as are cases 2 and 3.

Case 2

Single rotation fails to fix Case 2.

Case 2

Left-right double rotation fixes Case 2.

Case 3

Right-left double rotation fixes Case 3.

Example in Class

We will insert this sequence into an initially empty AVL tree: 1, 2, …, 6, 7, 16, 15, …, 9, 8.

AVL Tree – Node Declaration

AVL Node – Height Computation

AVL Tree – Insertion

Single Rotation

Double Rotation

Splay Trees

Advantages of Splaying

It gives a good theoretical bound – any M consecutive tree operations starting from an empty tree take at most O(M logN) time.

It works well in practice – in many applications, when a node is accessed, it is likely to be accessed again in the near future. (What computer component uses this idea?)

Splay trees do not require the maintenance of height or balance information, thus saving space and simplifying the code.

Splaying Operations

The following sequence of operations is repeated until the node containing the accessed value (after find or insert) is at the root.

Let t point to the node, p point to its parent, and g point to its grandparent.

Zig-zag and Zig-zig

Example

Insert 1, 2, 3, …, N into an initially empty tree.

Why does tree look like this? That is, why is the root not 1?

No Splaying

Let us start accessing nodes. Access node 1. How much time does it take? Assume no splaying. Access node 2. How much time does it take?

Splaying

Access node 1. Splay at the node 1.

Access node 2. How much time will it take?

Bigger Example

Splay at node 1.

How much time will be required to access node 2?

Bigger Example

Splay at node 2.

How much time will be required to access node 3?

Bigger Example

Splay at node 3.

How much time will be required to access node 4?

Bigger Example

Splay first at node 4, and then at node 5.

Bigger Example

Splay first at node 6, and then at node 7.

Bigger Example

Splay first at node 8, and then at node 9.

Observations

When access paths are long, thus leading to a longer-than-normal search time, the rotations tend to be good for future operations.

When accesses are cheap, the rotations are not as good and can be bad.

The extreme case is the initial tree formed by the insertions. All the insertions are constant-time operations leading to a bad initial tree.

At that point in time, we have a very bad tree, but we have a good running time.

Then a couple of horrible accesses leave a nearly balanced tree. The cost is to give back some of the time that has been saved.