DS PPTS - 2 PDF
DS PPTS - 2 PDF
DS PPTS - 2 PDF
Prepared by:
Mr. Suresh kumar Raju
Assistant Professor
Information Technology
1
DATA STRUCTURES
TEXT BOOKS:
1. Fundamentals of Data structures in C, 2nd
Edition, E.Horowitz, S.Sahni and Susan
Anderson-Freed, Universities Press.
2. Data structures A Programming Approach
with C, D.S.Kushwaha and A.K.Misra, PHI.
2
UNIT-I
Topics:
Basic concepts- Algorithm Specification-Introduction,
Recursive algorithms, Data Abstraction Performance
analysis- time complexity and space complexity, Asymptotic
Notation-Big O, Omega and Theta notations, introduction
to Linear and Non Linear data structures.
Singly Linked Lists-Operations-Insertion, Deletion,
Concatenating singly linked lists, circularly linked lists-
Operations for Circularly linked lists, Doubly Linked Lists-
Operations- Insertion, Deletion. Representation of single,
two dimensional arrays, sparse matrices-array and linked
representations.
3
ALGORITHM
or
It is a method of finding a right solution to a problem or to a
different problem or to a different problem breaking into
simple cases.
4
PROPERTIES OF AN ALGORITHM
Finitness:
An algorithm should terminate at finite number of steps.
Definiteness:
Each step of an algorithm must be precisely stated.
Effectiveness:
It consists of basic instructions that are realizable.
This means that the instructions can be performed by using the
given inputs in a finite amount of time.
Input:
An algorithm accepts zero or more inputs.
Output:
It produces at least one output.
5
PSEUDOCODE
It is a representation of algorithm in which instruction sequence
can be given with the help of programming constructs.
or
Pseudo code, on the other hand, is not a programming language,
but simply an informal way of describing a program.
6
PSEUDOCODE CONVENTIONS
1. Algorithm is a procedure consisting of heading and body. The
heading consists of a name of the procedure and parameter list.
The syntax is
Algorithm name_of
_procedure(paramater1,parameter2,…..parameter n).
8
PSEUDOCODE CONVENTIONS
10. The inputting and outputting can be done using read and
write.
9
EXAMPLES
10
EXAMPLES
2) write an algorithm to check whether given number is even or
odd
Algorithm events (val)
{
if (val%2==0) then
write(“given no is even”):
else
write(“given no is odd”);
}
11
EXAMPLES
3) write an algorithm to find factorial of n number.
Algorithm fact(n)
{
if n:=1 then
return 1;
else
return n*fact(n-1);
}
12
EXAMPLES
4) write an algorithm to perform multiplication of two matrices.
Algorithm Mul(A,B,n)
{
for i:=1 to n do
for j:=1 to n do
c[i,j]:=0
for k:=1 to n do
c[i,j]:=c[i,j]+a[i,k]*b[k,j];
}
13
RECURSIVE ALGORITHM
Or
14
EXAMPLES
Factorial of a number
Algorithm factorial(a)
int a;
{
int fact=1
if(a>1)
Fact = a* factorial(a-1);
Return(fact);
}
15
DATA ABSTRACTION
16
PERFORMANCE EVALUATION
17
PERFORMANCE ANALYSIS
18
TIME COMPLEXITY
This is the amount of computing time required by an algorithm to
run to completion.
There are 2 types of computing time- compile time and run time.
19
TIME COMPLEXITY
The time complexity is computed using run time is calculated by
input size and asymptotic notations .
Def: let f(n) and g(n) are two non-negative functions. And is there
exists an integer no and constant C such that C>0 and for all
integers n>n₀ ,f(n)<=c*g(n), then f(n) is big oh of g(n). It is also
denoted as “ f(n) = Ο(g(n))”.
21
BIG OH NOTATION
Various meanings associated with big-oh are
O(n)- linear
O(n²)-quadratic
O(n³)-cubic
O(2n)-exponential
O(log n)-logarithmic
22
OMEGA NOTATION
It represents the lower bound of algorithms running time.
F(n)>C*g(n).
This is denoted by f(n)=Ωg(n).
23
THETA NOTATION
It represents the running time between upper bound and lower
bound.
c1g(n)<=f(n)<=c2g(n)
24
SPACE COMPLEXITY
1) constant
2)instance
25
SPACE COMPLEXITY
The space requirement S(p) can be given as
S(p)= C+Sp
C is the constant
26
DATA STRUCTURE
The data structure can be defined as the collection of elements
and all the possible operations which are required for those set
of elements.
Or
27
TYPES OF DATA STRUCTURES
The data structure can be divided into two basic types.
28
TYPES OF DATA STRUCTURES
Data structures
29
LIST
List is the collection of elements arranged in a sequential
manner.
30
LIST REPRESENTATION
31
OPERATIONS ON AN ORDERED LIST
1)display of list.
32
SINGLY LINKED LIST
The head of the pointer is used to gain access to the list and
the end of the list is denoted by a NULL pointer
33
STRUCTURE OF A SINGLE LINKED LIST
struct node
{
int data;
struct node * next;
}
The list holds two members ,an integer type variable “data”
which holds the elements and another member of type “node”,
which has the variable next.
34
SINGLE LINKED LIST OPERATIONS
Creating a linked list
Inserting in a linked list
Deleting a linked list
Searching an element in the linked list
Display the elements
Merging two linked list
Sorting a linked list
Reversing a list
35
CREATING A LINKED LIST
36
CREATING A LINKED LIST
struct list
{
int no;
node *head;
37
CREATING A LINKED LIST
The statement obtains memory to store a node and assigns its
address to head which is a pointer variable.
38
INSERTING AN ELEMENT
Insertion is done in three ways:
39
INSERTING AN ELEMENT
Function to insert a node at the beginning of the list:
40
INSERTING AN ELEMENT
Function to insert a node at the beginning of the list:
void add_beg(struct node **q, int no)
{
struct node *temp; /*add new node*/
tempdata=no;
tempnext=*q;t
*q=temp;
}
here temp variable is take and space is allocated using “malloc”
function.
41
INSERTING AN ELEMENT
Insertion after any specified node:
process is as follows.
42
INSERTING AN ELEMENT
43
INSERTING AN ELEMENT
Function to insert a node at the middle of the list:
Void add_after(struct node *q, int loc, int no)
{
struct node *temp, *r;
int l;
for(i=0;i<loc;i++)
{
temp=tempnext;
44
INSERTING AN ELEMENT
if(temp==NULL)
{
printf(“\n there are less than %d elements in list”,loc);
return;
}
} ?/*insert new node*/
r=malloc(sizeof(struct node));
rdata=n0;
rnext=tempnext;
tempnext=r;
45
INSERTING AN ELEMENT
Inserting node at the end of the list:
46
INSERTING AN ELEMENT
Inserting node at the end of the list:
{
temp=malloc(sizeof(struct node));
tempdata=no;
47
INSERTING AN ELEMENT
tempnext=NULL;
*q=temp;
}
else
while(tempnext!=NULL)
48
INSERTING AN ELEMENT
temp=tempnext;
r=malloc(sizeof(struct node));
rdata=no;
rnext=NULL;
tempnext=r;
}
}
49
DELETING AN ELEMENT
50
DELETING AN ELEMENT
We traverse through the entire linked list to check each node
whether it has to be deleted.
if we want to delete the first node in the list then we shift the
structure type pointer variable to the next node and then delete
the entire node.
51
DISPLAYING THE CONTENTS OF THE
LINKED LIST
Displays the elements of the linked list contained in the data
part.
52
DISPLAYING THE CONTENTS OF THE
LINKED LIST
/*traverse the entire list*/
while(start!=NULL)
{
printf(“%d”,startdata);
start=startnext;
}
}
53
OTHER OPERATIONS OF SINGLY
LINKED LIST
Searching the linked list:
The reversing of the linked list that last node becomes the first
node and first becomes the last.
54
OTHER OPERATIONS OF SINGLY
LINKED LIST
Sorting the list:
55
CIRCULAR LINKED LIST
A linked list in which last node points to the header node is
called the circular linked list.
In this list the last node contains a pointer back to the first
node rather than the NULL pointer.
56
CIRCULAR LINKED LIST
The structure defined for circular linked list
struct node
{
int data;
57
CIRCULAR LINKED LIST
A circular linked list is represented as follows:
58
OPERATION OF CIRCULAR LINKED LIST
59
ADDING ELEMENTS IN THE CIRCULAR
LINKED LIST
Ciradd():
60
DELETING ELEMENTS FROM THE
CIRCULAR LINKED LIST
delcirq():
61
DELETING ELEMENTS FROM THE
CIRCULAR LINKED LIST
The condition is checked for the empty list.
If the list is not empty,
Cirq_disp():
the function receives the pointer to the first node in the list as
a parameter.
The q is also made to point to the first node in the list.
The entire list is traversed using q.
Another pointer p is set to NULL initially.
63
DOUBLY LINKED LIST
The doubly linked list uses double set of pointer’s, one
pointing to the next item and the other pointing to the
preceding item.
64
DOUBLY LINKED LIST
65
DOUBLY LINKED LIST
Each node contains three parts:
An information field which contains the data.
A pointer field next which contains the location of the next
node n the list.
66
CREATING A DLL
To create DLL at the nodes to the existing list:
To create the list the function d_create can be used before
creating the list the function checks if the list is empty.
67
CREATING A DLL
To create DLL at the nodes to the existing list:
To create the list the function d_create can be used before
creating the list the function checks if the list is empty.
68
OPERATIONS OF DLL
Adding a node in the beginning of DLL:
69
OPERATIONS OF DLL
70
OPERATIONS OF DLL
Function to add a node at the beginning of list.
71
OPERATIONS OF DLL
Adding a node in the middle of the list:
To add the node in the middle of the list we use the function
d_addafter().
72
OPERATIONS OF DLL
Deleting a node from DLL:
This function deletes a node from the list if the data part
matches a with num.
The function receives two parameters
the address of the pointer to the first node.
the number to be deleted.
To traverse the list ,a loop is run.
The data part of each node is compared with the num.
If the num value matches the data part, then the position of the
node to be deleted is checked
73
OPERATIONS OF DLL
Display the contents of DLL.
to display the contents of the doubly linked list, we follow the
same algorithm that had used in the singly linked list.
Here q points to the first node in the list and the entire list is
traversed .
Function to display the DLL.
void d_disp(struct dnode *q)
{ printf(“\n”);
while(q!=NULL)
{ printf(“%2d”,qdata);
q=qnext;
}
}
74
ARRAYS
75
ARRAYS
To refer to an element, specify
―Array name
―Position number
Syntax:
array_name[ position number ]
76
ARRAYS
Array Declaration
When declaring arrays
– Name
– Type of data elements
– Number of elements
Syntax
Data_Type array_Name[ Number_Of_Elements ];
77
ARRAYS
Examples:
int c[ 10 ];
float myArray[ 3284 ];
Declaring multiple arrays of same type
– Format similar to regular variables
– Example:
int b[ 100 ], x[ 27 ];
78
ARRAYS
Name of array (Note
that all elements of
this array have the
int c[12] same name, c)
• An array of ten integers
• c[0], c[1], …, c[11] c[0] -45
c[1] 6
double B[20] c[2] 0
• An array of twenty long floatingc[3]
c[4]
72
1543
point numbers c[5] -89
-89
c[6] 0
• B[0], B[1], …, B[19] c[7] 62
c[8] -3
c[9] 11
c[10] 6453
c[11] 78
Position number of
the element within 79
array c
ARRAYS
start at zero in C
80
ARRAYS
• Example
int D[10][20]
– An array of ten rows, each of which is an array of
twenty integers
– D[0][0], D[0][1], …, D[1][0], D[1][1], …, D[9][19]
– Not used so often as arrays of pointers
81
ARRAYS
Row 0 a[ 0 ][ 0 ] a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ]
Row 1 a[ 1 ][ 0 ] a[ 1 ][ 1 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ]
Row 2
a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 2 ] a[ 2 ][ 3 ]
Column subscript
Array name
Row subscript
82
ARRAYS
Multi Dimensional Arrays
• Array declarations read right-to-left
• Syntax
Data_Type array_Name[ Size ][Size][Size] … Size];
• Example
int a[10][3][2];
“an array3of ten arrays
3 of three arrays of3 two elements”
in memory
...
2 2 2 2 2 2 2 2 2
10
83
SPARSE MATRIX
A sparse matrix is a matrix that allows special techniques to
take advantage of the large number of zero elements.
84
CATEGORIES OF SPARSE MATRIX
Sparse matrix has
85
REPRESENTATION OF SPARSE MATRIX
Sparse matrix can be represented in
Tuple method
Array representation
86
TUPLE METHOD
consider a matrix Tuple matrix is
87
TUPLE METHOD
consider a matrix Tuple matrix is
row column value
[4 0 0 0 1 1 4
3 11 0 0 2 1 3
1 22 33 0 2 2 11
7 45 41 22] 3 1 1
3 2 22
3 3 33
This is triangular matrix
4 1 7
4 2 45
4 3 41
4 4 22
88
ARRAY METHOD
consider a matrix
[15 0 0 21
22 11 0 0
0 19 35 15]
This is triangular matrix
The elements are represented as follows
1,1,15 1,4,21 2,1,22 2,2,11 3,2,11 3,2,19 3,3,35 3,4,16
89
SPARSE MATRIX OPERATIONS USING
ARRAYS
90
SPARSE MATRIX OPERATIONS USING
ARRAYS
This holds three functions
Sparseprod() stores the result.
Search_nonzero()checks whether an non zero element is present
or not.
Searchinb()searches an element whose row number is equal to
column number.
91
REPRESENTATION OF SPARSE MATRIX
THROUGH LINKED LIST
The elements of sparse matrix consist of three integers.
Its row number
Its column number
Its value
92
REPRESENTATION OF SPARSE MATRIX
THROUGH LINKED LIST
The create_list() function stores the information in the form of
linked list.
show_list() reads and displays the data stored in the linked list.
93
REPRESENTATION OF SPARSE MATRIX
THROUGH LINKED LIST
94
REPRESENTATION OF SPARSE MATRIX
THROUGH LINKED LIST
95
REPRESENTATION OF SPARSE MATRIX
THROUGH LINKED LIST
96
UNIT-II
Topics:
Stack ADT, definition, operations, array and linked
implementations in C, applications-infix to postfix
conversion, Postfix expression evaluation,
recursion implementation, Queue ADT, definition
and operations ,array and linked Implementations
in C, Circular queues-Insertion and deletion
operations, Deque (Double ended queue) ADT,
array and linked implementations in C.
97
STACKS
A stack is a linear structures in which addition or deletion of
elements takes place at the same end.
Or
The stack is an ordered list in which insertion and deletion is
done at the same end.
To create a stack.
To insert an element on to the stack.
To delete an element from the stack.
To check which element is at the top of the stack.
To check whether a stack is empty or not.
STACK OPERATIONS
If Stack is not full ,
then add a new node at one end of the stack
this operation is called PUSH.
PUSH and POP are functions of stack used to fulfill the stack
operations.
TOP is the pointer locating the stack current position.
ARRAY IMPLEMENTATION IN C
Stacks can be represented in the memory arrays by
maintaining a linear array STACK and a pointer variable TOP
which contains the location of top element.
Each node in the list contains data and a pointer to the next node.
Pictorial depiction of stack in linked
list
APPLICATION OF STACKS
Reversing a list.
Brackets / Parentheses.
Exponentiation.
Multiplication / Division.
Addition / Subtraction.
Step 3: Repeat the above step (2) until the entire expression is
converted into postfix notation.
EXAMPLE OF INFIX TO POSTFIX
CONVERSION
RECURSION IMPLEMENTATION
If a procedure contains either a call statement to itself/to a
second procedure that may eventually result in a cell statement
back to the original procedure. Then such a procedure is called
as recursive procedure.
Queue underflow.
If the elements are added then the rear is incremented using the
pointer and new item is stored in the array.
ADDING ELEMENTS IN A QUEUE
The front and rear variables are initially set to -1, which
denotes that the queue is empty.
If the item being added is the first element then as the item is
added, .the queue front is set to 0 indicating that the queue is
now full.
DELETING ELEMENTS IN A QUEUE
For deleting elements from the queue, the function first checks
if there are any elements for deletion. If not , the queue is said
to be empty otherwise an element is deleted.
LINKED IMPLEMENTATION IN C
Job scheduling.
Categorizing data.
Priority queue.
CIRCULAR QUEUE
138
Definition of Tree
A tree is a finite set of one or more nodes
such that:
There is a specially designated node called
the root.
The remaining nodes are partitioned into
n>=0 disjoint sets T1, ..., Tn, where each of
these sets is a tree.
We call T1, ..., Tn the subtrees of the root.
139
Representation of Tree
Level
T 1
0
A
T
1 2
T
T 2
3
T
4 T T
5 6 3
Fig.Tree 1
140
Terminology
A
A
B D
C
E F G H
Fig.Tree 2
141
ROOT:
This is the unique node in the tree to which further subtrees are
attached.in the above fig node A is a root node.
Degree of the node:
The total number of sub-trees attached to the node is called the
degree of the node.
Node degree
A 3
E 0
Leaves:
These are terminal nodes of the tree.The nodes with degree 0 are
always the leaf nodes.In above given tree E,F,G,C and H are the leaf
nodes.
Internal nodes:
The nodes other than the root node and the leaves are called the 142
internal nodes.Here B and D are internal nodes.
Parent nodes:
The node which is having further sub-trees(branches)is called the
parent node of those sub-trees. In the given example node B is parent
node of E,F and G nodes.
Predecessor:
While displaying the tree ,if some particular node occurs previous to
some other node then that node is called the predecessor of the other
node.In above figure E is a predecessor of the node B.
successor:
The node which occurs next to some other node is a successor node.In
above figure B is successor of F and G.
Level of the tree:
The root node is always considered at level 0,then its adjacent children
are supposed to be at level 1 and so on.In above figure the node A is at
level 0,the nodes B,C,D are at level 1,the nodes E,F,G,H are at level 2.
143
Height of the tree:
The maximum level is the height of the tree.Here height of the
tree is 3.The height of the tree is also called depth of the tree.
Degree of tree:
The maximum degree of the node is called the degree of the
tree.
The degree of a node is the number of subtrees of the node
– The degree of A is 3; the degree of C is 1.
The node with degree 0 is a leaf or terminal
node.
A node that has subtrees is the parent of the
roots of the subtrees.
The roots of these subtrees are the children of
the node.
Children of the same parent are siblings.
The ancestors of a node are all the nodes
along the path from the root to the node. 144
Binary Trees
A binary tree is a finite set of nodes that is
either empty or consists of a root and two
disjoint binary trees called the left subtree
and the right subtree.
Any tree can be transformed into binary
tree.
– by left child-right sibling representation
The left subtree and the right subtree are
distinguished. 145
Types Of Binary Trees
147
Right skewed binary tree
C
148
Complete binary tree
• The tree in which degree of each node is at the most two is
called a complete binary tree.In a complete binary tree there
is exactly one node at level 0,twonodes at level 1 and four
nodes at level 2 and so on.so we can say that a complete
binary tree of depth d will contains exactly 2l nodes at each
level l,where l is from 0 to d.
B C
D E F G 149
Abstract Data Type Binary_Tree
structure Binary_Tree(abbreviated BinTree) is
objects: a finite set of nodes either empty or
consisting of a root node, left Binary_Tree,
and right Binary_Tree.
functions:
for all bt, bt1, bt2 BinTree, item element
Bintree Create()::= creates an empty binary tree
Boolean IsEmpty(bt)::= if (bt==empty binary
tree) return TRUE else return FALSE
150
BinTree MakeBT(bt1, item, bt2)::= return a binary
tree
whose left subtree is bt1, whose right subtree is
bt2,
and whose root node contains the data item
Bintree Lchild(bt)::= if (IsEmpty(bt)) return error
else return the left subtree of bt
element Data(bt)::= if (IsEmpty(bt)) return error
else return the data in the root node
of bt
Bintree Rchild(bt)::= if (IsEmpty(bt)) return error
else return the right subtree of bt
151
Maximum Number of Nodes in BT
The maximum number of nodes on level i of a
binary tree is 2i-1, i>=1.
The maximum nubmer of nodes in a binary tree
of depth k is 2k-1, k>=1.
Prove by induction.
k
2 i 1
2 k
1
i 1
152
Binary Tree Representation
•Sequential(Arrays) representation
•Linked representation
153
Array Representation of Binary Tree
This representation uses only a single linear
array tree as follows:
i)The root of the tree is stored in tree[0].
ii)if a node occupies tree[i],then its left child is
stored in tree[2*i+1],its right child is stored in
tree[2*i+2],and the parent is stored in tree[(i-
1)/2].
154
Sequential Representation
[1] A
A
[2] B
[3] C
B C [4] D
[5] E
[6] F
D E F G [7] G
[8] H
[9] I
H I . .
. .
. .
. .
155
Sequential Representation
55 [0] 55
[1] 44
[2] 66
44 66 [3] 33
[4] 50
[5]
33 50 [6]
[7] 22
[8]
22
156
Advantages of sequential representation
The only advantage with this type of representation is that
the direct access to any node can be possible and finding the
parent or left right children of any particular node is fast
because of the random access.
157
Disadvantages of sequential representation
158
Linked Representation
struct node
{
int data;
struct node * left_child, *right_child;
};
data
159
Linked Representation
root
55
44 X 66 X
33 X X 50 X
X 22 X 55,44,66,33,50,22
160
Advantages of Linked representation
161
Disadvantages of linked representation
162
Full BT VS Complete BT
A binary tree with n nodes and depth k is
k
complete iff its nodes correspond to the nodes
numbered from 1 to n in the full binary tree of
depth k.
A full binary tree of depth k is a binary tree of
depth k having 2 -1 nodes, k>=0.
A
A
B C B C
D E F G D E F G
H I H I J K L M N O
163
Complete binary tree Full binary tree of depth 4
Binary Tree Traversals
The process of going through a tree in such a way that each node is
visted once is tree traversal.several method are used for tree
traversal.the traversal in a binary tree involves three kinds of basic
activities such as:
Visiting the root
Traverse left subtree
Traverse right subtree
164
We will use some notations to traverse a given binary
tree as follows:
L means move to the Left child.
R means move to the Right child.
D means the root/parent node.
Print 3rd
C E Print at the last
Print 1st
C E Print 2nd
B C
B C
D E F G
D E F G
H J
I K
H I J
FIG(a) FIG(b)
169
Arithmetic Expression Using BT
+ inorder traversal
A/B*C*D+E
infix expression
* E
preorder traversal
+**/ABCDE
* D prefix expression
postorder traversal
AB/C*D*E+
/ C
postfix expression
level order traversal
A B +*E*D/CAB
170
Inorder Traversal (recursive version)
void inorder(tree_pointer ptr)
/* inorder tree traversal */
{
if (ptr) { A/B*C*D+E
inorder(ptr->left_child);
printf(“%d”, ptr->data);
indorder(ptr->right_child);
}
}
171
Preorder Traversal (recursive version)
void preorder(tree_pointer ptr)
/* preorder tree traversal */
{
+**/ABCDE
if (ptr) {
printf(“%d”, ptr->data);
preorder(ptr->left_child);
predorder(ptr->right_child);
}
} 172
Postorder Traversal (recursive version)
void postorder(tree_pointer ptr)
/* postorder tree traversal */
{
AB/C*D*E+
if (ptr) {
postorder(ptr->left_child);
postdorder(ptr->right_child);
printf(“%d”, ptr->data);
}
173
}
Iterative Inorder Traversal
(using stack)
void iter_inorder(tree_pointer node)
{
int top= -1; /* initialize stack */
tree_pointer stack[MAX_STACK_SIZE];
for (;;) {
for (; node; node=node->left_child)
add(&top, node);/* add to stack */
node= delete(&top);
/* delete from stack */
if (!node) break; /* empty stack */
printf(“%D”, node->data);
node = node->right_child;
}
} O(n) 174
Trace Operations of Inorder Traversal
Call of inorder Value in root Action Call of inorder Value in root Action
1 + 11 C
2 * 12 NULL
3 * 11 C printf
4 / 13 NULL
5 A 2 * printf
6 NULL 14 D
5 A printf 15 NULL
7 NULL 14 D printf
4 / printf 16 NULL
8 B 1 + printf
9 NULL 17 E
8 B printf 18 NULL
10 NULL 17 E printf
3 * printf 19 NULL
175
Level Order Traversal
(using queue)
176
if (ptr) {
printf(“%d”, ptr->data);
if (ptr->left_child)
addq(front, &rear,
ptr->left_child);
if (ptr->right_child)
addq(front, &rear,
ptr->right_child);
}
else break;
} +*E*D/CAB
}
177
Copying Binary Trees
tree_poointer copy(tree_pointer original)
{
tree_pointer temp;
if (original) {
temp=(tree_pointer) malloc(sizeof(node));
if (IS_FULL(temp)) {
fprintf(stderr, “the memory is full\n”);
exit(1);
}
temp->left_child=copy(original->left_child);
temp->right_child=copy(original->right_child)
temp->data=original->data;
return temp;
} postorder
return NULL;
}
178
Post-order-eval function
179
case and: node->value =
node->right_child->value &&
node->left_child->value;
break;
case or: node->value =
node->right_child->value | |
node->left_child->value;
break;
case true: node->value = TRUE;
break;
case false: node->value = FALSE;
}
}
}
180
Threaded Binary Trees
Two many null pointers in current representation
of binary trees
n: number of nodes
number of non-null links: n-1
total links: 2n
null links: 2n-(n-1)=n+1
Replace these null pointers with some useful
“threads”.
181
Threaded Binary Trees (Continued)
If ptr->left_child is null,
replace it with a pointer to the node that would be
visited before ptr in an inorder traversal
If ptr->right_child is null,
replace it with a pointer to the node that would be
visited after ptr in an inorder traversal
182
A Threaded Binary Tree
root A
dangling
B C
dangling D E F G
inorder traversal:
H I H, D, I, B, E, A, F, C, G
183
Data Structures for Threaded BT
left_thread left_child data right_child right_thread
TRUE FALSE
root --
f f
f A f
f B f f C f
f D f t E t t F t t G
t H t t I t
185
Next Node in Threaded BT
threaded_pointer insucc(threaded_pointer
tree)
{
threaded_pointer temp;
temp = tree->right_child;
if (!tree->right_thread)
while (!temp->left_thread)
temp = temp->left_child;
return temp;
} 186
Inorder Traversal of Threaded BT
void tinorder(threaded_pointer tree)
{
/* traverse the threaded binary tree
inorder */
threaded_pointer temp = tree;
for (;;) {
temp = insucc(temp);
if (temp==tree) break;
printf(“%3c”, temp->data);
}
O(n)(timecomplexity)
} 187
Inserting Nodes into Threaded BTs
Insert child as the right child of node parent
– change parent->right_thread to FALSE
– set child->left_thread and child->right_thread
to TRUE
– set child->left_child to point to parent
– set child->right_child to parent->right_child
– change parent->right_child to point to child
188
Examples
Insert a node D as a right child of B.
root root
A A
(1)
B parent B parent
(3)
child child
C D C D
(2)
empty
189
*Figure 5.24: Insertion of child as a right child of parent in a threaded binary tree (p.217)
(3)
(2) (1)
(4)
nonempty
190
Right Insertion in Threaded BTs
void insert_right(threaded_pointer parent,
threaded_pointer child)
{
threaded_pointer temp;
(1) child->right_child = parent->right_child;
child->right_thread = parent->right_thread;
child->left_child = parent; case (a)
(2) child->left_thread = TRUE;
parent->right_child = child;
(3) parent->right_thread = FALSE;
if (!child->right_thread) { case (b)
(4) temp = insucc(child);
temp->left_child = child;
}
} 191
Heap
A max tree is a tree in which the key value in
each node is no smaller than the key values in
its children. A max heap is a complete binary
tree that is also a max tree.
A min tree is a tree in which the key value in
each node is no larger than the key values in
its children. A min heap is a complete binary
tree that is also a min tree.
Operations on heaps
– creation of an empty heap
– insertion of a new element into the heap;
192
– deletion of the largest element from the heap
Sample max heaps
Property:
The root of max heap contains
the largest .
193
Sample min heaps
Property:
The root of min heap contains
the smallest.
194
ADT for Max Heap
structure MaxHeap
objects: a complete binary tree of n > 0 elements organized so that
the value in each node is at least as large as those in its children
functions:
for all heap belong to MaxHeap, item belong to Element, n,
max_size belong to integer
MaxHeap Create(max_size)::= create an empty heap that can
hold a maximum of max_size elements
Boolean HeapFull(heap, n)::= if (n==max_size) return TRUE
else return FALSE
MaxHeap Insert(heap, item, n)::= if (!HeapFull(heap,n)) insert
item into heap and return the resulting heap
else return error
Boolean HeapEmpty(heap, n)::= if (n>0) return FALSE
else return TRUE
Element Delete(heap,n)::= if (!HeapEmpty(heap,n)) return one
instance of the largest element in the heap
and remove it from the heap
else return error 195
Example of Insertion to Max Heap
20 20 21
15 2 15 5 15 20
14 10 14 10 2 14 10 2
initial location of new node insert 5 into heap insert 21 into heap
196
Insertion into a Max Heap
void insert_max_heap(element item, int *n)
{
int i;
if (HEAP_FULL(*n)) {
fprintf(stderr, “the heap is full.\n”);
exit(1);
}
i = ++(*n);
while ((i!=1)&&(item.key>heap[i/2].key)) {
heap[i] = heap[i/2];
i /= 2; 2k-1=n ==> k=log2(n+1)
}
heap[i]= item; O(log2n)
} 197
Example of Deletion from Max Heap
remove
20 10 15
15 2 15 2 14 2
14 10 14 10
198
Deletion from a Max Heap
element delete_max_heap(int *n)
{
int parent, child;
element item, temp;
if (HEAP_EMPTY(*n)) {
fprintf(stderr, “The heap is empty\n”);
exit(1);
}
/* save value of the element with the
highest key */
item = heap[1];
/* use last element in heap to adjust heap
temp = heap[(*n)--];
parent = 1;
child = 2;
199
while (child <= *n) {
/* find the larger child of the current
parent */
if ((child < *n)&&
(heap[child].key<heap[child+1].key))
child++;
if (temp.key >= heap[child].key) break;
/* move to the next lower level */
heap[parent] = heap[child];
child *= 2;
}
heap[parent] = temp;
return item;
}
200
Graphs
201
What is a graph?
• A data structure that consists of a set of nodes
(vertices) and a set of edges that relate the nodes
to each other
• The set of edges describes relationships among
the vertices
202
Formal definition of graphs
• A graph G is defined as follows:
G=(V,E)
V(G): a finite, nonempty set of vertices
E(G): a set of edges (pairs of vertices)
203
Directed vs. undirected graphs
204
Directed vs. undirected graphs (cont.)
206
Graph terminology
• Adjacent nodes: two nodes are adjacent if
they are connected by an edge
5 is adjacent to 7
7 is adjacent from 5
207
Graph terminology (cont.)
• What is the number of edges in a complete
directed graph with N vertices?
N * (N-1)
2
O( N )
208
Graph terminology (cont.)
• What is the number of edges in a complete
undirected graph with N vertices?
N * (N-1) / 2
2
O( N )
209
Graph terminology (cont.)
• Weighted graph: a graph in which each edge
carries a value
210
Graph implementation
• Array-based implementation
– A 1D array is used to represent the vertices
– A 2D array (adjacency matrix) is used to
represent the edges
211
Array-based implementation
212
Graph implementation (cont.)
• Linked-list implementation
– A 1D array is used to represent the vertices
– A list is used for each vertex v which contains the
vertices which are adjacent from v (adjacency list)
213
Linked-list implementation
214
Adjacency matrix vs. adjacency list
representation
• Adjacency matrix
– Good for dense graphs --|E|~O(|V|2)
– Memory requirements: O(|V| + |E| ) = O(|V|2 )
– Connectivity between two vertices can be tested
quickly
• Adjacency list
– Good for sparse graphs -- |E|~O(|V|)
– Memory requirements: O(|V| + |E|)=O(|V|)
– Vertices adjacent to another vertex can be found
quickly
215
Depth-First-Search (DFS)
• What is the idea behind DFS?
– Travel as far as you can down a path
– Back up as little as possible when you reach a
"dead end" (i.e., next vertex has been "marked"
or there is no next vertex)
• DFS can be implemented efficiently using a
stack
216
Depth-First-Search (DFS) (cont.)
Set found to false
stack.Push(startVertex)
DO
stack.Pop(vertex)
IF vertex == endVertex
Set found to true
ELSE
Push all adjacent vertices onto stack
WHILE !stack.IsEmpty() AND !found
IF(!found)
Write "Path does not exist"
217
start end
(initialization)
218
219
220
template <class ItemType>
void DepthFirstSearch(GraphType<VertexType> graph, VertexType
startVertex, VertexType endVertex)
{
StackType<VertexType> stack;
QueType<VertexType> vertexQ;
bool found = false;
VertexType vertex;
VertexType item;
graph.ClearMarks();
stack.Push(startVertex);
do {
stack.Pop(vertex);
if(vertex == endVertex)
found = true;
(continues)
221
else {
if(!graph.IsMarked(vertex)) {
graph.MarkVertex(vertex);
graph.GetToVertices(vertex, vertexQ);
while(!vertexQ.IsEmpty()) {
vertexQ.Dequeue(item);
if(!graph.IsMarked(item))
stack.Push(item);
}
}
} while(!stack.IsEmpty() && !found);
if(!found)
cout << "Path not found" << endl;
}
(continues)
222
template<class VertexType>
void GraphType<VertexType>::GetToVertices(VertexType vertex,
QueTye<VertexType>& adjvertexQ)
{
int fromIndex;
int toIndex;
223
Breadth-First-Searching (BFS)
• What is the idea behind BFS?
– Look at all possible paths at the same depth
before you go at a deeper level
– Back up as far as possible when you reach a
"dead end" (i.e., next vertex has been
"marked" or there is no next vertex)
224
Breadth-First-Searching (BFS) (cont.)
• BFS can be implemented efficiently using a queue
IF(!found)
Set found to false
Write "Path does not exist"
queue.Enqueue(startVertex)
DO
queue.Dequeue(vertex)
IF vertex == endVertex
Set found to true
ELSE
Enqueue all adjacent vertices onto queue
WHILE !queue.IsEmpty() AND !found
225
start end
(initialization)
226
next:
227
228
template<class VertexType>
void BreadthFirtsSearch(GraphType<VertexType> graph,
VertexType startVertex, VertexType endVertex);
{
QueType<VertexType> queue;
QueType<VertexType> vertexQ;//
graph.ClearMarks();
queue.Enqueue(startVertex);
do {
queue.Dequeue(vertex);
if(vertex == endVertex)
found = true;
(continues)
229
else {
if(!graph.IsMarked(vertex)) {
graph.MarkVertex(vertex);
graph.GetToVertices(vertex, vertexQ);
while(!vertxQ.IsEmpty()) {
vertexQ.Dequeue(item);
if(!graph.IsMarked(item))
queue.Enqueue(item);
}
}
}
} while (!queue.IsEmpty() && !found);
if(!found)
cout << "Path not found" << endl;
}
230
Single-source shortest-path problem
• There are multiple paths from a source
vertex to a destination vertex
• Shortest path: the path whose total weight
(i.e., sum of edge weights) is minimum
• Examples:
– Austin->Houston->Atlanta->Washington: 1560
miles
– Austin->Dallas->Denver->Atlanta->Washington:
2980 miles
231
Single-source shortest-path problem
(cont.)
• Common algorithms: Dijkstra's algorithm,
Bellman-Ford algorithm
• BFS can be used to solve the shortest graph
problem when the graph is weightless or all
the weights are the same
(mark vertices before Enqueue)
232
UNIT-IV
Topics:
Searching- Linear Search, Binary Search, Static
Hashing-Introduction, hash tables, hash
functions, Overflow Handling.
Sorting-Insertion Sort, Selection Sort, Radix
Sort, Quick sort, Heap Sort, Comparison of
Sorting methods.
233
Sequential Search
O (n)
for(int i=0;i<n;i++){
if(x[i]==item) return true;
else return false;
}
return false;
}
17 23 5 11 2 29 3
It is known that
left + right
mid =
2
• Disadvantages:
– Requires that array elements be sorted
Concept of Hashing
• In CS, a hash table, or a hash map, is a data
structure that associates keys (names) with
values (attributes).
– Look-Up Table
– Dictionary
– Cache
– Extended Array
Example
1
. . .
. . .
. . .
b-1
. . .
Data Structure for Hash Table
#define MAX_CHAR 10
#define TABLE_SIZE 13
typedef struct {
char key[MAX_CHAR];
/* other fields */
} element;
element hash_table[TABLE_SIZE];
Some Issues
• Choice of hash function.
– Really tricky!
– To avoid collision (two different pairs are
in the same the same bucket.)
– Size (number of buckets) of hash table.
• Overflow handling method.
– Overflow: there is no space in the bucket
for the new pair.
Example (fig 8.1)
Slot 0 Slot 1
synonyms: 0 acos atan synonyms
char, ceil, 1
clock, ctime
2 char ceil synonyms
3 define
4 exp
overflow
5 float floor
6
…
25
Choice of Hash Function
• Requirements
– easy to compute
– minimal number of collisions
• If a hashing function groups key values
together, this is called clustering of the keys.
• A good hashing function distributes the key
values uniformly throughout the range.
Some hash functions
• Middle of square
– H(x):= return middle digits of x^2
• Division
– H(x):= return x % k
• Multiplicative:
– H(x):= return the first few digits of the
fractional part of x*k, where k is a fraction.
Some hash functions II
• Folding:
– Partition the identifier x into several parts, and add the parts
together to obtain the hash address
– e.g. x=12320324111220; partition x into 123,203,241,112,20;
then return the address 123+203+241+112+20=699
– Shift folding vs. folding at the boundaries
• Digit analysis:
– If all the keys have been known in advance, then we could delete
the digits of keys having the most skewed distributions, and use
the rest digits as hash address.
Overflow Handling
• An overflow occurs when the home bucket
for a new pair (key, element) is full.
• We may handle overflows by:
– Search the hash table in some systematic
fashion for a bucket that is not full.
•.
• Linear probing (linear open addressing).
• Quadratic probing.
• Random probing.
– Eliminate overflows by permitting each
bucket to keep a list of all pairs for which it
is the home bucket.
• Array linear list.
• Chain
Linear probing (linear open
addressing)
• Open addressing ensures that all elements
are stored directly into the hash table, thus
it attempts to resolve collisions using various
methods.
0 4 8 12 16
34 0 45 6 23 7 28 12 29 11 30 33
• Delete(0)
0 4 8 12 16
34 45 6 23 7 28 12 29 11 30 33
0 4 8 12 16
34 45 6 23 7 28 12 29 11 30 33
Linear Probing – Delete(34)
0 4 8 12 16
34 0 45 6 23 7 28 12 29 11 30 33
0 4 8 12 16
0 45 6 23 7 28 12 29 11 30 33
0 4 8 12 16
0 45 6 23 7 28 12 29 11 30 33
0 4 8 12 16
0 45 6 23 7 28 12 29 11 30 33
Linear Probing – Delete(29)
0 4 8 12 16
34 0 45 6 23 7 28 12 29 11 30 33
0 4 8 12 16
34 0 45 6 23 7 28 12 11 30 33
0 4 8 12 16
34 0 45 6 23 7 28 12 11 30 33
0 4 8 12 16
34 0 45 6 23 7 28 12 11 30 33
0 4 8 12 16
34 0 6 23 7 28 12 11 30 45 33
Performance Of Linear Probing
0 4 8 12 16
34 0 45 6 23 7 28 12 29 11 30 33
A={3162134590}
A={0112334569}
Some Definitions
• Internal Sort
– The data to be sorted is all stored in the
computer’s main memory.
• External Sort
– Some of the data to be sorted might be stored
in some external, slower, device.
• In Place Sort
– The amount of extra space required to sort the
data is constant with the input size.
280
Types of Sorting Algorithms
● Merge Sort
●Quick Sort
● Shell Sort
Insertion Sort
• Idea: like sorting a hand of playing cards
– Start with an empty left hand and the cards
facing down on the table.
– Remove one card at a time from the table,
and insert it into the correct position in the
left hand
282
• compare it with each of the cards already
in the hand, from right to left
– The cards held in the left hand are sorted
• these cards were originally the top cards
of the pile on the table
Insertion Sort
To insert 12, we need to
make room for it by
moving first 36 and
then 24.
284
Insertion Sort
285
Insertion Sort
286
Insertion Sort
input array
5 2 4 6 1 3
sorted unsorted
287
Insertion Sort
288
Insertion Sort: Analysis
• Running time analysis:
– Worst case: O(N2)
– Best case: O(N)
Selection Sort: Idea
1. We have two group of items:
– sorted group, and
– unsorted group
2. Initially, all items are in the unsorted group.
The sorted group is empty.
– We assume that items in the unsorted group
unsorted.
– We have to keep items in the sorted group
sorted.
Selection Sort: Cont’d
1. Select the “best” (eg. smallest) item from the
unsorted group, then put the “best” item at
the end of the sorted group.
2. Repeat the process until the unsorted group
becomes empty.
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 6 2
Largest
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Comparison
Data Movement
Sorted
Selection Sort
5 1 3 4 2 6
Largest
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Largest
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Largest
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
2 1 3 4 5 6
Largest
Comparison
Data Movement
Sorted
Selection Sort
1 2 3 4 5 6
Comparison
Data Movement
Sorted
Selection Sort
1 2 3 4 5 6
DONE!
Comparison
Data Movement
Sorted
Selection Sort: Example
40 2 1 43 3 65 0 -1 58 3 42 4
40 2 1 43 3 4 0 -1 58 3 42 65
40 2 1 43 3 4 0 -1 42 3 58 65
40 2 1 3 3 4 0 -1 42 43 58 65
Selection Sort: Example
40 2 1 3 3 4 0 -1 42 43 58 65
-1 2 1 3 3 4 0 40 42 43 58 65
-1 2 1 3 3 0 4 40 42 43 58 65
-1 2 1 0 3 3 4 40 42 43 58 65
Selection Sort: Example
-1 2 1 0 3 3 4 40 42 43 58 65
-1 0 1 2 3 3 4 40 42 43 58 65
-1 0 1 2 3 3 4 40 42 43 58 65
-1 0 1 2 3 3 4 40 42 43 58 65
-1 0 1 2 3 3 4 40 42 43 58 65
Selection Sort: Analysis
• Running time:
– Worst case: O(N2)
– Best case: O(N2)
Radix Sort
• This sort is unusual because it does not
directly compare any of the elements
332
Radix Sort
• Assuming decimal elements and 10
buckets, we would put the elements into
the bucket associated with its units digit
333
Radix Sort
• On the second pass, we separate the
elements based on the “tens” digit, and on
the third pass we separate them based on
the “hundreds” digit
334
Radix Sort Example
335
Radix Sort Example (continued)
336
Radix Sort Example (continued)
The unit and tens digits are already in order
337
The Algorithm to sort a set of numeric
keys
# of digits of the longest key
end for
338
Radix Sort Analysis
• Each element is examined once for each of
the digits it contains, so if the elements
have at most M digits and there are N
elements this algorithm has order O(M*N)
• This means that sorting is linear based on
the number of elements
• Why then isn’t this the only sorting
algorithm used?
339
Radix Sort Analysis
• Though this is a very time efficient
algorithm it is not space efficient
• If an array is used for the buckets and we
have B buckets, we would need N*B extra
memory locations because it’s possible for
all of the elements to wind up in one
bucket
• If linked lists are used for the buckets you
have the overhead of pointers
340
Radix Sort
• Radix is the base of a number system or
logarithm.
• Radix sort is a multiple pass distribution sort.
– It distributes each item to a bucket
according to part of the item's key.
– After each pass, items are collected from
the buckets, keeping the items in order,
then redistributed according to the next
most significant part of the key.
341
• This sorts keys digit-by-digit (hence referred to
as digital sort), or, if the keys are strings that
we want to sort alphabetically, it sorts
character-by-character.
• It was used in card-sorting machines.
351
– If we are sorting strings, we would create a
bucket for ‘a’,’b’,’c’ upto ‘z’.
– After the first pass, strings are roughly
sorted in that any two strings that begin
with different letters are in the correct
order.
– If a bucket has more than one string, its
elements are recursively sorted (sorting into
buckets by the next most significant
character).
– Contents of buckets are concatenated.
• The differences between LSD and MSD radix
sorts are
– In MSD, if we know the minimum number
of characters needed to distinguish all the
strings, we can only sort these number of
characters. So, if the strings are long, but
we can distinguish them all by just looking
at the first three characters, then we can
sort 3 instead of the length of the keys.
Classification of Radix Sort…contd
12 42 44 41 34 11 32 23 87 50 77 58 08
Input is an array of 15 integers. For integers, the number of buckets is 10, from 0 to 9.
The first pass distributes the keys into buckets by the least significant digit (LSD). When
the first pass is done, we have the following.
0 1 2 3 4 5 6 7 8 9
50 41 12 23 87 58
11 42 44 77 08
34
32
357
Example of LSD-Radix Sort…contd
50 41 11 12 42 32 23 44 34 87 77 58 08
Now we distribute by the next most significant digit, which is the highest digit in our example,
and we get the following.
0 1 2 3 4 5 6 7 8 9
08 11 23 41 50 77 87
12 32 42 58
44
34
08 11 12 23 32 34 41 42 44 50 58 77 87
358
Advantages and Disadvantages
• Advantages
– Radix and bucket sorts are stable,
preserving existing order of equal keys.
– They work in linear time, unlike most other
sorts. In other words, they do not bog down
when large numbers of items need to be
sorted. Most sorts run in O(n log n) or
O(n^2) time.
– The time to sort per item is constant, as no
comparisons among items are made. With
other sorts, the time to sort per time 359
increases with the number of items.
– Radix sort is particularly efficient when you
have large numbers of records to sort with
short keys.
• Drawbacks
– Radix and bucket sorts do not work well
when keys are very long, as the total sorting
time is proportional to key length and to the
number of items to sort.
– They are not “in-place”, using more working
memory than a traditional sort.
Quicksort Concept
• Basic Concept: divide and conquer
• Select a pivot and split the data into two
groups: (< pivot) and (> pivot):
Step 3, pivot
If left element belongs
to LEFT group, then increment 26 33 35 29 19 12 22
left index.
Step 4: pivot
Element 33 belongs 26 33 35 29 19 12 22
to RIGHT group.
left right
Element 22 belongs
to LEFT group.
left right
Quicksort Step 5
Step 5: pivot
Step 6: pivot
Element 35 belongs 26 22 35 29 19 12 33
to RIGHT group.
Exchange, pivot
increment left, and
decrement right. 26 22 12 29 19 35 33
left right
Quicksort Step 7
Step 7: pivot
Element 29 belongs 26 22 12 29 19 35 33
to RIGHT.
left right
Element 19 belongs
to LEFT.
Exchange, pivot
increment left,
decrement right. 26 22 12 19 29 35 33
right left
Quicksort Step 8
Step 8: pivot
When the left and right
markers pass each other, 26 22 12 19 29 35 33
we are done with the
partition task. right left
26
19 22 12 29 35 33
LEFT RIGHT
Quicksort Step 9
previous pivot
Step 9:
Apply Quicksort 26
Quicksort Quicksort
to the LEFT and
RIGHT groups, 19 22 12 29 35 33
recursively.
pivot pivot
12 19 22 26 29 33 35
Quicksort Efficiency
Step 3, pivot
If left element belongs
to LEFT group, then increment 26 33 35 29 19 12 22
left index.
Step 4: pivot
Element 33 belongs 26 33 35 29 19 12 22
to RIGHT group.
left right
Element 22 belongs
to LEFT group.
left right
Quicksort Step 5
Step 5: pivot
Step 6: pivot
Element 35 belongs 26 22 35 29 19 12 33
to RIGHT group.
Exchange, pivot
increment left, and
decrement right. 26 22 12 29 19 35 33
left right
Quicksort Step 7
Step 7: pivot
Element 29 belongs 26 22 12 29 19 35 33
to RIGHT.
left right
Element 19 belongs
to LEFT.
Exchange, pivot
increment left,
decrement right. 26 22 12 19 29 35 33
right left
Quicksort Step 8
Step 8: pivot
When the left and right
markers pass each other, 26 22 12 19 29 35 33
we are done with the
partition task. right left
26
19 22 12 29 35 33
LEFT RIGHT
Quicksort Step 9
previous pivot
Step 9:
Apply Quicksort 26
Quicksort Quicksort
to the LEFT and
RIGHT groups, 19 22 12 29 35 33
recursively.
pivot pivot
12 19 22 26 29 33 35
Quicksort Efficiency
The partitioning of an array into two parts is O(n)
PARENT (i)
return floor(i/2)
LEFT (i)
return 2i
RIGHT (i)
return 2i + 1
Heap order property
• For every node v, other than the root, the
key stored in v is greater or equal (smaller
or equal for max heap) than the key
stored in the parent of v.
12 16
1 4 7
19 12 16 1 4 7
Array A
Min heap example
1
4 16
7 12 19
1 4 16 7 12 19
Array A
Insertion
• Algorithm
1. Add the new element to the next available position at the
lowest level
2. Restore the max-heap property if violated
• General strategy is percolate up (or bubble up):
if the parent of the element is smaller than the
element, then interchange the parent and child.
OR
12 16 12 16
4 7 1 4 7 17
1
Insert 17
19
12 17
swap
1 4 7 16
• Delete min
– Copy the last number to the root ( overwrite the
minimum element stored there ).
– Restore the min heap property by percolate
down.
Heap Sort
A sorting algorithm that works by first
organizing the data to be sorted into a
special type of binary tree called a
heap
Procedures on Heap
• Heapify
• Build Heap
• Heap Sort
Heapify
• Heapify picks the largest child key and compare it to the parent
key. If parent key is larger than heapify quits, otherwise it swaps
the parent key with the largest child key. So that the parent is now
becomes larger than its children.
Heapify(A, i)
{
l left(i)
r right(i)
if l <= heapsize[A] and A[l] > A[i]
then largest l
else largest i
if r <= heapsize[A] and A[r] > A[largest]
then largest r
if largest != i
then swap A[i] A[largest]
Heapify(A, largest)
}
BUILD HEAP
• We can use the procedure 'Heapify' in a bottom-up fashion to
convert an array A[1 . . n] into a heap. Since the elements in the
subarray A[n/2 +1 . . n] are all leaves, the procedure BUILD_HEAP
goes through the remaining nodes of the tree and runs 'Heapify'
on each one. The bottom-up order of processing node guarantees
that the subtree rooted at children are heap before 'Heapify' is run
at their parent.
Buildheap(A)
{
heapsize[A] length[A]
for i |length[A]/2 //down to 1
do Heapify(A, i)
}
Heap Sort Algorithm
• The heap sort algorithm starts by using procedure BUILD-HEAP to
build a heap on the input array A[1 . . n]. Since the maximum
element of the array stored at the root A[1], it can be put into its
correct final position by exchanging it with A[n] (the last element in
A). If we now discard node n from the heap than the remaining
elements can be made into heap. Note that the new element at
the root may violate the heap property. All that is needed to
restore the heap property.
Heapsort(A)
{
Buildheap(A)
for i length[A] //down to 2
do swap A[1] A[i]
heapsize[A] heapsize[A] - 1
Heapify(A, 1)
}
Example: Convert the following array to a heap
16 4 7 1 12 19
16
4 7
1 12 19
16 16
4 7 4 19
swap
12 19 1 12 7
1
16 19
swap
12 19 12 16
swap
4 7 1 4 7
1
Heap Sort
• The heapsort algorithm consists of two phases:
- build a heap from an arbitrary array
- use the heap to sort the data
19
12 16
1 4 7
Example of Heap Sort
Take out biggest
19
12 16
Move the last element
to the root
1 4 7
Sorted:
Array A
12 16 1 4 7 19
7
swap
HEAPIFY()
12 16
1 4
Sorted:
Array A
7 12 16 1 4 19
16
12 7
1 4
Sorted:
Array A
16 12 7 1 4 19
Take out biggest
16
Move the last element
to the root
12 7
1 4
Sorted:
Array A
12 7 1 4 16 19
4
12 7
Sorted:
Array A
4 12 7 1 16 19
swap 4
HEAPIFY()
12 7
Sorted:
Array A
4 12 7 1 16 19
12
4 7
Sorted:
Array A
12 4 7 1 16 19
Take out biggest
12
Move the last
element to the
root 4 7
Sorted:
Array A
4 7 1 12 16 19
1
swap
4 7
Sorted:
Array A
1 4 7 12 16 19
7
4 1
Sorted:
Array A
7 4 1 12 16 19
Take out biggest
7
Move the last
element to the
4 1 root
Sorted:
Array A
1 4 7 12 16 19
swap 1
HEAPIFY()
4
Sorted:
Array A
4 1 7 12 16 19
Take out biggest
Move the last 4
element to the
root
1
Sorted:
Array A
1 4 7 12 16 19
Take out biggest
1
Sorted:
Array A
1 4 7 12 16 19
Sorted:
1 4 7 12 16 19
Time Analysis
• Build Heap Algorithm will run in O(n) time
• There are n-1 calls to Heapify each call
requires O(log n) time
• Heap sort program combine Build Heap
program and Heapify, therefore it has the
running time of O(n log n) time
• Total time complexity: O(n log n)
Comparison of Sorting Methods
UNIT-V
Topics:
• Search Trees-Binary Search Trees, Definition,
Operations- Searching, Insertion and Deletion, AVL
Trees-Definition and Examples, Insertion into an AVL
Tree ,B-Trees, Definition, B-Tree of order m, operations-
Insertion and Searching, Introduction to Red-Black and
Splay Trees(Elementary treatment-only Definitions and
Examples),Comparison of Search Trees.
Pattern matching algorithm- The Knuth-Morris-Pratt
algorithm, Tries (examples only).
418
Comparision Between Binary Tree &
Binary Search Tree
* A binary search tree is a binary
tree in which it has atmost two
children, the key values in the left
node is less than the root and the
key values in the right node is
greater than the root.
* It doesn't have any order.
Note : * Every binary search tree is
a binary tree.
* All binary trees need not be a
Example of Binary Search Tree
Struct TreeNode
{
int Element ;
SearchTree Left;
SearchTree Right;
};
BST Operations
426
Find : -
30 30
Delete operation:
• Deletion operation is the complex operation in the
Binary search tree. To delete an element,
consider the following three possibilities.
• CASE 1 Node with no children (Leaf node)
If the node is a leaf node, it can be deleted
immediately.
• CASE 2 : - Node with one child
If the node has one child, it can be deleted by
adjustingits parent pointer that points to its child
node
• Case 3 : Node with two children
It is difficult to delete a node which has two
children. The general strategy is to replace the
data of the node to be deleted with its smallest
data of the right subtree and recursively delete
that node.
DELETION ROUTINE FOR BINARY
SEARCH TREES
SearchTree Delete (int X, searchTree T)
{
int Tmpcell ;
if (T = = NULL)
Error ("Element not found");
else
if (X < T →Element) // Traverse towards left
T →Left = Delete (X, T Left);
else
if (X > T Element) // Traverse towards right
T →Right = Delete (X, T →Right);
// Found Element tobe deleted
else // Two children
if (T→ Left && T→ Right)
{ // Replace with smallest data in right subtree
Tmpcell = FindMin (T→ Right);
T →Element = Tmpcell Element ;
T →Right = Delete (T →Element; T →Right);
}
else {// one or zero children
Tmpcell = T;
if (T →Left = = NULL)
T = T→ Right;
else if (T→ Right = = NULL)
T = T →Left ;
free (TmpCell);
}
return T; }
Delete node from BST
Delete node from BST (continued)
27 27
27 27
AVL Trees
7
1 0
1 1 22 62
3 12
-1 1
0
0 0 95
0 5 44
2 10 20
0 0
0 0
11 51 97
9
Not an AVL TREE
1
100
1
2
150
70
-1 0
-1
0
30
130 180
80
0 1
0
10 40
140
0
36
Inserting into an AVL Search Trees
• If we insert an element into an AVL search tree, the result may not
be an AVL tree
• That is, the tree may become unbalanced
• If the tree becomes unbalanced, we must adjust the tree to
restore balance - this adjustment is called rotation.
• There are Four Models of rotations:
• There are four models about the operation of AVL Tree:
1. LL: new node is in the left subtree of the left subtree of A
2. LR: new node is in the right subtree of the left subtree of A
3. RR: new node is in the right subtree of the right subtree of A
4. RL: new node is in the left subtree of the right subtree of A
Rotation
Definition
• To switch children and parents among two or
three adjacent nodes to restore balance of a
tree.
• A rotation may change the depth of some
nodes, but does not change their relative
ordering.
Single and Double Rotations
• Single rotations: the transformations done to correct LL and
RR imbalances
• Double rotations: the transformations done to correct LR
and RL imbalances
• The transformation to correct LR imbalance can be achieved
by an RR rotation followed by an LL rotation
• The transformation to correct RL imbalance can be achieved
by an LL rotation followed by an RR rotation
Left Rotation
Definition
• In a binary search tree, pushing a node A down and to the left
to balance the tree.
• A's right child replaces A, and the right child's left child
becomes A's right child.
A
9 15
Left Rotation
4 15 9 22
12 22 4 12
Right Rotation
Definition
• In a binary search tree, pushing a node A down and to the
right to balance the tree.
• A's left child replaces A, and the left child's right child
becomes A's left child.
A
15 9
Right Rotation
9 22 4 15
4 12 12 22
Single Rotation (LL)
• Let k2 be the first node on the path up violating AVL balance
property. Figure below is the only possible scenario that
allows k2 to satisfy the AVL property before the insertion but
violate it afterwards. Subtree X has grown an extra level (2
levels deeper than Z now). Y cannot be at the same level as X
(k2 then out of balance before insertion) and Y cannot be at
the same level as Z (then k1 would be the first to violate).
Single Rotation (RR)
• Note that in single rotation inorder traversal orders of
the nodes are preserved.
• The new height of the subtree is exactly the same as
before. Thus no further updating of the nodes on the
path to the root is needed.
Single Rotation-Example I
• AVL property destroyed by insertion of 6,
then fixed by a single rotation.
• BST node structure needs an additional
field for height.
Single Rotation-Example II
• Start with an initially empty tree and insert items 1
through 7 sequentially. Dashed line joins the two nodes
that are the subject of the rotation.
Single Rotation-Example III
Insert 6.
Balance
problem at the
root. So a
single rotation
is performed.
Finally, Insert
7 causing
another
rotation.
Double Rotation (LR, RL) - I
• The algorithm that works for cases 1 and 4 (LL, RR) does
not work for cases 2 and 3 (LR, RL). The problem is that
subtree Y is too deep, and a single rotation does not
make it any less deep.
• The fact that subtree Y has had an item inserted into it
guarantees that it is nonempty. Assume it has a root and
two subtrees.
Double Rotation (LR) - II
Below are 4 subtrees connected by 3 nodes. Note that exactly
one of tree B or C is 2 levels deeper than D (unless all empty). To
rebalance, k3 cannot be root and a rotation between k1 and k3
was shown not to work. So the only alternative is to place k2 as
the new root. This forces k1 to be k2’s left child and k3 to be its
right child. It also completely determines the locations of all 4
subtrees. AVL balance property is now satisfied. Old height of
the tree is restored; so, all the balancing and and height
updating is complete.
Double Rotation (RL) - III
In both cases (LR and RL), the effect is the same as rotating
between α’s child and grandchild and then between α and its
new child. Every double rotation can be modelled in terms of 2
single rotations. Inorder traversal orders are always preserved
between k1, k2, and k3.
4 12 12 22
examples
Inserting into an AVL Search Tree
-1 10
Insert(29)
1 7 1 40
0 3 0 8 1 30 45 -1
0 0 5 0
1 -1 20 0 35 60
0
• Where is 29 going to be inserted into? 25
- use the AVL-search-tree-insertion algorithm
in Figure 15.6) 29
• After the insertion, is the tree still an AVL
search tree? (i.e., still balanced?)
Inserting into an AVL Search Tree
-1 10
1 7 1 40
0 3 0 8 1 30 45 -1
0 0 5 0
1 20 0 35 60
-2
• What are the new balance factors for 20,
25, 29? 25 -1
• What type of imbalance do we have?
• RR imbalance new node is in the right 29 0
subtree of right subtree of node 20 (node
with bf = -2) what rotation do we need?
• What would the left subtree of 30 look like
after RR rotation?
After RR Rotation
-1 10
1 7 1 40
0 3 0 8 1 30 45 -1
0 1 0 5 0
0 25 0 35 60
0 0
20 29
• After the RR rotation, is the resulting tree an AVL search tree?
Deletion from an AVL Search Tree
Deletion procedure is more complex than insertion in 2 ways:
• 1)More number of cases for rebalancing may arise in
deletion;
• 2)In insertion there is only one reblancing,but in deletion
there can be as many rebalancing as the length of the path
from the deleted node to the root.
AVL Tree Example:
• Insert 14, 17, 11, 7, 53, 4, 13 into an empty AVL tree
14
11 17
7 53
4
AVL Tree Example:
• Insert 14, 17, 11, 7, 53, 4, 13 into an empty AVL tree
1
14
-1 -1
7 17
0 -1
4 11 53
13
AVL Tree Example:
• Now insert 12
14
7 17
-2
4 11 53
13
12
AVL Tree Example:
• Now insert 12
14
7 17
-2
4 11 53
12
13
AVL Tree Example:
• Now the AVL tree is balanced.
14
7 17
0
4 12 53
11 13
AVL Tree Example:
• Now insert 8
14
-2
7 17
4 12 53
11 13
8
AVL Tree Example:
• Now insert 8
14
-2
7 17
4 11 53
8 12
13
AVL Tree Example:
• Now the AVL tree is balanced.
14
11 17
7 12 53
4 8 13
AVL Tree Example:
• Now remove 53
14
11 17
7 12 53
4 8 13
AVL Tree Example:
• Now remove 53, unbalanced
-2
14
11 17
7 12
4 8 13
AVL Tree Example:
• Balanced! Remove 11
11
7 14
4 8 12 17
13
AVL Tree Example:
• Remove 11, replace it with the largest in its left branch
7 14
4 12 17
13
AVL Tree Example:
• Remove 8, unbalanced
4 14
12 17
13
AVL Tree Example:
• Remove 8, unbalanced
4 12
14
13 17
AVL Tree Example:
• Balanced!!
12
7 14
4 13 17
Exercise
• Build an AVL tree with the following values:
15, 20, 24, 10, 13, 7, 30, 36, 25
15, 20, 24, 10, 13, 7, 30, 36, 25
20
15
15 24
20
10
24
13
20 20
13 24 15 24
10 15 13
10
15, 20, 24, 10, 13, 7, 30, 36, 25
20
13
13 24 10 20
10 15 7 15 24
7 30
13 36
10 20
7 15 30
24 36
15, 20, 24, 10, 13, 7, 30, 36, 25
13 13
10 20 10 20
7 15 30 7 15 24
24 36 30
25 13 25 36
10 24
7 20 30
15 25 36
Remove 24 and 20 from the AVL tree.
13 13
10 24 10 20
7 20 30 7 15 30
15 25 36 25 36
13 13
10 30 10 15
7 15 36 7 30
25 25 36
B -TREE
B-tree of order n
• Every B-tree is of some "order n", meaning nodes
contain from n to 2n keys (so nodes are always at
least half full of keys), and n+1 to 2n+1 pointers,
and n can be any number.
• Keys are kept in sorted order within each node. A
corresponding list of pointers are effectively
interspersed between keys to indicate where to
search for a key if it isn't in the current node.
• A B-tree of order n is a multi-way search tree
with two properties:
• 1.All leaves are at the same level
• 2.The number of keys in any node lies
between n and 2n, with the possible
exception of the root which may have fewer
keys.
Other definition
A B-tree of order m is a m-way tree that satisfies the following
conditions.
• Every node has < m children.
• Every internal node (except the root) has <m/2 children.
• The root has >2 children.
• An internal node with k children contains (k-1) ordered keys.
The leftmost child contains keys less than or equal to the
first key in the node. The second child contains keys greater
than the first keys but less than or equal to the second key,
and so on.
B-tree of order n
• Every B-tree is of some "order n", meaning nodes
contain from n to 2n keys (so nodes are always at
least half full of keys), and n+1 to 2n+1 pointers,
and n can be any number.
• Keys are kept in sorted order within each node. A
corresponding list of pointers are effectively
interspersed between keys to indicate where to
search for a key if it isn't in the current node.
• A B-tree of order n is a multi-way search tree
with two properties:
• 1.All leaves are at the same level
• 2.The number of keys in any node lies
between n and 2n, with the possible
exception of the root which may have fewer
keys.
Other definition
A B-tree of order m is a m-way tree that satisfies the following
conditions.
• Every node has < m children.
• Every internal node (except the root) has <m/2 children.
• The root has >2 children.
• An internal node with k children contains (k-1) ordered keys.
The leftmost child contains keys less than or equal to the
first key in the node. The second child contains keys greater
than the first keys but less than or equal to the second key,
and so on.
A B-tree of order 2
• A multi-way (or m-way) search tree of order m is a tree in which
– Each node has at-most m subtrees, where the subtrees may be
empty.
– Each node consists of at least 1 and at most m-1 distinct keys
– The keys in each node are sorted.
T0 T1 T2 Tm-2 Tm-1
key < k1 k1 < key < k2 k2 < key < k3 km-2 < key < km-1 key > km-1
What is B-tree?
• B-tree of order m (or branching factor m), where m > 2, is either an
empty tree or a multiway search tree with the following
properties:
–The root is either a leaf or it has at least two non-empty
subtrees and at most m non-empty subtrees.
–Each non-leaf node, other than the root, has at least
m/2 non-empty subtrees and at most m non-empty
subtrees. (Note: x is the lowest integer > x ).
–The number of keys in each non-leaf node is one less
than the number of non-empty subtrees for that node.
–All leaf nodes are at the same level; that is the tree is
perfectly balanced
What is a B-tree?
• For a non-empty B-tree of order m:
Example: A B-tree of order 4
Note:
• The data references are not shown.
• The leaf references are to empty subtrees
Height of B-Trees
• B-Tree-Search(x, k)
– The search operation on a b-tree is similar to a search
on a binary tree. The B-Tree-search runs in time O(logt
n).
• B-Tree-Create(T)
–The B-Tree-Create operation creates an empty b-tree by
allocating a new root node that has no keys and is a leaf
node. Only the root node is permitted to have these
properties; all other nodes must meet the criteria
outlined previously. The B-Tree-Create operation runs in
time O(1).
Operations of B-Trees
• B-Tree-Split-Child(x, i, y)
–If is node becomes "too full," it is necessary to perform
a split operation. The split operation moves the median
key of node x into its parent y where x is the ith child of
y. A new node, z, is allocated, and all keys in x right of
the median key are moved to z. The keys left of the
median key remain in the original node x. The new
node, z, becomes the child immediately to the right of
the median key that was moved to the parent y, and the
original node, x, becomes the child immediately to the
left of the median key that was moved into the parent.
The B-Tree-Split-Child algorithm will run in time O(t) , T
is constrain
•
Operations
B-Tree-Insert(T, k)
of B-Trees
• B-Tree-Insert-Nonfull(x, k)
To perform an insertion on a b-tree, the appropriate
node for the key must be located using an algorithm
similiar to B-Tree-Search. Next, the key must be
inserted into the node.
If the node is not full prior to the insertion, no
special action is required; however, if the node is
full, the node must be split to make room for the
new key. Since splitting the node results in moving
one key to the parent node, the parent node must
not be full or another split operation is required.
This process may repeat all the way up to the root
and may require splitting the root node.
This approach requires two passes. The first pass
locates the node where the key should be inserted;
the second pass performs any required splits on the
ancestor nodes. runs in time O(t logt n)
OVERFLOW CONDITION:
A root-node or a non-root node of a B-tree of order m overflows if,
after a key insertion, it contains m keys.
Insertion algorithm:
Insertion in B-Trees
•
Insertion in B-Trees
Insertion in a B-tree of even order
• right-bias: The node is split such that its right subtree has more keys than the
left subtree.
• left-bias: The node is split such that its left subtree has more keys than the
right subtree.
• Example: Insert the key 5 in the following B-tree of order 4:
Insertion
• Example: target = 10
6 17
12 19 22
4
2 3 5 10 16 18 20 25
Deletion form a B-Tree
• 1. detete h, r :
• s promote s and
c f m r
• delete form leaf
a b d e g h i k l n p s t u x
g i t u x
Deletion (cont.)
• 2. delete p :
•
j
• t pull s down;
c f m s
• pull t up
a b d e g i k l n p t u x
n s
Deletion (cont.)
• 3. delete d:
j
• Combine: c f m t
k l n s u x
a b d e g i
Deletion (cont.)
• combine : j
m t
f
a b c e g i k l n s u x
f j m t
a b c e g i k l n s u x
Deleting from a B-Tree
Delete 140
• Case2: The leaf underflows and the adjacent right sibling has at least
m/2 keys. Deletion in B-Tree
• Example : B-tree of order 5
Delete 113
Deletion in B-Tree
• Case 3: The leaf underflows and the adjacent left sibling has at least m / 2 keys.
• Example : B-tree of order 5
Delete 135
An example B-Tree
26 A B-tree of order 5
containing 26 items
6 12
42 51 62
1 2 4 7 8 13 15 18 25
27 29 45 46 48 53 55 60 64 70 90
1 2 12 25
1 2 6 12 14 25 28
Constructing a B-tree (contd.)
Adding 17 to the right leaf node would over-fill it, so we take the
middle key, promote it (to the root) and split the leaf
8 17
1 2 6 12 14 25 28
1 2 6 7 12 14 16 25 28 48 52
Constructing a B-tree (contd.)
Adding 68 causes us to split the right most leaf, promoting 48 to the
root, and adding 3 causes us to split the left most leaf, promoting 3
to the root; 26, 29, 53, 55 then go into the leaves
3 8 17 48
1 2 6 7 12 14 16 25 26 28 29 52 53 55 68
17
3 8 28 48
1 2 6 7 12 14 16 25 26 29 45 52 53 55 68
Inserting into a B-Tree
• Attempt to insert the new key into a leaf
• If this would result in that leaf becoming too big, split
the leaf into two, promoting the middle key to the
leaf’s parent
• If this would result in the parent becoming too big, split
the parent into two, promoting the middle key
• This strategy might have to be repeated all the way to
the top
• If necessary, the root is split in two and the middle key
is promoted to a new root, making the tree one level
higher
Exercise in Inserting a B-Tree
• Insert the following keys to a 5-way B-tree:
• 3, 7, 9, 23, 45, 1, 5, 14, 25, 24, 13, 11, 8, 19, 4,
31, 35, 56
Removal from a B-tree
• During insertion, the key always goes into a leaf.
For deletion we wish to remove from a leaf.
There are three possible ways we can do this:
• 1 - If the key is already in a leaf node, and
removing it doesn’t cause that leaf node to have
too few keys, then simply remove the key to be
deleted.
• 2 - If the key is not in a leaf then it is guaranteed
(by the nature of a B-tree) that its predecessor or
successor will be in a leaf -- in this case we can
delete the key and promote the predecessor or
successor key to the non-leaf deleted key’s
position.
Removal from a B-tree (2)
• If (1) or (2) lead to a leaf node containing less than the
minimum number of keys then we have to look at the
siblings immediately adjacent to the leaf in question:
– 3: if one of them has more than the min. number of keys
then we can promote one of its keys to the parent and
take the parent key into our lacking leaf
– 4: if neither of them has more than the min. number of
keys then the lacking leaf and one of its neighbours can be
combined with their shared parent (the opposite of
promoting a key) and the new leaf will have the correct
number of keys; if this step leave the parent with too few
keys then we repeat the process up to the root itself, if
required
Type #1: Simple leaf deletion
Assuming a 5-way
B-Tree, as before... 12 29 52
2 7 9 15 22 31 43 56 69 72
12 29 56
52 Delete 52
7 9 15 22 31 43 56 69 72
12 29 56
7 9 15 22 31 43 69 72
Too few keys!
Delete 72
Type #4: Too few keys in node and its
siblings
12 29
7 9 15 22 31 43 56 69
Type #3: Enough siblings
12 29
Demote root key and
promote leaf key
7 9 15 22 31 43 56 69
Type #3: Enough siblings
12 31
7 9 15 29 43 56 69
Summary
• The B-tree is a tree-like structure that helps us to
organize data in an efficient way.
• The B-tree index is a technique used to minimize the disk
I/Os needed for the purpose of locating a row with a
given index key value.
• Because of its advantages, the B-tree and the B-tree
index structure are widely used in databases nowadays.
• In addition to its use in databases, the B-tree is also used
in file systems to allow quick random access to an
arbitrary block in a particular file. The basic problem is
turning the file block i address into a disk block.
MS/Dos - FAT (File allocation table)
Secondary Storages
Red-Black Trees
Red-Black Properties
The red-black properties:
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
Note: this means every “real” node has 2 children
3. If a node is red, both children are black
Note: can’t have 2 consecutive reds on a path
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees: An Example
5 9
12
12
Red-black properties:
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 8 7
■ Where does it go?
5 9
12
8 12
11
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 11 7
■ Where does it go?
5 9
■ What color?
○ Can’t be red! (#3) 8 12
11
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 11 7
■ Where does it go?
5 9
■ What color?
○ Can’t be red! (#3) 8 12
○ Can’t be black! (#4)
11
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 11 7
■ Where does it go?
5 9
■ What color?
○ Solution: 8 12
recolor the tree
11
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 10 7
■ Where does it go?
5 9
8 12
11
1. Every node is either red or black
2. Every leaf (NULL pointer) is black
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 10 7
■ Where does it go?
5 9
■ What color?
8 12
11
1. Every node is either red or black
2. Every leaf (NULL pointer) is black 10
3. If a node is red, both children are black
4. Every path from node to descendent leaf
contains the same number of black nodes
5. The root is always black
Red-Black Trees:
The Problem With Insertion
● Insert 10 7
■ Where does it go?
5 9
■ What color?
○ A: no color! Tree 8 12
is too imbalanced
11
○ Must change tree structure
to allow recoloring
10
■ Goal: restructure tree in
O(lg n) time
RB Trees: Rotation
y rightRotate(y) x
x C A y
leftRotate(x)
A B B C
● Does rotation preserve inorder key ordering?
● What would the code for rightRotate()
actually do?
RB Trees: Rotation
y x
rightRotate(y)
x C A y
A B B C
● Answer: A lot of pointer manipulation
■ x keeps its left child
■ y keeps its right child
■ x’s right child becomes y’s left child
■ x’s and y’s parents change
● What is the running time?
Rotation Example
5 9
8 12
11
Rotation Example
5 12
8 11
Example Red-Black Tree
Splay Trees
Splay trees are binary search trees (BSTs) that:
– Are not perfectly balanced all the time
– Allow search and insertion operations to try to balance the tree so
that future operations may run faster
15 After Search(12) 12
2
6 18 Splay idea: Get 12 6 15
up to the root
1
3 12 using rotations 3 9 14 18
9 14
After splaying with 12
Initial tree
• Not only splaying with 12 makes the tree balanced,
subsequent accesses for 12 will take O(1) time.
• Active (recently accessed) nodes will move towards the root
and inactive nodes will slowly move further from the root
605
Splay Tree Terminology
• Let X be a non-root node, i.e., has at least 1 ancestor.
• Let P be its parent node.
• Let G be its grandparent node (if it exists)
• Consider a path from G to X:
– Each time we go left, we say that we “zig”
– Each time we go right, we say that we “zag”
• There are 6 possible cases:
G G G G
P P P P P P
X X X X X X
1. zig 2. zig-zig 3. zig-zag 4. zag-zig 5. zag-zag 6. zag
606
Splay Tree Operations
• When node X is accessed, apply one of six
rotation operations:
– Single Rotations (X has a P but no G)
• zig, zag
607
Splay Trees: Zig Operation
• “Zig” is just a single rotation, as in an AVL tree
• Suppose 6 was the node that was accessed (e.g. using
Search)
15
6
Zig-Right
6 18 15
3
3 12 12 18
608
Splay Trees: Zig-Zig Operation
• “Zig-Zig” consists of two single rotations of the same type
• Suppose 3 was the node that was accessed (e.g., using Search)
15 3
Zig-Right 6
Zig-Right
6 18 1 6
3 15
4 15
3 12 1 4 12 18
1 4 12 18
609
Splay Trees: Zig-Zag Operation
• “Zig-Zag” consists of two rotations of the opposite type
• Suppose 12 was the node that was accessed (e.g., using Search)
15 Zag-Left 15 Zig-Right 12
6 18 12 18 6 15
3 10 14 18
3 12 6 14
10 14 3 10
610
Splay Trees: Zag-Zig Operation
• “Zag-Zig” consists of two rotations of the opposite type
• Suppose 17 was the node that was accessed (e.g., using Search)
15 15 Zag-Left 17
Zig-Right
6 20 6 15 20
17
6 16 18 30
17 30 16 20
18 30
16 18
15 Zag-Left 20 Zag-Left 30
15 30
6 20 20 40
6 17 25 40 15 25
17 30
6 17
25 40
612
Splay Trees: Zag Operation
• “Zag” is just a single rotation, as in an AVL tree
• Suppose 15 was the node that was accessed (e.g., using
Search)
6 15
Zag-Left
3 15 6 18
12 18 3 12
80
80 40
70 85
70 85 30 70
60 75 80
50
40 75
50 65 45 60 75 85
30 50
55 65
40 55 45 60
55 65
30 45
After Zig-zig
After Zig-zig
(a) (b) (c)
614
Splay Trees: Example – 60 is accessed
40 40
60
30 70 30 60 40 70
50 70
50 80 30 50 65 80
45 60 75 85 45 55 65 80
45 55 75 85
55 65 75 85
After Zig-zag
After zag
(a) (b) (c)
615
Splaying during other operations
• Splaying can be done not just after Search, but also after
other operations such as Insert/Delete.
616
Summary of Splay Trees
• Examples suggest that splaying causes tree to get balanced.
• This guarantees that even if the depths of some nodes get very large,
you cannot get a long sequence of O(N) searches because each search
operation causes a rebalance.
617
Comparison of Search Trees
String S a b c a b a a b c a b a c
Pattern p a b a a
Step 1:compare p[1] with S[1]
S a b c a b a a b c a b a c
p a b a a
p a b a a
Step 3: compare p[3] with S[3]
S
a b c a b a a b c a b a c
p a b a a
Mismatch occurs here..
Since mismatch is detected, shift ‘p’ one position to the right and
repeat matching procedure.
S a b c a b a ab c a b a c
p abaa
Finally, a match would be found after shifting ‘p’ three times to the right side.
Drawbacks of this approach: if ‘m’ is the length of pattern ‘p’ and ‘n’ the length of
string ‘S’, the matching time is of the order O(mn). This is a certainly a very slow
running algorithm.
What makes this approach so slow is the fact that elements of ‘S’ with which
comparisons had been performed earlier are involved again and again in
comparisons in some future iterations. For example: when mismatch is detected for
the first time in comparison of p[3] with S[3], pattern ‘p’ would be moved one
position to the right and matching procedure would resume from here. Here the first
comparison that would take place would be between p[0]=‘a’ and S[1]=‘b’. It should
be noted here that S[1]=‘b’ had been previously involved in a comparison in step 2.
this is a repetitive use of S[1] in another comparison.
It is these repetitive comparisons that lead to the runtime of O(mn).
The Knuth-Morris-Pratt Algorithm
Knuth, Morris and Pratt proposed a linear time
algorithm for the string matching problem.
A matching time of O(n) is achieved by avoiding
comparisons with elements of ‘S’ that have
previously been involved in comparison with
some element of the pattern ‘p’ to be
matched. i.e., backtracking on the string ‘S’
never occurs
Components of KMP algorithm
• The prefix function, Π
The prefix function,Π for a pattern encapsulates
knowledge about how the pattern matches against
shifts of itself. This information can be used to avoid
useless shifts of the pattern ‘p’. In other words, this
enables avoiding backtracking on the string ‘S’.
• The KMP Matcher
With string ‘S’, pattern ‘p’ and prefix function ‘Π’ as
inputs, finds the occurrence of ‘p’ in ‘S’ and returns
the number of shifts of ‘p’ after which occurrence is
found.
The prefix function, Π
Following pseudocode computes the prefix fucnction, Π:
Compute-Prefix-Function (p)
1 m length[p] //’p’ pattern to be matched
2 Π[1] 0
3 k0
4 for q 2 to m
5 do while k > 0 and p[k+1] != p[q]
6 do k Π[k]
7 If p[k+1] = p[q]
8 then k k +1
9 Π[q] k
10 return Π
Example: compute Π for the pattern ‘p’ below:
p a b a b a c a
Initially: m = length[p] = 7
Π[1] = 0
k=0
Step 1: q = 2, k=0 q 1 2 3 4 5 6 7
Π[2] = 0 p a b a b a c a
Π 0 0
Step 2: q = 3, k = 0, q 1 2 3 4 5 6 7
Π[3] = 1
p a b a b a c a
Π 0 0 1
Step 3: q = 4, k = 1 q 1 2 3 4 5 6 7
Π[4] = 2
p a b a b a c A
Π 0 0 1 2
Step 4: q = 5, k =2 q 1 2 3 4 5 6 7
Π[5] = 3 p a b a b a c a
Π 0 0 1 2 3
q 1 2 3 4 5 6 7
Step 5: q = 6, k = 3
Π[6] = 1 p a b a b a c a
Π 0 0 1 2 3 1
q 1 2 3 4 5 6 7
Step 6: q = 7, k = 1 p a b a b a c a
Π[7] = 1 Π 0 0 1 2 3 1 1
Note: KMP finds every occurrence of a ‘p’ in ‘S’. That is why KMP does not terminate in
step 12, rather it searches remainder of ‘S’ for any more occurrences of ‘p’.
Illustration: given a String ‘S’ and pattern ‘p’ as follows:
S
b a c b a b a b a b a c a c a
p a b a b a c a
Let us execute the KMP algorithm to find whether
‘p’ occurs in ‘S’.
For ‘p’ the prefix function, Π was computed previously and is as follows:
q 1 2 3 4 5 6 7
p a b a b a c a
Π 0 0 1 2 3 1 1
Initially: n = size of S = 15;
m = size of p = 7
Step 1: i = 1, q = 0
comparing p[1] with S[1]
S b a c b a b a b a b a c a a b
p a b a b a c a
P[1] does not match with S[1]. ‘p’ will be shifted one position to the right.
Step 2: i = 2, q = 0
comparing p[1] with S[2]
S b a c b a b a b a b a c a a b
p a b a b a c a
P[1] matches S[2]. Since there is a match, p is not shifted.
Step 3: i = 3, q = 1
Comparing p[2] with S[3] p[2] does not match with S[3]
S b a c b a b a b a b a c a a b
p a b a b a c a
Backtracking on p, comparing p[1] and S[3]
Step 4: i = 4, q = 0
comparing p[1] with S[4] p[1] does not match with S[4]
S b a c b a b a b a b a c a a b
p a b a b a c a
Step 5: i = 5, q = 0
comparing p[1] with S[5] p[1] matches with S[5]
S b a c b a b a b a b a c a a b
p a b a b a c a
Step 6: i = 6, q = 1
Comparing p[2] with S[6] p[2] matches with S[6]
S b a c b a b a b a b a c a a b
p a b a b a c a
Step 7: i = 7, q = 2
Comparing p[3] with S[7] p[3] matches with S[7]
S b a c b a b a b a b a c a a b
p a b a b a c a
Step 8: i = 8, q = 3
Comparing p[4] with S[8] p[4] matches with S[8]
S b a c b a b a b a b a c a a b
p a b a b a c a
Step 9: i = 9, q = 4
Comparing p[5] with S[9] p[5] matches with S[9]
S b a c b a b a b a b a c a a b
p a b a b a c a
S b a c b a b a b a b a c a a b
p a b a b a c a
Backtracking on p, comparing p[4] with S[10] because after mismatch q = Π[5] = 3
S b a c b a b a b a b a c a a b
p a b a b a c a
Step 12: i = 12, q = 5
Comparing p[6] with S[12] p[6] matches with S[12]
S b a c b a b a b a b a c a a b
p a b a b a c a
S b a c b a b a b a b a c a a b
p a b a b a c a
Pattern ‘p’ has been found to completely occur in string ‘S’. The total number of shifts
that took place for the match to be found are: i – m = 13 – 7 = 6 shifts.
Running - time analysis
• Compute-Prefix-Function (Π) • KMP Matcher
1 m length[p] //’p’ pattern to be 1 n length[S]
matched 2 m length[p]
2 Π[1] 0 3 Π Compute-Prefix-Function(p)
3 k0 4q0
4 for q 2 to m 5 for i 1 to n
5 do while k > 0 and p[k+1] != p[q] 6 do while q > 0 and p[q+1] != S[i]
6 do k Π[k] 7 do q Π[q]
7 If p[k+1] = p[q] 8 if p[q+1] = S[i]
8 then k k +1 9 then q q + 1
9 Π[q] k 10 if q = m
10 return Π 11 then print “Pattern occurs with shift” i
–m
12 q Π[ q]
In the above pseudocode for computing the The for loop beginning in step 5 runs ‘n’
prefix function, the for loop from step times, i.e., as long as the length of the
4 to step 10 runs ‘m’ times. Step 1 to string ‘S’. Since step 1 to step 4 take
step 3 take constant time. Hence the constant time, the running time is
running time of compute prefix dominated by this for loop. Thus running
function is Θ(m). time of matching function is Θ(n).
Tries
Trie is a special structure to represent sets of
character strings.
Can also be used to represent data types
that are objects of any type e.g. strings of
integers.
The word “trie” is derived from the middle
letters of the word “retrieval”.
Tries: Example
One way to implement a spelling checker is
Read a text file.
Break it into words( character strings
separated by blanks and new lines).
Find those words not in a standard
dictionary of words.
Words in the text but not in the dictionary
are printed out as possible misspellings.
Tries: Example
It can be implemented by a set having
operations of :
INSERT
DELETE
MAKENULL
PRINT
A Trie structure supports these set operations
when the element of the set are words.
Tries: Example
T S
H I I
E I N N
$ N N S $ $ G
$ $ $ $
Tries: Example
Tries are appropriate when many words begin with
the same sequence of letters.
i.e; when the number of distinct prefixes among all
words in the set is much less than the total length
of all the words.
Each path from the root to the leaf corresponds to
one word in the represented set.
Nodes of the trie correspond to the prefixes of
words in the set.
Tries: Example
The symbol $ is added at the end of each word so
that no prefix of a word can be a word itself.
The Trie corresponds to the set {THE,THEN THIN,
TIN, SIN, SING}
Each node has at most 27 children, one for each
letter and $
Most nodes will have many fewer than 27 children.
A leaf reached by an edge labeled $ cannot have
any children.
Tries
• Standard Tries
• Compressed Tries
• Suffix Tries
645
Text Processing
• We have seen that preprocessing the pattern speeds up pattern
matching queries
• After preprocessing the pattern in time proportional to the pattern
length, the Boyer-Moore algorithm searches an arbitrary English
text in (average) time proportional to the text length
• If the text is large, immutable and searched for often (e.g., works by
Shakespeare), we may want to preprocess the text instead of the
pattern in order to perform pattern matching queries in time
proportional to the pattern length.
• Tradeoffs in text
searching
646
Standard Tries
• The standard trie for a set of strings S is an ordered tree such that:
– each node but the root is labeled with a character
– the children of a node are alphabetically ordered
– the paths from the external nodes to the root yield the strings of S
• Example: standard trie for
the set of strings
S = { bear, bell, bid, bull,
buy, sell, stock, stop }
•A standard trie uses O(n) space. Operations (find, insert, remove) take time
O(dm) each, where:
-n = total size of the strings in S,
-m =size of the string parameter of the operation 647
-d =alphabet size,
Applications of Tries
• A standard trie supports the following operations on a preprocessed
text in time O(m), where m = |X|
-word matching: find the first occurence of word X in the text
-prefix matching: find the first occurrence of the longest prefix of
word X in the text
• Each operation is performed by tracing a path in the trie starting at
the root
648
Compressed Tries
• Trie with nodes of degree at least 2
• Obtained from standard trie by compressing chains of redundant
nodes
Standard Trie:
Compressed Trie:
649
Compact Storage of Compressed Tries
• A compressed trie can be stored in space O(s), where s = |S|, by using
O(1) space index ranges at the nodes
650
Insertion and Deletion
into/from a Compressed Trie
651
Suffix Tries
• A suffix trie is a compressed trie for all the suffixes of a text
Example:
Compact representation:
652
Properties of Suffix Tries
• The suffix trie for a text X of size n from an alphabet of size d
-stores all the n(n-1)/2 suffixes of X in O(n) space
-supports arbitrary pattern matching and prefix matching queries in
O(dm) time, where m is the length of the pattern
-can be constructed in O(dn) time
653
Tries and Web Search Engines
• The index of a search engine (collection of all searchable words) is stored
into a compressed trie
• Each leaf of the trie is associated with a word and has a list of pages (URLs)
containing that word, called occurrence list
• The trie is kept in internal memory
• The occurrence lists are kept in external memory and are ranked by
relevance
• Boolean queries for sets of words (e.g., Java and coffee) correspond to set
operations (e.g., intersection) on the occurrence lists
• Additional information retrieval techniques are used, such as
– stopword elimination (e.g., ignore “the” “a” “is”)
– stemming (e.g., identify “add” “adding” “added”)
– link analysis (recognize authoritative pages)
654
Tries and Internet Routers
• Computers on the internet (hosts) are identified by a unique 32-bit IP
(internet protocol) addres, usually written in “dotted-quad-decimal”
notation
• E.g., www.cs.brown.edu is 128.148.32.110
• Use nslookup on Unix to find out IP addresses
• An organization uses a subset of IP addresses with the same prefix, e.g.,
Brown uses 128.148.*.*, Yale uses 130.132.*.*
• Data is sent to a host by fragmenting it into packets. Each packet carries the
IP address of its destination.
• The internet whose nodes are routers, and whose edges are
communication links.
• A router forwards packets to its neighbors using IP prefix matching rules.
E.g., a packet with IP prefix 128.148. should be forwarded to the Brown
gateway router.
655
• Routers use tries on the alphabet 0,1 to do prefix matching.