Chapter 1(Data Structure and Algorthim)
Chapter 1(Data Structure and Algorthim)
1.1 Introduction
A program is written in order to solve a problem. A solution to a problem actually consists of two
things:
A way to organize the data---------------------------------------------Data Structure
Sequence of steps to solve the problem -----------------------------Algorithm
The way data are organized in a computer’s memory is said to be Data Structure and the
sequence of computational steps to solve a problem is said to be an algorithm. Therefore, a
program is nothing but data structures plus algorithms.
A Data Structure is a logical model of a particular organization of data.
There are two types of data structure:-
Linear Data Structure: the elements form a sequence, linear lists e.g. Arrays, stacks,
queues, linked lists.
Non-Linear Data Structure: the elements do not form a sequence, e.g. Graphs, trees
Given a problem, the first step to solve the problem is obtaining one’s own abstract view, or model,
of the problem. This process of modeling is called abstraction.
The model defines an abstract view to the problem. This implies that the model focuses only on
problem related stuff and that a programmer tries to define the properties of the problem.
These properties include
The data which are affected and
The operations that are involved in the problem.
With abstraction you create a well-defined entity that can be properly handled. These entities define
the data structure of the program.
An entity with the properties just described is called an abstract data type (ADT).
1.2 Abstract Data Type and Abstraction
An ADT consists of an abstract data structure and operations. Put in other terms, an ADT is an
abstraction of a data structure.
The ADT specifies:
1. What can be stored in the Abstract Data Type?
2. What operations can be done on/by the Abstract Data Type?
1
For example, if we are going to model employees of an organization:
This ADT stores employees with their relevant attributes and discarding irrelevant attributes.
This ADT supports hire, firing, retiring … operations.
ADT: is a set of objects together with a set of operations; they are mathematical abstractions, objects
such as lists and graphs along with operations can be abstract data types.(Booleans, integers along
with operations also an abstract data type)
A data structure is a language construct that the programmer has defined in order to implement an
abstract data type.
There are lots of formalized and standard Abstract data types such as Stacks, Queues, Trees, etc.
Do all characteristics need to be modeled?
Not at all
It depends on the scope of the model
It depends on the reason for developing the model
Abstraction is a process of classifying characteristics as relevant and irrelevant for the particular
purpose at hand and ignoring the irrelevant ones.
Applying abstraction correctly is the essence of successful programming
How do data structures model the world or some part of the world?
The value held by a data structure represents some specific characteristic of the world
The characteristic being modeled restricts the possible values held by a data structure
The characteristic being modeled restricts the possible operations to be performed on the data
structure.
Note: Notice the relation between characteristic, value, and data structures
Where are algorithms, then?
1.3 Algorithm
An algorithm is the method of solving a problem. It is a sequence of instructions that act on some
input data to produce some output in a finite number of steps.
2
In order to model the dynamic part of the world we need to work with algorithms. Algorithms are
the dynamic part of a program‘s world model.
An algorithm transforms data structures from one state to another state in two ways:
An algorithm may change the value held by a data structure
An algorithm may change the data structure itself
The quality of a data structure is related to its ability to successfully model the characteristics of the
world. Similarly, the quality of an algorithm is related to its ability to successfully simulate the
changes in the world.
However, independent of any particular world model, the quality of data structure and
algorithms is determined by their ability to work together well. Generally speaking, correct
data structures lead to simple and efficient algorithms and correct algorithms lead to accurate
and efficient data structures.
Algorithm basically fall under two broad categories:
Iterative- use loops and conditional statements
Recursive:- use divide and conquer strategy
1.4 Properties of Algorithm
• Sequence: Each step must have a unique defined preceding and succeeding step. The first step
(start step) and last step (halt step) must be clearly noted.
In order to solve a problem, there are many possible algorithms. One has to be able to choose the best
algorithm for the problem at hand using some scientific method. To classify some data structures and
algorithms as good, we need precise ways of analyzing them in terms of resource requirement. The
main resources are:
Running Time
Memory Usage
Communication Bandwidth
Running time is usually treated as the most important since computational time is the most precious
resource in most problem domains.
There are two approaches to measure the efficiency of algorithms:
4
• Theoretical: Determining the quantity of resources required mathematically (Execution
time, memory space, etc.) needed by each algorithm.
5
There is no generally accepted set of rules for algorithm analysis. However, an exact count of
operations is commonly used.
1.5.1.1. Analysis Rules:
1. We assume an arbitrary time unit.
2. Execution of one of the following operations takes time 1:
Assignment Operation
Single Input/Output Operation
Single Boolean Operations
Single Arithmetic Operations
Function Return
3. Running time of a selection statement (if, switch) is the time for the condition evaluation + the
maximum of the running times for the individual clauses in the selection.
4. Loops: Running time for a loop is equal to the running time for the statements inside the loop *
number of iterations.
The total running time of a statement inside a group of nested loops is the running time of the
statements multiplied by the product of the sizes of all the loops.
For nested loops, analyze inside out.
always assume that the loop executes the maximum number of iterations possible.
5. Running time of a function call is 1 for setup + the time for any parameter calculations + the time
required for the execution of the function body.
Examples:
1. int count(){ n loops of 2 units for an assignment, and an
int k=0; addition.
cout<< ―Enter an integer‖; 1 for the return statement.
cin>>n; --------------------------------------------------------
for (i=0;i<n;i++) -----------
k=k+1; T (n)= 1+1+1+(1+n+1+n)+2n+1 =
return 0;} 4n+6 = O(n)
Time Units to Compute 2. int total(int n)
------------------------------------------------- {
1 for the assignment statement: int k=0 int sum=0;
1 for the output statement. for (int i=1;i<=n;i++)
1 for the input statement. sum=sum+1;
In the for loop: return sum;
1 assignment, n+1 tests, and n increments. }
Time Units to Compute
6
-------------------------------------------------
1 for the assignment statement: int sum=0
In the for loop: 1 for the first assignment statement: x=0;
1 assignment, n+1 tests, and n increments. 1 for the second assignment statement: i=0; 10
n loops of 2 units for an assignment, and an 1 for the third assignment statement: j=1;
addition. 1 for the output statement.
1 for the return statement. 1 for the input statement.
-------------------------------------------------------- In the first while loop:
----------- n+1 tests
T (n)= 1+ (1+n+1+n)+2n+1 = 4n+4 n loops of 2 units for the two increment
= O(n) (addition) operations
In the second while loop:
3. void func() n tests
{ n-1 increments
int x=0; --------------------------------------------------------
int i=0; -----------
int j=1; T (n)= 1+1+1+1+1+n+1+2n+n+n-1
cout<< ―Enter an Integer value‖; = 5n+5 = O(n)
cin>>n; 4. int sum (int n)
while (i<n){ {
x++; int partial_sum = 0;
i++; for (int i = 1; i <= n; i++)
} partial_sum = partial_sum +(i * i * i);
while (j<n) return partial_sum;
{ }
j++; Time Units to Compute
} -------------------------------------------------
} 1 for the assignment.
Time Units to Compute 1 assignment, n+1 tests, and n increments.
------------------------------------------------- n loops of 4 units for an assignment, an
addition, and two multiplications.
1 for the return statement.
--------------------------------------------------------
-----------
T (n)= 1+(1+n+1+n)+4n+1 = 6n+4 = O(n
)