Dsa Report 1
Dsa Report 1
Dsa report 1
PROJECTS UNDERTAKEN
STUDENT PORTAL SYSTEM
Submitted By
Name: VIKAS RATHEE
University Roll No. SUBMITTED TO: Mrs. Ashima Mehta
(HOD)
STUDENT DECLARATION
I hereby declare that the Practical Training Report entitled ("Mastering Data Strucutres &
Algorithms using C and C++") is an authenticrecord of my own work as requirements of 6-
weeks Industrial Training during the period from to for the award of degree of
B.Tech. (Computer Science & Engineering),Dronacharya College of Engineering. (12 size)
(Name of Student)
(Signature of student)
(Roll No.)
Certified that the above statement made by the student is correct to the best of our knowledge and
belief.
Signatures
Examined by:
Head of Department
(Signature and
Seal)
CONTEN
T
2) INTRODUCTION
STACK VS HEAP MEMORY
PHYSICAL VS LOGICAL DATA STRUCTURES
ADT
TIME AND SPACE COMPLEXITY
3) RECURSION
HOW RECURSION WORKS
GENERALISING RECURSION
HOW RECURSION USES STACK
RECURRENCE RELATION−TIME COMPLEXITY OF
RECURSION
STATIC AND GLOBAL VARIABLES
TAIL RECURSION
HEAD RECURSION
TREE RECURSION
INDIRECT RECURSION
NESTED RECURSION
PROGRAMS OF RECURSION
4) ARRY REPRESENTATION
INTRODUCTION TO ARRAY
STATIC VS DYNAMIC ARRAYS
HOW TO INCREASE ARRAY SIZE
2D−ARRAY
5) ARRAY ADT
ARRAY ADT
INSERTING IN ARRAY
DELETING FROM ARRAY
LINERA SEARCH
INPROVING LINEAR SEARCH
BINARY SEARCH
BINARY SEARCH ALGORITHIM
ANALYSIS OF BINARY SEARCH
GET ()ƒSET ()ƒAVG () FUNCTIONS ON ARRAY
REVERSE AND SHIFT AN ARRAY
CHECK IF ARRAY IS SORTED
MERGING ARRAYS
SET OPERATOR ON ARRAY −: UNION, INTERSECTION, DIFFERNCE
6) STRINGS
INTRODUCTION TO STRINGS
FINDING LENGTH OF A STRING
CHANGING CASE OF A STRING
COUNTING WORDS AND VOWELS ON A STRING
VALIDATING A STRING
REVERSING A STRING
COMPARING STRINGS CHECKING PLAINDROME
FINDING DUPLICATES IN A STRING
FINDING FUPLICATES IN A SGTRING USING BITWISE
OPERATIONS
CHECKING IF 2 STRINGS ARE ANAGRAM
7 MATRICE
) S
INTRODUCTION
DIAGONAL MATRIX
C++ CLASS FOR DIAGONAL MATRIX
LOWER TRIANGULAR MATRIX ROW−MAJOR MAPPING
UPPER TRIANGULAR MATRIX ROW−MAJOR MAPPING
UPPER TRIANGULAR MATRIX COLIMN−MAJOR
MAPPING
SYMMETRIC MATRIX
TRI−DIGONAL AND TRI−BAND MATRIX
TOEPLITZ MATRIX
MENU DRIVEN PROGRAMS FOR
MATRICES
9 LINKED
) LIST
WHY WE NEED DYNAMIC DATASTRUCTURES
ABOUT LINKED LIST
DISPLAY LINKED LIST
RECURSIVE DISPLAY FOR LINKED LIST
COUNTING NODES IN LINKED LIST
SUM OF ALL ELEMENTS IN A LINKED LIST
SEARCHING IN A LINKED LIST
INSERTING IN A LINKED LIST
CREATING A LINKED LIST USING INSERT
CREATING A LINKED LIST BY INSERTING AT LAST
INSERTING IN A SORTED LINKED LIST
DELETING FROM A LINKED LIST
CHECK IF A LINKED LIST IS SORTED
REMOVEDUPLICATES FROM A SORTED LINKED
LIST
REVERSING A LINKED LIST
REVERSING USING SLIDING POINTERS
CONCATENATING 2 LINKED LIST
MERGING 2 LINKED LISTS
CHECK FOR LOOP IN LINKED LIST
CIRCULAR LINKED LIST
DISPLAY CIRCULAR LINKED LIST
INSERTING IN A CIRCULAR LINKED LIST
DELETING FROM A CIRCULAR LINKED LIST
DOUBLY LINKED LIST
INSERTING IN A BOUBLY LINKED LIST
FELETING FROM A DOUBLY LINKED LIST
REVERSE A DOUBLY LINKED LIST
CIRCULAR DOUBLY LINKED LIST
COMPARISON OF ARRAY WITH LINKED LIST
10 STA
) CK
INTRODUCTION TO STACK
STACK USING ARRAY
IMPLEMENTATION OF STACK USING ARRAY
STACK USING LINKED LIST
QUEUE ADT
QUEUE USING SINGLE POINTER
QUEUE USING TWO POINTERS
IMPLEMENTATION QUEUE USING ARRAY
DRAWBACKS OF QUEUE USING ARRAY
CIRCULAR QUEUE
QUEUE USING LINKED LIST
PRIORITY QUEUES
12) TREES
TERMINOLOGY
NUMBER OF BINARY TREES USING N NODES
HEIGHT VS NODES IN A BINARY TREE
INTERNAL NODES VS EXTERNAL NODES IN BINARY TREE
STRICT BINARY TREE
HEIGHT VS NODE OF A STRICT BINARY TREE
INTERNAL VS EXTERNALNODES OF A STRICT BINARY
TREE
N−ARY TREES
REPRESENTATION
OF BINARY TREE
LINKED REPRESENTATIONOF BINARY TREE
FULL VS COMPLETE BINARY TREE
STRICT VS COMPLETE BINARY TREE
BINARY TREE TRAVERSALS
CREATING BINARY TREE
PREORDER TREE TRAVERSAL
INORDER TREE TRAVERSALS FUNCTIONS
ITERATIVE PREORDER
INTRODUCTION
INSERTION IN AVL TREES WITH ROTATIONS
GENERATING AVL TREE
15) SEARCH TREES
2−3 TREES
2−3−4 TREES
RED BLACK TREES
16) HEAP
INTRODUCTION TO HEAP
INSERTING IN A HEAP
PROGRAM TO INSERT IN A HEAP
CREATING A HEAP
DELEATING FROM HEAP
HEAP AS PRIORITY QUEUE
BUBBLE SORT
INSERTION SORT
SELECTION SORT
QUICK SORT
MERGING
COUNT SORT
BUCKET SORT
RADIX SORT
SHELL SORT
18) HASHING TECHNIQUE
INTRODUCTION
CHAINING
LINEAR PROBING
QUADRATIC PROBING
DOUBLING HASHING
19) GRAPHS
INTRODUCTION
REPRESENTATIONOF UNDIRECTED
GRAPSH
INTRODUCTION
The Array and Linked List are the two physical data structures. We can have more physical data
structures by taking the combination of these two data structures i.e. array and linked list.
Stack works on the discipline of LIFO i.e. Last in First Out. Queue works on the discipline of
FIFO i.e. First in First Out. The trees are a non-linear data structure and they will be organized in
a hierarchy. The graph is a collection of nodes and the links between the nodes. These data
structures are actually used in applications and algorithms.
The most important point that you need to remember is for implementing the logical data
structures (Stack, Queue, Trees, Graphs, Hash Tables) we either use an array or linked list or a
combination of array and linked list physical data structures. So, that is all we have given the
introduction of various types of data structures. This was just the introduction to give us
awareness.
The abstract datatype is special kind of datatype, whose behavior is defined by a set
of values and set of operations. The keyword <Abstract= is used as we can use these
datatypes, we can perform different operations. But how those operations are working
that is totally hidden from the user. The ADT is made of with primitive datatypes, but
operation logics are hidden.
Stack −
o isFull(), This is used to check whether stack is full or not
o isEmpry(), This is used to check whether stack is empty or
not
o push(x), This is used to push x into the stack
o pop(), This is used to delete one element from top of the
stack
o peek(), This is used to get the top most element of the
stack
o size(), this function is used to get number of elements
present into the stack
Queue −
o isFull(), This is used to check whether queue is full or
not
o isEmpry(), This is used to check whether queue is empty or
not
o insert(x), This is used to add x into the queue at the rear end
o delete(), This is used to delete one element from the front
end of the queue
o size(), this function is used to get number of elements
present into the queue
List −
Space Complexity
Space complexity of an algorithm represents the amount of memory space needed
the algorithm in its life cycle.
Space needed 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 (i.e. simple
variables and constants, program size etc.), that are not dependent of the size of the
problem.
A variable part is a space required by variables, whose size is totally dependent on
the size of the problem. For example, recursion stack space, dynamic memory
allocation etc.
Space complexity S(p) of any algorithm p is S(p) = A + Sp(l) Where A is treated as the
fixed part and S(l) is treated as the variable part of the algorithm which depends on
instance characteristic l. Following is a simple example that tries to explain the
concept
Time Complexity
Time Complexity of an algorithm is the representation of the amount of time required
by the algorithm to execute to completion. Time requirements can be denoted or
defined as a numerical function t(N), where t(N) can be measured as the number of
steps, provided each step takes constant time.
For example, in case of addition of two n-bit integers, N steps are taken.
Consequently, the total computational time is t(N) = c*n, where c is the time
consumed for addition of two bits. Here, we observe that t(N) grows linearly as input
size increases.
RECURSION
When any function is called from main(), the memory is allocated to it on the
stack. A recursive function calls itself, the memory for a called function is
allocated on top of memory allocated to the calling function and a different
copy of local variables is created for each function call. When the base case is
reached, the function returns its value to the function by whom it is called and
memory is de-allocated and the process continues.
b) TAIL RECURSION:
Tail recursion is defined as a recursive function in which the recursive
call is the last statement that is executed by the function. So basically
nothing is left to execute after the recursion call.
void print(int n)
{
if (n < 0)
return;
cout << " "
<< n;
c) HEAD
RECURSION:
If a recursive function calling itself and that recursive call is the first
statement in the function then it9s known as Head Recursion. There9s no
statement, no operation before the call. The function doesn9t have to process
or perform any operation at the time of calling and all operations are done at
returning time.
Example:
#include <bits/stdc++.h>
using namespace std;
// Recursive function
void fun(int n)
{
if (n > 0) {
// Driver code
int main()
{
int x =
3;
fun(x);
return 0;
}
d) TREE RECURSION:
A function that calls itself, is a recursive function. If it is calling itself more than one time, then
it is a tree recursion. Please have a look at the below example which is an example of a tree
recursive function. As you can see fun is calling itself 2 times (more than 1 time). In our
example, we have shown the recursive call like 2 times, but it can also be more than 2 times.
e) INDIRECT RECURSION:
In Indirect recursion, there may be more than one function and they are calling one
another in a circular fashion. For example, if the first function calls the second function, the
second function calls the third function, and again the third function calls back the first
function, then it becomes a cycle which is also a recursion i.e. Indirect Recursion.
f) NESTED RECURSION:
In Nested recursion, the recursive function will pass the parameter as a recursive call. For better
understanding, please have a look at the below image. In the below image nested is a recursive
function which calls itself. But the parameter itself is a recursive call i.e. nested(v-1). This is
called nested recursion.
ARRAY REPRESENTATION:
a) INRODUCTION TO ARRAY:
Dymamic Arrays:
Dynamic arrays differ from static arrays in that they don’t have a
fixed size. However, this is at the cost of having quick appends.
How a dynamic array works is that it resizes itself whenever it runs
out of space. This is usually by doubling itself. For example, if its
size defaulted to 1o indices then it would double to 2o. Let’s take a
closer look at how it does this:
€tatic Arrays:
This makes the array static because it only has five indices that you
can use. This makes it impossible to append items when all five
indices are filled with values. The upside to this is that if you know
that you are only going to have five elements, then appending to
this array becomes worst case O(1) time.
c) 2D ARRAYS:
data_type array_name[rows][columns];
If you want to change the size, you need to create a new array of the
desired size, and then copy elements from the old array to the new
array, and use the new array. In our example, arr can only hold int values.
Arrays can hold primitive values, unlike ArrayList, which can only hold
object values.
ARRAY ADT:
a) ARRAY ADYT:
Advantages
Fast, random access of items or elements.
Very memory efficient, very little memory is needed other than that
needed to store the contents.
Disadvantages
Slow insertion and deletion of elements
Array size must be known when the array is created and is fixed (static)
b) Insertion in array:
Given an array arr of size n, this article tells how to insert an
element x in this array arr at a specific position pos.
#include <stdio.h>
int main()
{
int arr[100] = { 0 };
int i, x, pos, n = 10;
// element to be inserted
x = 50;
// position at which
element
// is to be inserted
pos = 5;
// insert x at pos
arr[pos - 1] =
x;
// print the
updated array
for (i = 0; i <
n; i++)
printf("%d ",
arr[i]);
printf("\n");
#include<bits/stdc++.h>
using namespace std;
if (arr[i] == x)
break;
// If x found in array
if (i < n)
{
// reduce size of array and move
all
// elements on space ahead
n = n - 1;
for (int j=i; j<n; j++)
arr[j] = arr[j+1];
}
return n;
}
d) LINEAR SEARCH:
#include <stdio.h>
// Driver's code
int main(void)
{
int arr[] = { 2, 3, 4, 10,
40 };
int x = 10;
int N = sizeof(arr) / sizeof(arr[0]);
// Function call
int result = search(arr, N, x);
(result == -1)
? printf("Element is not
present in array")
: printf("Element is
present at index %d",
result);
return 0;
}
e) BINARY SEARCH:
Binary Search Algorithm: The basic steps to perform Binary Search are:
Begin with the mid element of the whole array as a search key.
If the value of the search key is equal to the item then return an index
of the search key.
Or if the value of the search key is less than the item in the middle of the
interval, narrow the interval to the lower half.
Otherwise, narrow it to the upper half.
Repeatedly check from the second point until the value is found or the
interval is empty.
1) ITERATIVE METHOD:
else
mid = (low + high) / 2
if x == arr[mid]
return mid
els // x is on the
sid e right
e
return binarySearch(arr, x, low, mid - 1)
STRING:
a) INTRODUCTION TO
STRINGS:
A string is generally considered as a data type and is often implemented as an
array data structure of bytes (or words) that stores a sequence of elements,
typically characters, using some character encoding. String may also denote
more general arrays or other sequence (or list) data types and structures.
b) FINDING LENGTH OF A
STRING:
#include <stdio.h>
#include <string.h>
int main()
{
char Str[1000];
int i;
i); return 0;
}
c) REVERSING A
STRING:
#include <bits/stdc++.h>
// Driver program
int main()
{
string str = "geeksforgeeks";
reverseStr(str);
cout << str;
return 0;
}
d) PERMUTATION OF A
STRING:
#include <bits/stdc++.h>
using namespace std;
// Swapping done
swap(a[l], a[i]);
// Recursion called
permute(a, l+1,
r);
//backtrack
swap(a[l], a[i]);
}
}
}
// Driver Code
int main()
{
string str = "ABC";
int n = str.size();
permute(str, 0, n-1);
return 0;
}
MATRICES:
a)
INTRODUCTION:
EXAMPLE:
b) DIAGONAL MATRIX:
#include <bits/stdc++.h>
using namespace std;
C) SYMMETRIC
MATRIX:
#include <iostream>
using namespace std;
// Driver code
int main()
{
int mat[][MAX] = { { 1, 3, 5 },
{ 3, 2, 4 },
{ 5, 4, 1 } };
if (isSymmetric(mat, 3)
cout << )
"Yes";
else
cout << "No";
return 0;
}
LINKED LIST:
A linked list is a linear data structure, in which the elements are not stored at contiguous
memory locations
b Display linked
) list:
Algorithm
1. Create a class Node which has two attributes: data and next. Next is a pointer
to the next node.
2. Create another class which has two attributes: head and tail.
3. addNode() will add a new node to the list:
a. Create a new node.
b. It first checks, whether the head is equal to null which means the list is
empty.
c. If the list is empty, both head and tail will point to the newly added node.
d. If the list is not empty, the new node will be added to end of the list such
that tail's next will point to the newly added node. This new node will
become the new tail of the list.
4. display() will display the nodes present in the list:
. Define a node current which initially points to the head of the list.
a. Traverse through the list till current points to null.
b. Display each node by making current to point to node next to it in each
iteration.
#include <stdio.h>
#include <stdlib.h>
1. //Represent a node
of singly linked list
2. struct node{
3. int data;
4.struct node *next;
5. };
6.
7. //Represent the
head and tail of the
singly linked list
8.struct node *head, *tail = NULL;
9.
10. //addNode() will add a new
node to the list
11. void addNode(int data) {
12. //Create a new node
13. struct node *newNode =
(struct
node*)malloc(sizeof(struct
node));
14. newNode->data = data;
15.newNode->next = NULL;
16.
17. //Checks if the list is
empty
18. if(head = = NULL) {
19. //If list is empty, both
head and tail will point
to new node
20. head = newNode;
21. tail = newNode;
22. }
23. else {
24. //newNode will be added after tail such that tail's next will point to
Downloaded by Krishna Patel ([email protected])
newN ode
25. tail->next = newNode;
26. //newNode will become new tail of the list
27. tail = newNode;
28. }
lOMoARcPSD|29361042
29. }
30.
31. /
/
d
i
s
p
l
a
y
(
)
w
i
l
l
d
i
s
p
l
a
y
a
l
l
t
h
e
n
o
d
e
s
p
r
e
s
e
c) DOUBLY LINKED LIST:
n A Doubly Linked List (DLL) contains an extra pointer, typically
t called the previous pointer, together with the next pointer and data
i which are there in the singly linked list.
n
t
h
e
Downloaded by Krishna Patel ([email protected])
l
i
s
t
32. v
o
i
d
d
i
s
p
l
a
y
(
)
{
33. /
/
N
o
lOMoARcPSD|29361042
class Node {
public:
int data;
Node next;
}
d SEARCHING IN A LINKED
) LIST:
#include <bits/stdc++.h>
using namespace std;
/* Driver code*/
int main()
{
/* Start with the empty
list */ Node* head = NULL;
int x = 21;
free(temp)
else
{
if (i == position - 1 &&
temp)
{
prev->next = temp->next;
free(temp);
}
else
{
prev = temp;
if(prev == NULL) // position was greater than
number of nodes in the list
break;
temp = temp->next;
}
}
}
STACK
:
a) INTRODUCTION TO STACK:
Stack
It is a linear data structure that follows a particular order in which the
operations are performed.
LIFO( Last In First Out ):
This strategy states that the element that is inserted last will come out first. You can
take a pile of plates kept on top of each other as a real-life example.
The plate which we put last is on the top and since we remove the plate that is at the
top, we can say that the plate that was put last comes out first.
Push:
Adds an item to the stack. If the stack is full, then it is said to be an Overflow
condition.
Algorithm for push:
begin
if stack is full
return
endif
else
increment top
stack[top] assign value
end else
end procedure
Pop:
Removes an item from the stack. The items are popped in the reversed order in
which they are pushed. If the stack is empty, then it is said to be an Underflow
condition.
Algorithm for pop:
begin
if stack is empty
return
endi
f
else
store value of
stack[top] decrement top
return value
end else
end
procedure
Top:
Returns the top
element of the
stack.
Algorithm for
Top:
begin
return stack[top]
end procedure
isEmpty:
Returns true if the
stack is empty, else
false.
Algorithm for
isEmpty:
begin
if top < 1
return
Downloaded by Krishna Patel ([email protected])
true else
return
false
end
procedure
lOMoARcPSD|29361042
Complexity Analysis:
Time Complexity
Operations Complexity
push() O(1)
pop() O(1)
isEmpty() O(1)
size() O(1)
Types of Stacks:
Register Stack: This type of stack is also a memory element present in the
memory unit and can handle a small amount of data only. The height of the
register stack is always limited as the size of the register stack is very small
compared to the memory.
Memory Stack: This type of stack can handle a large amount of
memory data. The height of the memory stack is flexible as it
occupies a large amount of memory data.
Applications of the stack:
Infix to Postfix /Prefix conversion
Redo-undo features at many places like editors, photoshop.
Forward and backward features in web browsers
Used in many algorithms like Tower of Hanoi, tree traversals, stock span
problems, and histogram problems.
Backtracking is one of the algorithm designing techniques. Some
examples of backtracking are the Knight-Tour problem, N-Queen
problem, find your way through a maze, and game-like chess or
checkers in all these problems we dive into someway if that way is
not efficient we come back to the previous state and go into some another
path. To get back from a current state we need to store the previous state
for that purpose we need a stack.
In Graph Algorithms like Topological Sorting and Strongly
Connected Components
QUEUES
:
A queue is defined as a linear data structure that is open at both ends and the
operations are performed in First In First Out (FIFO) order.
We define a queue to be a list in which all additions to the list are made at one end, and
all deletions from the list are made at the other end. The element which is first pushed
into the order, the operation is first performed on that.
entry in the queue, that is, the one most recently added, is called
the rear (or the tail) of the queue. See the below figure.
Chaíacteíistics of Queue:
Queue can handle multiple data.
We can access both ends.
They are fast and flexible.
Queue Repíesentation:
Like stacks, Queues can also be represented in an array: In this representation, the
Queue is implemented using the array. Variables used in this case are
Queue: the name of the array storing queue elements.
Front: the index where the first element is stored in the array
representing the queue.
Rear: the index where the last element is stored in an array representing
the queue.
a) Circular
A circularqueue:
queue is the extended version of a regular queue where the last
element is connected to the first element. Thus forming a circle-like
structure.
Here, the circular increment is performed by modulo division with the queue size.
That is,
b) PRIORITY QUEUES:
Priority Queue is an abstract data type that is similar to
a queue, and every element has some priority value
associated with it. The priority of the elements in a priority
queue determines the order in which elements are served
(i.e., the order in which they are removed). If in any case the
elements have same priority, they are served as per their
ordering in the queue.
Operations of a Priority Queue:
A typical priority queue supports the following operations:
1) Insertion in a Priority Queue
When a new element is inserted in a priority queue, it moves to the empty slot from
top to bottom and left to right. However, if the element is not in the correct place
then it will be compared with the parent node. If the element is not in the correct
order, the elements are swapped. The swapping process continues until all the
elements are placed in the correct position.
2) Deletion in a Priority Queue
As you know that in a max heap, the maximum element is the root node. And it will
remove the element which has maximum priority first. Thus, you remove the root
node from the queue. This removal creates an empty slot, which will be further filled
with new insertion. Then, it compares the newly inserted element with all the elements
inside the queue to maintain the heap invariant.
3) Peek in a Priority Queue
This operation helps to return the maximum element from Max Heap or the
minimum element from Min Heap without deleting the node from the priority queue.
TREES:
A tree is non-linear and a hierarchical data structure consisting of a collection of
nodes such that each node of the tree stores a value and a list of references to other
nodes (the <children=).
This data structure is a specialized method to organize and store data in the computer
to be used more effectively. It consists of a central node, structural nodes, and sub-
nodes, which are connected via edges. We can also say that
tree data structure has roots, branches, and leaves connected with one another.
AVL TREES:
AVL Tree:
AVL tree is a self-balancing Binary Search Tree (BST) where the difference
between heights of left and right subtrees cannot be more than one for all nodes.
Example of AVL Tree:
The above tree is AVL because the differences between heights of left and right
subtrees for every node are less than or equal to 1.
Example of a Tree that is NOT an AVL Tree:
The above tree is not AVL because the differences between the heights of the left
and right subtrees for 8 and 12 are greater than 1.
y x
/ \ Right Rotation / \
x T3 - - - - - - - T1
>
y
/ \ < - - - -
/
- - -
\
T1T2 Left
Keys in both of the above trees followT2the following order
Rotation
keys(T1) < key(x) < keys(T2) < key(y) < keys(T3)
T3
So BST property is not violated anywhere.
Recommended Problem
Tree
BINARY
TREES
Binary Tree is defined as a Tree data structure with at most 2 children. Since each
a binaryin
element tree can have only 2 children, we typically name them the left and right
child.
SORTING TECHNIQUE:
Sorting refers to the operation or technique of arranging and rearranging sets of
data in some specific order. A collection of records called a list where every record
has one or more fields. The fields which contain a unique value for each record is
termed as the key field. For example, a phone number directory can be thought of as
a list where each record has three fields - 'name' of the person, 'address' of that
person, and their 'phone numbers'. Being unique phone number can work as a key to
locate any record in the list.
Sorting is the operation performed to arrange the records of a table or list in some
order according to some specific ordering criterion. Sorting is performed according
to some key value of each record.
The records are either sorted either numerically or alphanumerically. The records are
then arranged in ascending or descending order depending on the numerical value
of the key. Here is an example, where the sorting of a lists of marks obtained by a
student in any particular subject of a class.
Categories of Sorting
The techniques of sorting can be divided into two categories. These are:
Internal Sorting
External Sorting
Internal Sorting: If all the data that is to be sorted can be adjusted at a time in the
main memory, the internal sorting method is being performed.
External Sorting: When the data that is to be sorted cannot be accommodated in the
memory at the same time and some has to be kept in auxiliary memory such as hard
disk, floppy disk, magnetic tapes etc, then external sorting methods are performed.
Various sorting techniques are analyzed in various cases and named these cases as
follows:
Best case
Worst case
Average case
Hence, the result of these cases is often a formula giving the average time required
for a particular sort of size 'n.' Most of the sort methods have time requirements that
range from O(nlog n) to O(n2).
Hashing technique:
GRAPHS IN DATA
STRUCTURE:
Components of a Gíaph
Vertices: Vertices are the fundamental units of the graph. Sometimes,
vertices are also known as vertex or nodes. Every node/vertex can be
labeled or unlabelled.
Edges: Edges are drawn or used to connect two nodes of the graph. It
can
be ordered pair of nodes in a directed graph. Edges can connect any two
nodes in any possible way. There are no rules. Sometimes, edges are also
known as arcs. Every edge can be labeled/unlabelled.
Types of Graphs:
1. Finite Graphs
A graph is said to be finite if it has a finite number of vertices and a finite
number of edges.
2. Infinite Graph:
A graph is said to be infinite if it has an infinite number of vertices as well as an
infinite number of edges.
3. Trivial Graph:
A graph is said to be trivial if a finite graph contains only one vertex and no
edge.
4. Simple Graph:
A simple graph is a graph that does not contain more than one edge between
the pair of vertices. A simple railway track connecting different cities is an
example of a simple graph.
5. Multi Graph:
Any graph which contains some parallel edges but doesn’t contain any self-loop
is called a multigraph. For example a Road Map.
Parallel Edges: If two vertices are connected with more than one
edge then such edges are called parallel edges that are many routes
but one destination.
Loop: An edge of a graph that starts from a vertex and ends at the
same vertex is called a loop or a self-loop.
6. Null Graph:
A graph of order n and size zero is a graph where there are only isolated
vertices with no edges connecting any pair of vertices.
7. Complete Graph:
A simple graph with n vertices is called a complete graph if the degree of each
vertex is n-1, that is, one vertex is attached with n-1 edges or the rest of the
vertices in the graph. A complete graph is also called Full Graph.
8. Pseudo Graph:
A graph G with a self-loop and some multiple edges is called a pseudo
graph.
9. Regular Graph:
A simple graph is said to be regular if all vertices of graph G are of equal degree.
All complete graphs are regular but vice versa is not possible.
ASYMPTOTIC
ANALYSIS:
Asymptotic analysis of an algorithm refers to defining the mathematical
boundation/framing of its run-time performance. Using asymptotic analysis, we can
very well conclude the best case, average case, and worst case scenario of an
algorithm.
Asymptotic analysis is input bound i.e., if there's no input to the algorithm, it is
concluded to work in a constant time. Other than the "input" all other factors are
considered constant.
Asymptotic analysis refers to computing the running time of any operation in
mathematical units of computation. For example, the running time of one operation
is computed as f(n) and may be for another operation it is computed as g(n ). 2
This means the first operation running time will increase linearly with the increase in n
and the running time of the second operation will increase exponentially when n
increases. Similarly, the running time of both operations will be nearly the same if n
is significantly small.
Asymptotic Notations
Following are the commonly used asymptotic notations to calculate the running time
complexity of an algorithm.
Ο Notation
Ω Notation
θ Notation
Big Oh Notation, Ο
The notation Ο(n) is the formal way to express the upper bound of an algorithm's
running time. lt measures the worst case time complexity or the longest amount of
time an algorithm can possibly take to complete.
OMEGA NOTATION :
The notation Ω(n) is the formal way to express the lower bound of an algorithm's
running time. lt measures the best case time complexity or the best amount of time
an algorithm can possibly take to complete.
Theta Notation, θ
The notation θ(n) is the formal way to express both the lower bound and the upper
bound of an algorithm's running time. lt is represented as follows −
CONCLUSION:
REFERENCES:
HP STUDENT REFERENCE GUIDE
BY ABDUL BARI