Ece FDS Notes - Unit I
Ece FDS Notes - Unit I
INTRODUCTION
Data Structure is a way of collecting and organising data in such a way that we can
perform operations on these data in an effective way.
Data Structures is about rendering data elements in terms of some relationship, for better
organization and storage. For example, we have data player's name "Virat" and age 26.
Here "Virat" is of String data type and 26 is of integer data type.
We can organize this data as a record like Player record. Now we can collect and store
player's records in a file or database as a data structure. For example: "Dhoni" 30,
"Gambhir" 31, "Sehwag" 33.
In simple language, Data Structures are structures programmed to store ordered data, so
that various operations can be performed on it easily.
Data : The term ‘DATA’ simply referes to a a value or a set of values. These values may
present anything about something, like it may be roll no of a student, marks, name of an
employee, address of person etc.
Data item : A data item refers to a single unit of value. For eg. roll no of a student, marks,
name of an employee, address of person etc. are data items. Data items that can be
divided into sub items are called group items (Eg. Address, date, name), where as those
who can not be divided in to sub items are called elementary items (Eg. Roll no, marks,
city, pin code etc.).
Entity - with similar attributes ( e.g all employees of an organization) form an entity set
A 17 M 109cs0132 CSE
B 18 M 109ee1234 EE
Anything that can store data can be called as a data structure, hence Integer, Float,
Boolean, Char etc, all are data structures. They are known as Primitive Data Structures.
Then we also have some complex Data Structures, which are used to store large and
connected data. Some example of Abstract Data Structure are :
Array
Linked List
Stack
Queue
Tree
Graph
All these data structures allow us to perform different operations on data. We select these
data structures based on which type of operation is required.
Basic Operations
The data in the data structures are processed by certain operations. The particular data
structure chosen largely depends on the frequency of the operation that needs to be
performed on the data structure.
• Traversing
• Searching
• Insertion
• Deletion
• Sorting
• Merging
(1) Traversing: Accessing each record exactly once so that certain items in the
record may be processed.
(2) Searching: Finding the location of a particular record with a given key value, or
finding the location of all records which satisfy one or more conditions.
(3) Inserting: Adding a new record to the structure.
An abstract data type (ADT) refers to a set of data values and associated operations that
are specified accurately, independent of any particular implementation. With an ADT, we
know what a specific data type can do, but how it actually does it is hidden. Simply hiding
the implementation
Array is a container which can hold fix number of items and these items should be of
same type. Most of the data structures make use of array to implement their algorithms.
Following are important terms to understand the concepts of Array.
Array Representation
Arrays can be declared in various ways in different languages. For illustration, let's take
C array declaration.
Page 4
UNIT-I
As per above shown illustration, following are the important points to be considered.
Basic Operations
Following are the basic operations supported by an array.
Linked List is a linear data structure and it is very common data structure which consists
of group of nodes in a sequence which is divided in two parts. Each node consists of its
own data and the address of the next node and forms a chain. Linked Lists are used to
create trees and graphs.
Page 5
UNIT-I
• They are a dynamic in nature which allocates the memory when required.
• Insertion and deletion operations can be easily implemented.
• Stacks and queues can be easily executed.
• Linked List reduces the access time.
Linked lists let you insert elements at the beginning and end of the list.
Singly Linked List : Singly linked lists contain nodes which have a data part as well as an
address part i.e. next, which points to the next node in sequence of nodes. The operations
we can perform on singly linked lists are insertion, deletion and traversal.
Doubly Linked List : In a doubly linked list, each node contains two links the first link
points to the previous node and the next link points to the next node in the sequence.
Circular Linked List : In the circular linked list the last node of the list contains the
address of the first node and forms a circular chain.
Stacks
Stack is an abstract data type with a bounded (predefined) capacity. It is a simple data
structure that allows adding and removing elements in a particular order. Every time an
element is added, it goes on the top of the stack, the only element that can be removed is
the element that was at the top of the stack, just like a pile of objects.
Applications of Stack
• The simplest application of a stack is to reverse a word. You push a given word
to stack - letter by letter - and then pop letters from the stack.
• There are other uses also like : Parsing, Expression Conversion(Infix to Postfix,
Postfix to Prefix etc) and many more.
Implementation of Stack
Stack can be easily implemented using an Array or a Linked List. Arrays are quick, but are
limited in size and Linked List requires overhead to allocate, link, unlink, and deallocate,
but is not limited in size. Here we will implement Stack using array.
-1 Stack is Empty
Analysis of Stacks
Below mentioned are the time complexities for various operations that can be performed
on the Stack data structure.
Queue is also an abstract data type or a linear data structure, in which the first element is
inserted from one end called REAR(also called tail), and the deletion of exisiting element
takes place from the other end called as FRONT(also called head). This makes queue as
FIFO data structure, which means that element inserted first will also be removed first.
The process to add an element into queue is called Enqueue and the process of removal of
an element from queue is called Dequeue.
1. Like Stack, Queue is also an ordered list of elements of similar data types.
2. Queue is a FIFO( First in First Out ) structure.
3. Once a new element is inserted into the Queue, all the elements inserted before
the new element in the queue must be removed, to remove the new element.
4. peek( ) function is oftenly used to return the value of first element without
dequeuing it.
Applications of Queue
Queue, as the name suggests is used whenever we need to have any group of objects in an
order in which the first one coming in, also gets out first while the others wait for there
turn, like in the following scenarios :
1. Serving requests on a single shared resource, like a printer, CPU task scheduling
etc.
2. In real life, Call Center phone systems will use Queues, to hold people calling
them in an order, until a service representative is free.
3. Handling of interrupts in real-time systems. The interrupts are handled in the
same order as they arrive, First come first served.
Analysis of Queue
• Enqueue : O(1)
• Dequeue : O(1)
• Size : O(1)
Tree represents nodes connected by edges. We'll going to discuss binary tree or binary
search tree specifically.
Binary Tree is a special datastructure used for data storage purposes. A binary tree has a
special condition that each node can have two children at maximum. A binary tree have
benefits of both an ordered array and a linked list as search is as quick as in sorted array
and insertion or deletion operation are as fast as in linked list.
Terms
Following are important terms with respect to tree.
A graph is a pictorial representation of a set of objects where some pairs of objects are
connected by links. The interconnected objects are represented by points termed as
vertices, and the links that connect the vertices are called edges.
Formally, a graph is a pair of sets (V, E), where V is the set of vertices and E is the set of
edges, connecting the pairs of vertices. Take a look at the following graph −
V = {a, b, c, d, e}
Edge − Edge represents a path between two vertices or a line between two
vertices. In example given below, lines from A to B, B to C and so on represents
edges. We can use a two dimensional array to represent array as shown in image
below. Here AB can be represented as 1 at row 0, column 1, BC as 1 at row 1,
column 2 and so on, keeping other combinations as 0.
Adjacency − Two node or vertices are adjacent if they are connected to each other
through an edge. In example given below, B is adjacent to A, C is adjacent to B and
so on.
Basic Operations
Following are basic primary operations of a Graph which are following.
Algorithms Basics
From data structure point of view, following are some important categories of algorithms
Characteristics of an Algorithm
Not all procedures can be called an algorithm. An algorithm should have the below
mentioned characteristics −
Algorithm Analysis
An algorithm is said to be efficient and fast, if it takes less time to execute and consumes
less memory space. The performance of an algorithm is measured on the basis of
following properties:
1. Time Complexity
2. Space Complexity
Suppose X is an algorithm and n is the size of input data, the time and space used by the
Algorithm X are the two main factors which decide the efficiency of X.
• Time Factor − The time is measured by counting the number of key operations
such as comparisons in sorting algorithm
• Space Factor − The space is measured by counting the maximum memory
space required by the algorithm.
The complexity of an algorithm f(n) gives the running time and / or storage space
required by the algorithm in terms of n as the size of input data.
Space Complexity
Space required by an algorithm is equal to the sum of the following two components −
• A fixed part that is a space required to store certain data and variables that are
independent of the size of the problem. For example simple variables &
constant used and program size etc.
• A variable part is a space required by variables, whose size depends on the
size of the problem. For example dynamic memory allocation, recursion stacks
space etc.
Space complexity S(P) of any algorithm P is S(P) = C + SP(I) Where C is the fixed part and
S(I) is the variable part of the algorithm which depends on instance characteristic I.
Following is a simple example that tries to explain the concept −
Asymptotic Notations
The main idea of asymptotic analysis is to have a measure of efficiency of algorithms that
doesn’t depend on machine specific constants, and doesn’t require algorithms to be
implemented and time taken by programs to be compared. Asymptotic notations are
mathematical tools to represent time complexity of algorithms for asymptotic analysis.
The following 3 asymptotic notations are mostly used to represent time complexity of
algorithms.
1) Θ Notation:
The theta notation bounds a function from above and below, so it defines exact asymptotic behavior.
A simple way to get Theta notation of an expression is to drop low order terms and ignore leading
3 2 3
constants. For example, consider the following expression. 3 + 6 + 6000 = ( )
Dropping lower order terms is always fine because there will always be a n0 after which ( 3) beats ( 2) irrespective of the constants involved. For a given function g(n), we denote
Θ(g(n)) is following set of functions.
The above definition means, if f(n) is theta of g(n), then the value f(n) is always between
c1*g(n) and c2*g(n) for large values of n (n >= n0). The definition of theta also requires
that f(n) must be non-negative for values of n greater than n0.
2. Big O Notation:
The Big O notation defines an upper bound of an algorithm, it bounds a function only
from above. For example, consider the case of Insertion Sort. It takes linear time in best
case and quadratic time in worst case. We can safely say that the time complexity of
Insertion sort is O( 2). Note that O( 2) also covers linear time. If we use Θ notation to
represent time complexity of Insertion sort, we have to use two statements for best and
worst cases:
1. The worst case time complexity of Insertion Sort is Θ( 2).
The Big O notation is useful when we only have upper bound on time complexity of an
algorithm. Many times we easily find an upper bound by simply looking at the algorithm.
(())={(): 0
0 <= ()<= ()>= 0}
3) Ω Notation:
Just as Big O notation provides an asymptotic upper bound on a function, Ω notation
provides an asymptotic lower bound. Ω Notation< can be useful when we have lower
bound on time complexity of an algorithm. As discussed in the previous post, the best
case performance of an algorithm is generally not useful; the Omega notation is the least
used notation among all three.
For a given function g(n), we denote by Ω(g(n)) the set of functions.
(())={(): 0
0 <= ()<= ()>= 0}.