Data Structure - Algorithm - Algorithm Analysis
Data Structure - Algorithm - Algorithm Analysis
O (n) (swaps),
The Ordered (Unsorted) Collection Abstract Data
Type
Abstract data type (ADT): a form of abstraction
that arises from the use of defined types. An ADT
consists of a class of objects, a defined set of
properties of those objects, and a set of operation
for processing the objects.
void OrderedCollection<E>::AddFirst( E e )
{
assert( clength < MAX_VECTOR_SIZE );
for ( int i=clength ; i > 0 ; --i )
data[ i ] = data[ i – 1 ];
data[0] = e;
++clength;
}
• RemoveFirst Operation
• Function: To remove a data element from the beginning
of an OC.
• Preconditions: The OC is initialized, and the length of the
OC > 0.
• Postconditions: - The length of the OC is decreased by 1.
– The data elements in the OC that come after the first
element are shifted down by one index position.
– What had been the first element in the OC is
returned.
• Assignment Operation
• Function: To assign the contents of the source object
into the target object.
• Preconditions: - The target is an OC, initialized.
– The source is an OC, initialized.
• Postconditions: The contents of the source object are
copied into the target object, and the target’s length is
set to the source’s length.
• Remove Operation
• Function: To remove a data element from the OC.
• Preconditions: - The OC is initialized.
– The parameter is the data element to be removed.
– The parameter must equal an element currently in the
list.
– The length of the OC > 0.
• Postconditions: - The length of the OC is decreased by 1.
– The data elements in the OC that come after the
parameter element are shifted down by one index
position.
• 8) Add Operation
• Function: To add a new data element in its proper position
in SC.
• Preconditions: - The SC object is initialized.
– The parameter is an object of type E.
– There is memory to store the new element in the SC.
• Postconditions: - The length of the SC is incremented by 1.
– The parameter object is placed in its proper position on
the SC.
Implementation:
template< class E >
void SortedCollection<E>::Add( E e )
{
int place = 0;
assert( clength < MAX_VECTOR_SIZE );
if ( ( clength == 0 ) || ( e > data[clength - 1] ) )
data[ clength ] = e;
else
{
while ( e > data[ place ] )
++place;
for ( int index=clength ; index > place ; --index )
data[ index ] = data[ index - 1 ];
data[ place ] = e;
}
++clength
}
The need for linked list
A central motivation behind the linked list data
structure is to eliminate the data movement
associated with insertion into and deletions from.
Linked list uses only enough dynamic memory to
store the data values inserted by the user.
insert
newnode->next = myCurrent;
myCurrent = newnode;
++mySize;
}
getNode
template< class E >
LinkedList<E>::node*LinkedList<E>::getNode(const E &item)
{
node *newnode = new node;
assert ( newnode != 0 );
newnode->data = item ;
newnode->next = 0;
return newnode;
}
remove
E LinkedList<E>::remove(){
assert( myCurrent != 0 );
E data = myCurrent->data
else
myPrevious->next = myCurrent->next;
myCurrent = myCurrent->next;
delete garbage;
--mySize;
return data;
}
The copy constructor for a linked list
template< class E >
LinkedList<E>::LinkedList( const LinkedList<E> &list )
:myFirst(0), myCurrent(0), myPrevious(0), mySize(0)
{
node * probe = list.myFirst;
while ( probe != 0 )
{
insert( probe->data );
next();
probe = probe->next;
}
}
• Adding Data to the List Doubly Linked List
void LinkedList<E>::insert( int position ,const E &item )
{
node * newNode, * following, * preceding;
assert( position >= 0 || position <= mySize );
if( position == 0 )
{ if( mySize == 0 )
following = NULL;
else
{
set_position( 0 );
following = myCurrent; }
preceding = NULL; }
else
{ set_position( position - 1 );
preceding = myCurrent;
following = preceding->next; }
newNode = new Node( item, preceding, following );
12/07/2021 CS201 36
Trees
12/07/2021 CS201 37
What is a tree?
• Trees are structures used to represent hierarchical
relationship
• Each tree consists of nodes and edges
• Each node represents an object
• Each edge represents the relationship between two nodes.
node
edge
12/07/2021 CS201 38
Some applications of Trees
Organization Chart Expression Tree
President
+
VP VP
Personnel Marketing * 5
3 2
Director Director
Customer Sales
Relation
12/07/2021 CS201 39
Terminology I
• For any two nodes u and v, if there is an edge
pointing from u to v, u is called the parent of v while
v is called the child of u. Such edge is denoted as (u,
v).
• In a tree, there is exactly one node without parent,
which is called the root. The nodes without children
are called leaves.
root
u
u: parent of v
v: child of u
v
12/07/2021 CS201
leaves 40
Terminology II
• In a tree, the nodes without children are
called leaves. Otherwise, they are called
internal nodes.
internal nodes
leaves
12/07/2021 CS201 41
Terminology III
• If two nodes have the same parent, they are siblings.
• A node u is an ancestor of v if u is parent of v or
parent of parent of v or …
• A node v is a descendent of u if v is child of v or child
of child of v or …
12/07/2021 CS201 42
Terminology IV
• A subtree is any node together with all its
descendants.
T
A subtree of T
v v
12/07/2021 CS201 43
Terminology V
• Level of a node n: number of nodes on the path from root to
node n
• Height of a tree: maximum level among all of its node
Level 1
Level 2
height=4
Level 3
n
Level 4
12/07/2021 CS201 44
Binary Tree
• Binary Tree: Tree in which every node has at most 2
children
• Left child of u: the child on the left of u
• Right child of u: the child on the right of u
x: left child of u
u v y: right child of u
w: right child of v
x y z: left child of w
w
z
12/07/2021 CS201 45
Full binary tree
• If T is empty, T is a full binary tree of height 0.
• If T is not empty and of height h >0, T is a full binary
tree if both subtrees of the root of T are full binary
trees of height h-1.
12/07/2021 CS201 46
Property of binary tree (I)
• A full binary tree of height h has 2h-1 nodes
No. of nodes = 20 + 21 + … + 2(h-1)
= 2h – 1
Level 1: 20 nodes
Level 2: 21 nodes
Level 3: 22 nodes
12/07/2021 CS201 47
Property of binary tree (II)
• Consider a binary tree T of height h. The
number of nodes of T 2h-1
12/07/2021 CS201 48
Property of binary tree (III)
• The minimum height of a binary tree with n
nodes is log(n+1)
12/07/2021 CS201 49
Binary Tree ADT
setElem
getElem
setLeft, setRight
binary
getLeft, getRight
tree
isEmpty, isFull,
isComplete
makeTree
12/07/2021 CS201 50
Representation of a Binary Tree
• An array-based representation
• A reference-based representation
12/07/2021 CS201 51
An array-based representation
nodeNum item leftChild rightChild
–1: empty tree root
0 d 1 2 0
1 b 3 4
2 f 5 -1
3 a -1 -1
d 4 c -1 -1
5 e -1 -1
b f 6 ? ? ? free
7 ? ? ? 6
8 ? ? ?
a c e 9 ? ? ?
... ..... ..... ....
12/07/2021 CS201 52
Reference Based Representation
NULL: empty tree left element right
b f
b f
a c
a c
12/07/2021 CS201 53
Tree Traversal
• Given a binary tree, we may like to do some
operations on all nodes in a binary tree. For
example, we may want to double the value in
every node in a binary tree.
• To do this, we need a traversal algorithm
which visits every node in the binary tree.
12/07/2021 CS201 54
Ways to traverse a tree
• There are three main ways to traverse a tree:
– Pre-order:
• (1) visit node, (2) recursively visit left subtree, (3) recursively visit
right subtree
– In-order:
• (1) recursively visit left subtree, (2) visit node, (3) recursively right
subtree
– Post-order:
• (1) recursively visit left subtree, (2) recursively visit right subtree,
(3) visit node
– Level-order:
• Traverse the nodes level by level
• In different situations, we use different traversal
algorithm.
12/07/2021 CS201 55
Examples for expression tree
• By pre-order, (prefix)
+*23/84
• By in-order, (infix)
+
2*3+8/4
• By post-order, (postfix) * /
23*84/+
2 3 8 4
• By level-order,
+*/2384
• Note 1: Infix is what we read!
• Note 2: Postfix expression can be computed
efficiently using stack
12/07/2021 CS201 56
Pre-order
Algorithm pre-order(BTree x)
If (x is not empty) {
print x.getItem(); // you can do other things!
pre-order(x.getLeftChild());
pre-order(x.getRightChild());
}
12/07/2021 CS201 57
Pre-order example
Print c;
Pre-order(null);
Pre-order(null);
a b d c b c
d
12/07/2021 CS201 58
Time complexity of Pre-order
Traversal
• For every node x, we will call
pre-order(x) one time, which performs O(1)
operations.
• Thus, the total time = O(n).
12/07/2021 CS201 59
In-order and post-order
Algorithm in-order(BTree x)
If (x is not empty) {
in-order(x.getLeftChild());
print x.getItem(); // you can do other things!
in-order(x.getRightChild());
}
Algorithm post-order(BTree x)
If (x is not empty) {
post-order(x.getLeftChild());
post-order(x.getRightChild());
print x.getItem(); // you can do other things!
}
12/07/2021 CS201 60
In-order example
In-order(null);
Print c;
In-order(null);
d b a c b c
12/07/2021 CS201 61
Post-order example
Post-order(null);
Print c;
Post-order(null);
d b c a b c
d
12/07/2021 CS201 62
Time complexity for in-order and
post-order
• Similar to pre-order traversal, the time
complexity is O(n).
12/07/2021 CS201 63
Level-order
• Level-order traversal requires a queue!
Algorithm level-order(BTree t)
Queue Q = new Queue();
BTree n;
Q.enqueue(t); // insert pointer t into Q
while (! Q.empty()){
n = Q.dequeue(); //remove next node from the front of Q
if (!n.isEmpty()){
print n.getItem(); // you can do other things
Q.enqueue(n.getLeft()); // enqueue left subtree on rear of Q
Q.enqueue(n.getRight()); // enqueue right subtree on rear of Q
};
};
12/07/2021 CS201 64
Time complexity of Level-order
traversal
• Each node will enqueue and dequeue one
time.
• For each node dequeued, it only does one
print operation!
• Thus, the time complexity is O(n).
12/07/2021 CS201 65
General tree implementation
struct TreeNode A
{
Object element
TreeNode *firstChild B C D E
TreeNode *nextsibling
}
F G
because we do not know how many children a
node has in advance.
12/07/2021 CS201 66
Summary
• We have discussed
– the tree data-structure.
– Binary tree vs general tree
– Binary tree ADT
• Can be implemented using arrays or references
– Tree traversal
• Pre-order, in-order, post-order, and level-order
12/07/2021 CS201 67
Graphs
12/07/2021 CS201 68
What is a graph?
• Graphs represent the relationships among data items
• A graph G consists of
– a set V of nodes (vertices)
– a set E of edges: each edge connects two nodes
• Each node represents an item
• Each edge represents the relationship between two
items
node
edge
12/07/2021 CS201 69
Examples of graphs
Molecular Structure Computer Network
H Server 1 Terminal 1
H C H
Terminal 2
H Server 2
12/07/2021 CS201 70
Formal Definition of graph
• The set of nodes is denoted as V
• For any nodes u and v, if u and v are connected by
an edge, such edge is denoted as (u, v)
v
(u, v)
12/07/2021 CS201 71
Adjacent
• Two nodes u and v are said to be adjacent if
(u, v) E
v
(u, v)
u
w
u and v are adjacent
v and w are not adjacent
12/07/2021 CS201 72
Path and simple path
• A path from v1 to vk is a sequence of nodes v1,
v2, …, vk that are connected by edges (v1, v2),
(v2, v3), …, (vk-1, vk)
• A path is called a simple path if every node
appears at most once. v2 v
v1 3
v4 v5
This is a connected graph because there exists path
between every pair of nodes
12/07/2021 CS201 75
Example of disconnected graph
v1 v3 v7 v8
v2
v4 v5
v6 v9
12/07/2021 CS201 76
Connected component
• If a graph is disconnect, it can be partitioned into a
number of graphs such that each of them is
connected. Each such graph is called a connected
component.
v2 v7 v8
v1 v3
v4 v5
v6 v9
12/07/2021 CS201 77
Complete graph
• A graph is complete if each pair of distinct
nodes has an edge
12/07/2021 CS201 78
Subgraph
• A subgraph of a graph G =(V, E) is a graph H =
(U, F) such that U V and
F E.
v2 v2
v1 v3 v3
v4 v5 v4 v5
G H
12/07/2021 CS201 79
Weighted graph
• If each edge in G is assigned a weight, it is
called a weighted graph
3500
2000
Houston
12/07/2021 CS201 80
Directed graph (digraph)
• All previous graphs are undirected graph
• If each edge in E has a direction, it is called a directed edge
• A directed graph is a graph where every edges is a directed
edge
Directed edge
2000
3500
Houston
12/07/2021 CS201 81
More on directed graph
x y
12/07/2021 CS201 82
Multigraph
• A graph cannot have duplicate edges.
• Multigraph allows multiple edges and self
edge (or loop).
12/07/2021 CS201 83
Property of graph
• A undirected graph that is connected and has
no cycle is a tree.
• A tree with n nodes have exactly n-1 edges.
• A connected undirected graph with n nodes
must have at least n-1 edges.
12/07/2021 CS201 84
Implementing Graph
• Adjacency matrix
– Represent a graph using a two-dimensional array
• Adjacency list
– Represent a graph using n linked lists where n is
the number of vertices
12/07/2021 CS201 85
Adjacency matrix for directed graph
Matrix[i][j] = 1 if (vi, vj)E 1 2 3 4 5
0 if (vi, vj)E
v1 v2 v3 v4 v5
1 v1 0 1 0 0 0
v2
v1 v3 2 v 0 0 0 1 0
2
3 v3 0 1 0 1 0
v4 v5 4 v4 0 0 0 0 0
5 v5 0 0 1 1 0
G
12/07/2021 CS201 86
Adjacency matrix for weighted
undirected graph
Matrix[i][j] = w(vi, vj) if (vi, vj)E or (vj, vi)E
∞ otherwise
1 2 3 4 5
v2 v1 v2 v3 v4 v5
v1 2 v3
5 1 v1 ∞ 5 ∞ ∞ ∞
4 3 7 2 v2 5 ∞ 2 4 ∞
v4
8 v5
3 v3 0 2 ∞ 3 7
G 4 v4 ∞ 4 3 ∞ 8
5 v5 ∞ ∞ 7 8 ∞
12/07/2021 CS201 87
Adjacency list for directed graph
1 v1 v2
v2 2 v2 v4
v1 v3
3 v3 v2 v4
4 v4
v4 v5
5 v5 v3 v4
G
12/07/2021 CS201 88
Adjacency list for weighted undirected
graph
v2
v1 2 v3 1 v1 v2(5)
5
4 2 v2 v1(5) v3(2) v4(4)
3 7
3 v3 v2(2) v4(3) v5(7)
v4
8 v5
4 v4 v2(4) v3(3) v5(8)
G 5 v5 v3(7) v4(8)
12/07/2021 CS201 89
Pros and Cons
• Adjacency matrix
– Allows us to determine whether there is an edge
from node i to node j in O(1) time
• Adjacency list
– Allows us to find all nodes adjacent to a given
node j efficiently
– If the graph is sparse, adjacency list requires less
space
12/07/2021 CS201 90
Problems related to Graph
• Graph Traversal
• Topological Sort
• Spanning Tree
• Minimum Spanning Tree
• Shortest Path
12/07/2021 CS201 91
Graph Traversal Algorithm
• To traverse a tree, we use tree traversal algorithms
like pre-order, in-order, and post-order to visit all the
nodes in a tree
• Similarly, graph traversal algorithm tries to visit all
the nodes it can reach.
• If a graph is disconnected, a graph traversal that
begins at a node v will visit only a subset of nodes,
that is, the connected component containing v.
12/07/2021 CS201 92
Two basic traversal algorithms
• Two basic graph traversal algorithms:
– Depth-first-search (DFS)
• After visit node v, DFS strategy proceeds along a path
from v as deeply into the graph as possible before
backing up
– Breadth-first-search (BFS)
• After visit node v, BFS strategy visits every node
adjacent to v before visiting any other nodes
12/07/2021 CS201 93
Depth-first search (DFS)
• DFS strategy looks similar to pre-order. From a given node v, it
first visits itself. Then, recursively visit its unvisited neighbours
one by one.
• DFS can be defined recursively as follows.
Algorithm dfs(v)
print v; // you can do other things!
mark v as visited;
for (each unvisited node u adjacent to v)
dfs(u);
12/07/2021 CS201 94
DFS example
• Start from v3
1
v3
2
v2 v2
v1 v3
x x x 3 4
v1 v4
v4
x x v5
5
G v5
12/07/2021 CS201 95
Non-recursive version of DFS
algorithm
Algorithm dfs(v)
s.createStack();
s.push(v);
mark v as visited;
while (!s.isEmpty()) {
let x be the node on the top of the stack s;
if (no unvisited nodes are adjacent to x)
s.pop(); // blacktrack
else {
select an unvisited node u adjacent to x;
s.push(u);
mark u as visited;
}
}
12/07/2021 CS201 96
Non-recursive DFS example
visit stack
v3 v3
v2
v2 v3, v2
v1 v3
v1 v 3 , v 2, v 1
x x x
backtrack v3, v2
v4 v 3 , v 2, v 4
v4
x x v5
v5 v 3 , v 2, v 4 , v 5
backtrack v 3 , v 2, v 4
backtrack v3, v2 G
backtrack v3
backtrack empty
12/07/2021 CS201 97
Breadth-first search (BFS)
• BFS strategy looks similar to level-order. From a given
node v, it first visits itself. Then, it visits every node
adjacent to v before visiting any other nodes.
– 1. Visit v
– 2. Visit all v’s neigbours
– 3. Visit all v’s neighbours’ neighbours
– …
• Similar to level-order, BFS is based on a queue.
12/07/2021 CS201 98
Algorithm for BFS
Algorithm bfs(v)
q.createQueue();
q.enqueue(v);
mark v as visited;
while(!q.isEmpty()) {
w = q.dequeue();
for (each unvisited node u adjacent to w) {
q.enqueue(u);
mark u as visited;
}
}
12/07/2021 CS201 99
BFS example
• Start from v5 Visit Queue
(front to
1 back)
v5 v5 v5
v2 v3 empty
v1
x x
2 3 v3 v3
v3 v4
x v4 v3, v4
v4x
v4
x
4
v2 v2 v4, v2
v5 v2
G 5 empty
v1 v1 v1
12/07/2021 CS201
empty
100
Topological order
• Consider the prerequisite structure for courses:
b d
a
c e
• Each node x represents a course x
• (x, y) represents that course x is a prerequisite to course y
• Note that this graph should be a directed graph without cycles (called a
directed acyclic graph).
• A linear order to take all 5 courses while satisfying all prerequisites is
called a topological order.
• E.g.
– a, c, b, e, d
– c, a, b, e, d
Algorithm topSort
n = |V|;
for i = 1 to n {
select a node v that has no successor;
aList.add(1, v);
delete node v and its edges from the graph;
}
return aList;
c e c e
1. d has no 2. Both b and e have no
successor! successor! Choose e!
Choose d!
b b
a a
a
c
3. Both b and c have 4. Only b has no 5. Choose a!
no successor! successor! The topological order
Choose c! Choose b! is a,b,c,e,d
v4 v5
Spanning
tree Spanning tree is not unique!
Algorithm dfsSpanningTree(v)
mark v as visited;
for (each unvisited node u adjacent to v) {
mark the edge from u to v;
dfsSpanningTree(u);
}
v2 v1 v2
v1 2 v3 2 v3
5 5
4 3 4 3 7
7 8
v4 8 v5 v4 v5