Solution of Assignment 3 and Midterm

advertisement
Solution of Assignment 3 and
Midterm
CSC2100B
AVL Tree
• A binary search tree is a binary tree in
which every node has larger key than the
nodes in its left subtree and smaller key
than the nodes in its right subtree
• AVL tree is a balanced binary search tree
such that for every node, the heights of its
two subtrees differ by at most one
AVL Tree
• After insertion/deletion, a node may
become unbalanced because of change in
the height of its subtree
• We can restore the balance by repeatedly
doing rotation at the LOWEST unbalanced
node until all nodes are balanced
• There are four possible cases
– Left Left (Right Right)
– Left Right (Right Left)
Left Left
• Call the unbalanced node a
• Left Left means the left subtree (C) of the left
child of a is causing the unbalance
• The balance can be restored by a single rotation
a
b
b
a
h
h+1
h+1
h
A
B
C
C
B
A
Left Right
• Left Right means the right subtree (C) of the left
child of a is causing the unbalance
• We can restore the unbalance by a double
rotation
a
b
c
a
c
b
h
h+1
h
A
D
C
B
Either B or C
is too tall
D
C B
A
Special Case
• After deletion, the height of the left subtree
of a node may decrease by one and Left
Left and Left Right may happen at the
same time
• In this case, we can always use single
rotation (for details see the post “answer
for written assignment” in newsgroup)
Intermediate Steps Required in Exam
• In Exam, you need to show the intermediate steps, but don’t need to
show the change of pointers, like this one
• For insertion/deletion, first show me the tree immediately after the
insertion/deletion before any rotation is done; if rotation is needed,
then also show the tree after the rotation. Between each state, you
should draw an arrow and label it with Insert k, Delete k or LL Rotate
3.15
•
•
•
•
•
Let P(h) be the proposition that at most h/2 rotations are needed after
deleting a key from a AVL tree of height h. We claim that P(h) is true.
Base case:
When h<= 1, no rotation is needed, so the claim is true.
Assume that P(h) is true for 2 <= h <= k. Consider the case when h = k+1.
Case 1 (The key to delete is at the root):
By assumption h >= 2, so the root has 2 children. We replace the key of
the root by the smallest key in the right subtree of root and then remove
that key. This is reduced to the case 2 or case 3.
Case 2 (The key to delete is at a child c of the root):
Suppose c has only one child d. In this case, we remove c and append
the subtree rooted d to the root. The only node that can be unbalanced
is the root and at most one rotation is needed. So assume that c has
two children. This case, same as case 1, can be reduced to case 3.
3.15
• Case 2 (The key to delete is at a child c of the root):
Suppose c has only one child d. In this case, we remove c and
append the subtree rooted d to the root. The only node that can
be unbalanced is the root and at most one rotation is needed. So
assume that c has two children. This case, same as case 1, can
be reduced to case 3.
• Case 3 (The key to delete is in a subtree T’ rooted at a node of
depth 2):
The height of T’ is at most k-1. By the inductive assumption, at most(k1)/2 rotations is needed to restore the AVL property of T’. If the height of
T’ remains the same after these rotations, then T is also balanced.
In case the height of T’ decreases by one after restoring the AVL
property of T’, then one more rotation is needed. So in total at most (k1)/2+1 = (k+1)/2 rotations are needed to restore the AVL tree property of
T after the deletion of a key.
Big-Oh Notation
• Some useful rules about big oh notation
– If a term has some constant in the front, drop the
constant. e.g. O(3n) = O(n), O(25) = O(1)
– Remember the order O(1) < O(log n) < O(n1/2) < O(n)
< O(n log n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
– If there are more than one term, just keep the highest
order one. e.g. O(log n + n2 + n log n) = O(n3)
– If g(n) > O(1), O( f(n) g(n) ) > O( f(n) ). e.g. O(n2 log n)
> O(n2)
Most Crucial Function
• Suppose we use D1 in a program for solving some problem
• In this program, three operations are used (called for some constant
number of times) and they have worst case time complexities
f1 = n2log n, f2 = n! and f3 = n log n respectively
• So the worst case total running time is c1 n2log n + c2 n! + cn n log n
where c1, c2, c3 are some constants
• As n! grows much faster than n2log n and n log n (for n=100, n!=
9.33e+157, n2log n=66438 and n log n=664.38), the other two terms
become insignificant when n is large
• Therefore the most crucial function is f2
Finding Interception Point
• To find the interception point of two
functions f3D1(n) and f3D2(n), just solve the
equation f3D1(n) = f3D2(n)
10 n = n2
=>
n = 0 or n = 10
• Since the time complexity is undefined for
n<0, the first case is rejected
Implementation of Complete Binary Tree
• 1st Implementation
Each node has two pointers pointing to its left
and right childs
Implementation of Complete Binary Tree
• 2nd Implementation
• A node has a pointer to its first child and a
pointer to its next sibling
Implementation of Complete Binary Tree
• 3rd implementation
• Implementation using array
Address
Key
0
7
1
3
2
6
3
1
4
2
5
5
6
4
• The parent, left child and right child of the node
at position k are at positions ceiling(k/2)-1, 2k+1
and 2(k+1) respectively.
Solving Recurrence
1) Expand T(n) by
applying the definition of
T(n) for several times.
You may also start by
evaluating T(1), T(2), …
but starting from T(n) may
be easier
2) Find the general pattern. Note
the second to the last term all
have the form bai(n-i).
Pay attention to the first term
and last term to find the first and
last index of the summation.
When solving a recurrence, unless
specified, otherwise you DON’T need
to simplify it to get a closed form
expression. Just giving the
summation is okay. But T(n) should
not appear in the last line.
Evaluating Nested Loops
These correspond to
the first, second, and
third loops.
1) First you evaluate the innermost loop.
When you evaluate it, you can ignore the
outer loops and consider i, j as fixed. So It
is just summing up 1 for in times.
2) Similarly in this summation, i is fixed
so this is just summing up in for (n-i+1)
times
3) A series of the sum of
two terms is the same as
the sum of two series of
the individual terms, i.e.
n
n
n
 (a  b )   a   b
i 1
i
i
i 1
i
i 1
i
Linked List vs Stack/Queue
• Access, Insertion and Deletion of data in
the middle
• Searching without changing the data
structure
Singly Linked List vs Doubly Linked List
• Backward traversal
• Finding the last k-th element in the list
• Insertion/Deletion of the previous element
Download