Analysis and Digital Algorithm Lab Manual
Analysis and Digital Algorithm Lab Manual
COMPUTER ENGINEERING
Laboratory Manual
Laboratory Manual
DEPARTMENT OF COMPUTER ENGINEERING
VISION
To be recognized for the quality education and research in the field of Information Technology
known for its accomplished graduates.
MISSION
The mission of Information Technology Department, Silver Oak College of Engineering and
Technology, Ahmedabad is to:
1. Continually improve the standard of our graduates by engaging in innovative teaching
learning methods with high caliber motivated faculty members keeping in-line with the rapid
technological advancements.
2. Promote and support research activities over a wide range of academic interests among
students and staff for growth of individual knowledge and continuous learning.
3. Provide an education system that promotes innovation, creativity, entrepreneurial spirit,
leadership as well as freedom of thought with emphasis on professionalism and ethical
behavior
PREFACE
It gives us immense pleasure to present the first edition of Analysis and Design of
Algorithms Practical Book for the B.E. 3rd year students for SILVER OAK GROUP OF
INSITUTES.
The Analysis and Design of Algorithms theory and laboratory course at SILVER OAK
COLLEGE OF ENGINEERING & TECHNOLOGY, AHMEDABAD is designed in such a
way that students develop the basic understanding of the subject in the theory classes and then try
their hands on the experiments to realize the various devices and circuits learnt during the
theoretical sessions. The main objective of the ADA laboratory course is: Learning ADA through
algorithm. The objective of this ADA Practical Book is to provide a comprehensive source for all
the experiments included in the ADA laboratory course.
We acknowledge the authors and publishers of all the books which we have consulted
while developing this Practical book. Hopefully this Analysis and Design of Algorithms Practical
Book will serve the purpose for which it has been developed.
Lab Manual Revised By: Prof. Nirzari Patel, Silver Oak College of Engineering and Technology
iii
CERTIFICATE
SHAIKH ANNANAHMED
This is to certify that Mr./Ms
FURKANAHMED with enrollment. No.
2021-22
21.
Head of Department:...........................................
iv
TABLE OF CONTENT
Page No Marks
Sr. Date of Date of
Experiment Title Sign (out of
No Start Completion
10)
To From
1 a) Bubble sort,
b) Selection sort,
c) Insertion sort.
Implementation and Time 8 16
analysis of sorting algorithms.
2
a) Merge sort
b) Quick sort.
Implementation and Time 17 22
3 analysis of linear and binary
search algorithm.
Implementation of max-heap 23 27
4 sort algorithm.
Implementation of a knapsack 28 31
5 problem using dynamic
programming.
32 35
Implementation of chain matrix
6 multiplication using dynamic
programming.
Implementation of making a 36 38
change problem using dynamic
7
programming.
v
Page No
Marks
Sr. Date of Date of
Experiment Title Sign (out of
No Start Completion
10)
To From
Implementation of a knapsack 39 44
8 problem using greedy
algorithm.
45 50
Implementation of Graph and
9 Searching (DFS)
51 57
Implementation of Graph and
10 Searching (BFS)
58 62
11 Implement prim’s algorithm.
63 68
12 Implement kruskal’s algorithm.
vi
PRACTICAL SET - 1
AIM: Implementation and Time analysis of different sorting algorithms.
Bubble Sort:
Bubble Sort is a simple algorithm which is used to sort a given set of n elements provided in form
of an array with n number of elements. Bubble Sort compares all the element one by one and sort
them based on their values.
If the given array has to be sorted in ascending order, then bubble sort will start by comparing the
first element of the array with the second element, if the first element is greater than the second
element, it will swap both the elements, and then move on to compare the second and the third
element, and so on. If we have total n elements, then we need to repeat this process for n-1 times.
It is known as bubble sort, because with every complete iteration the largest element in the given
array, bubbles up towards the last place or the highest index, just like a water bubble rises up to
the water surface.
Sorting takes place by stepping through all the elements one-by-one and comparing it with the
adjacent element and swapping them if required.
Following are the steps involved in bubble sort (for sorting a given array in ascending order):
1. Starting with the first element (index = 0), compare the current element with the next element
of the array.
2. If the current element is greater than the next element of the array, swap them.
3. If the current element is less than the next element, move to the next element. Repeat Step 1.
Following are the Time and Space complexity for the Bubble Sort algorithm.
Worst Case Time Complexity [ Big-O ]: O(n2)
Best Case Time Complexity [Big-omega]: O(n)
Average Time Complexity [Big-theta]: O(n2)
Space Complexity: O(1)
1
AIM 1.1: Write a program to implement Bubble sort.
Code:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n,i,temp,a[20],j,k;
2
Output:
Selection Sort:
Selection sort is conceptually the simplest sorting algorithm. This algorithm will first find
the smallest element in the array and swap it with the element in the first position, then it will
find the second smallest element and swap it with the element in the second position, and it will
keep on doing this until the entire array issorted.
It is called selection sort because it repeatedly selects the next-smallest element and swaps it into
the right place.
Implementing Selection Sort Algorithm
Following are the steps involved in selection sort (for sorting a given array in ascending order):
1. Starting from the first element, we search the smallest element in the array, and replace itwith
the element in the first position.
2. We then move on to the second position, and look for smallest element present in the
subarray, starting from index 1, till the last index.
3. We replace the element at the second position in the original array, or we can say at thefirst
position in the subarray, with the second smallest element.
4. This is repeated, until the array is completelysorted.
4
AIM 1.2: Write a program to implement Selection sort.
Code:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int n,i,temp,a[20],j,k,min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[min]) min=j;
}
if(a[i]!=a[min])
{
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
printf("\nPASS :--> %d :: ",i+1);
for(k=0;k<n;k++) printf("%d ",a[k]);
}
getch();
}
5
Output:
Insertion Sort:
The insertion sort works in a slightly different way. It always maintains a sorted sublist in the
lower positions of the list. Each new item is then “inserted” back into the previous sublist such
that the sorted sublist is one item larger. The shaded items represent the ordered sublists as the
algorithm makes each pass.
7
AIM 1.3: Write a program to implement Insertion sort.
Code:
#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,key,a[10],n=10;
clrscr();
printf("Array:\n ");
for(i=0;i<n;i++)
{
printf("enter array element:");
scanf("%d",&a[i]);
printf("\n");
}
for(j=1;j<n;j++)
{
key=a[j];
i=j-1;
while(i>=0 && a[i]>key)
{
a[i+1]=a[i];
i=i-1;
}
a[i+1]=key;
}
printf("SORTED ELEMENTS:\n");
for(i=0;i<n;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
getch();
}
8
Output:
9
Solve the below mention questionnaires:
1. The way a card game player arranges his cards as he picks them one by one can be comparedto
2. The correct order of the efficiency of the following sorting algorithms according to theiroverall
running time comparison is
a) Insertion>selection>bubble b) Insertion>bubble>selection
c) Selection>bubble>insertion. d) bubble>selection>insertion
3. Analysis the different sorting algorithm of Bubble, Selection and Insertion Sort. Justifyyour
answer which one is better sorting algorithm among them.
Best case time complexity of bubble,selection and insertion sort is O(n), O(n ), O(n) 2
respectively. Wrost case time complexity of these three are O(n ), O(n ), O(n ). In 2 2 2
Bubble and insertion sort insertion sort do less comparison than bubble sort. So
insertion sort is best among these three. Insertion sort outperform merge sort too if
number of element is less.
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
10
--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
11
PRACTICAL SET - 2
AIM: Implementation and Time analysis of Merge & Quick sort algorithms.
Merge Sort:
Merge sort is a divide-and-conquer algorithm based on the idea of breaking down a list into
several sub-lists until each sublist consists of a single element and merging those sublists in a
manner that results into a sorted list.
While comparing two sublists for merging, the first element of both lists is taken into
consideration. While sorting in ascending order, the element that is of a lesser value becomes a
new element of the sorted list. This procedure is repeated until both the smaller sublists are empty
and the new combined sublist comprises all the elements of both the sublists.
Algorithm:
MergeSort(arr[], l, r)
If r > l
1. Find the middle point to divide the array into two halves:
middle m = (l+r)/2
2. Call mergeSort for first half:
Call mergeSort(arr, l, m)
3. Call mergeSort for second half:
Call mergeSort(arr, m+1, r)
4. Merge the two halves sorted in step 2 and 3:
Call merge(arr, l, m, r)
12
Example:
13
2.1 : Write a program to implement Merge sort.
Code:
#include<stdio.h>
#include<conio.h>
void combine(int a[10],int low, int mid, int high)
{
int i,j,k;
int temp[10];
k=low;
i=low;
j=mid+1;
while(i<=mid && j<=high)
{
if(a[i]<=a[j])
{
temp[k]=a[i];
i++;
k++;
}
else
{
temp[k]=a[j];
j++;
k++;
}
}
while(i<=mid)
{
temp[k]=a[i];
i++;
k++;
}
while(j<=high)
{
temp[k]=a[j];
j++;
k++;
}
14
}
}
void mergesort(int a[10],int low, int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
mergesort(a,low,mid);
mergesort(a,mid+1,high);
combine(a,low,mid,high);
}
}
void main()
{
int i,j,mid,high,low=0,k,a[10],n;
clrscr();
for(i=0;i<n;i++)
{
printf("enter array element");
scanf("%d",&a[i]);
}
high=n-1;
mergesort(a,low,high);
//Display sorted array
printf("SORTED ARRAY:");
for(i=0;i<n;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}
getch();
}
15
Output:
16
Quick Sort:
Quick sort is based on the divide-and-conquer approach based on the idea of choosing one
element as a pivot element and partitioning the array around it such that: Left side of pivot
contains all the elements that are less than the pivot element Right side contains all elements
greater than the pivot.
It reduces the space complexity and removes the use of the auxiliary array that is used in merge
sort. Selecting a random pivot in an array results in an improved time complexity in most of the
cases.
Algorithm:
quickSort(left, right)
if right-left <= 0
return
else
pivot = A[right]
partition = partitionFunc(left, right, pivot)
quickSort(left,partition-1)
quickSort(partition+1,right)
end if
end procedure
Complexity Analysis of Merge Sort:
The following will be the time and space complexity for merge sort algorithm:
Worst Case Time Complexity [ Big-O ]: O(n^2)
Best Case Time Complexity [Big-omega]: O(n logn)
Average Time Complexity [Big-theta]: O(n log n)
Space Complexity: O(n)
17
Example:
18
2.2 : Write a program to implement Quick sort.
Code:
#include<stdio.h>
#include<conio.h>
#define MAX 30
if(low>=up)
return;
printf("\nSublist : ");
display(arr,low,up);
19
left=left+1;
if(piv==left)
pivot_placed=TRUE;
if( arr[piv] < arr[left] )
{
temp=arr[piv];
arr[piv]=arr[left];
arr[left]=temp;
piv=left;
}
}/*End of while */
quick(arr,low,piv-1);
quick(arr,piv+1,up);
}
void main()
{
int array[MAX],n,i;
clrscr();
printf("Enter the number of elements : ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Enter element %d : ",i+1);
scanf("%d",&array[i]);
}
quick(array,0,n-1);
20
Output:
21
Solve the below mention questionnaires:
1) For the improvement of efficiency of quick sort the pivot can be
a) the first element b) the mean element
c) the last element d) None of the above Answer: ( B )
54 26 93 17 77 31 44 55 20
/ \
54 26 93 17 77 31 44 55 20
/ \ / \
54 26 93 17 77 31 44 55 20
/ \ /\ / \ / \
54 26 93 17 77 31 44 55 20
\ / \ / \ / \ /
26 54 17 93 31 77 20 44 55
\ / \ /
17 26 54 93 20 31 44 55 77
\ /
17 20 26 31 44 54 55 77 93
22
Figure 4: insertionSort
We begin by assuming that a list with one item (position 00) is already sorted. On each pass, one for each item 1
through n−1n−1, the current item is checked against those in the already sorted sublist. As we look back into the
already sorted sublist, we shift those items that are greater to the right. When we reach a smaller item or the end of the
sublist, the current item can be inserted.
Figure 5 shows the fifth pass in detail. At this point in the algorithm, a sorted sublist of five items consisting of 17, 26,
54, 77, and 93 exists. We want to insert 31 back into the already sorted items. The first comparison against 93 causes
93 to be shifted to the right. 77 and 54 are also shifted. When the item 26 is encountered, the shifting process stops and
31 is placed in the open position. Now we have a sorted sublist of six items.
23
---------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
24
PRACTICAL SET - 3
AIM: Implementation and Time analysis of linear and binary search
algorithm.
Algorithm:
25
3.1 : Write a program to implement Linear Search.
Code:
4 #include<stdio.h>
5 #include <conio.h>
6
7 int main()
8 {
9 int a[20],i,x,n;
10 printf("How many elements?");
11 scanf("%d",&n);
12 printf("Enter array elements:");
13 for(i=0;i<n;++i)
14 scanf("%d",&a[i]);
15 printf("Enter element to search:");
16 scanf("%d",&x);
17 for(i=0;i<n;++i)
18 if(a[i]==x)
19 break;
20 if(i<n)
21 printf("Element found at index %d",i);
22 else
23 printf("Element not found");
24 return 0;
25 }
26
Output:
27
Binary Search Algorithm:
The binary search algorithm can be used with only sorted list of element. That means, binary
search can be used only with list of element which are already arranged in a order. The binary
search cannot be used for list of element which are in random order.
This search process starts comparing of the search element with the middle element in the
list. If both are matched, then the result is "element found". Otherwise, we check whether the
search element is smaller or larger than the middle element in the list. If the search element is
smaller, then we repeat the same process for left sublist of the middle element. If the search
element is larger, then we repeat the same process for right sublist of the middle element.
We repeat this process until we find the search element in the list or until we left with a
sublist of only one element. And if that element also doesn't match with the search element, then
the result is "Element not found in the list".
Algorithm:
Procedurebinary_search
A ← sorted array
n ← size of array
x ← value to be searched
Set lowerBound = 1
Set upperBound = n
28
set midPoint = (lowerBound + upperBound ) / 2
if A[midPoint] < x
set lowerBound = midPoint + 1
if A[midPoint] > x
set upperBound = midPoint - 1
if A[midPoint] == x
EXIT: x found at location midPoint
end while
end procedure
#include <stdio.h>
#include <conio.h>
void main()
{
int arr[20],start,end,middle,n,i,item;
clrscr();
30
Output:
How many elements you want to enter in the array : 6
Enter element 1 : 3
Enter element 2 : 5
Enter element 3 : 7
Enter element 4 : 9
Enter element 5 : 10
Enter element 6 : 11
Enter the element to be searched : 7
7 found at position 3
31
Solve the below mention questionnaires:
Answer: ( B )
Answer: ( D )
Answer: (A)
Conclusion / Outcome:
----Here we conclude how biner search works.
32
PRACTICAL SET – 4
AIM: Implementation of max-heap sort algorithm.
Explanation: Heaps can be used in sorting an array. In max-heaps, maximum element will
always be at the root. Heap Sort uses this property of heap to sort the array. It is similar to
selection sort where we first find the maximum element and place the maximum element at the
end. We repeat the same process for remaining elements.
33
Code:
#include <stdio.h>
// Heap sort
for (int i = n - 1; i >= 0; i--) {
swap(&arr[0], &arr[i]);
34
// Print an array
void printArray(int arr[], int n) {
for (int i = 0; i < n; ++i)
printf("%d ", arr[i]);
printf("\n");
}
// Driver code
int main() {
int arr[] = {1, 12, 9, 5, 6, 10};
int n = sizeof(arr) / sizeof(arr[0]);
heapSort(arr, n);
35
Output:
36
Solve the below mention questionnaires:
Answer : (C )
Answer : (A )
Answer : (B)
4. The max heap constructed from the list of numbers 30, 10, 80, 60, 15, 55 is
a) 80, 55, 60, 15, 10, 30 c) 80, 60, 55, 30, 10, 15
b) 60, 80, 55, 30, 10, 15 d) None
Answer : ( D)
5. Always heap is a
a) Binary search tree c) None
b) Full binary tree d) Complete binary tree
Answer : (D)
Conclusion / Outcome:
ITS Shows that how this algorithe works.
37
DYNAMIC PROGRAMMING
Dynamic programming is a method for solving a complex problem by breaking it down into
simpler sub-problems, solving each of those sub-problems just once, and storing their solutions –
in an array usually.
Now, every time the same sub-problem occurs, instead of recomputing its solution, the previously
calculated solutions are used, thereby saving computation time at the expense of storage space.
Memoization – Memoization uses the top-down technique to solve the problem i.e. it begin with
original problem then breaks it into sub-problems and solve these sub-problems in the same way.
In this approach, you assume that you have already computed all sub-problems. You typically
perform a recursive call (or some iterative equivalent) from the main problem. You ensure that the
recursive call never recomputes a sub-problem because you cache the results, and thus duplicate
sub-problems are not recomputed.
Tabulation – Tabulation is the typical Dynamic Programming approach. Tabulation uses the
bottom up approach to solve the problem, i.e., by solving all related sub-problems first, typically
by storing the results in an array. Based on the results stored in the array, the solution to the “top”
/ original problem is then computed.
Memoization and tabulation are both storage techniques applied to avoid recomputation of a sub-
problem
The idea behind dynamic programming, In general, is to solve a given problem, by solving
different parts of the problem (sub-problems), then using the cached solutions of the sub-problems
to reach an overall solution.
38
PRACTICAL – 5
AIM : Implementation of a knapsack problem using dynamic programming.
In this problem we have a Knapsack that has a weight limit W, which representsknapsack
capacity.
Given two integer arrays val[0..n-1] and wt[0..n-1] which represent values andweights
associated with n items respectively.
Find out the maximum value subset of val[] such that sum of the weights of this subset is
smaller than or equal to W.
Code:
#include<stdio.h>
#include<conio.h>
#define P printf("\n")
int w[12],v[12],val[12][12],W,n,i,j,k;
int max(int,int);
void knapsack();
void disp();
void main()
{
clrscr();
for(i=1;i<=n;i++)
{
printf("Enter w%d :--> ",i);
scanf("%d",&w[i]);
39
printf("Enter v%d :--> ",i);
scanf("%d",&v[i]);
}
printf("Enter W:-->");
scanf("%d",&W);
knapsack();
getch();
}
void knapsack()
{
int a1,a2,x,y;
for(i=1;i<=n;i++)
{
for(j=0;j<=W;j++)
{
if(j==0)
{
val[i][j]=0;
}
if(j!=0 && i==1)
{
val[i][j]=v[1];
}
if(j!=0 && i!=1)
{
a1=val[i-1][j]; // Memory Function
a2=(val[i-1][j-w[i]])+v[i];
if(j-w[i] < 0)
{
val[i][j]=a1;
}
else
{
val[i][j]=max(a1,a2);
}
}
}
}
disp();
}
void disp()
{
P;P;
printf(" ");
for(i=0;i<=W;i++)
printf("%02d ",i);
P;
printf(" ");
for(i=0;i<=W;i++)
printf("----");
P;
for(i=1;i<=n;i++)
{
printf("%02d %02d | ",w[i],v[i]);
for(j=0;j<=W;j++)
{
printf("%02d ",val[i][j]);
}
printf("\n");
}
}
41
Output:
42
43
Solve the below mention questionnaires:
1. You are given a knapsack that can carry a maximum weight of 60. There are 4 items
with weights {20, 30, 40, 70} and values {70, 80, 90, 200}. What is the maximum value
of the items you can carry using the knapsack?
a) 160 c) 170
b) 200 d) 90
Answer : (A)
Answer : (C)
Answer : (C)
Answer : (C)
Answer : (A)
Conclusion / Outcome:
Here we conclude that how dynamic structure works.
44
PRACTICAL – 6
AIM : Implementation of chain matrix multiplication using dynamic
programming.
Explanation: Given a sequence of matrices, find the most efficient way to multiply these
matrices together. The problem is not actually to perform the multiplications, but merely to decide
in which order to perform the multiplications.
However, the order in which we parenthesize the product affects the number of simple arithmetic
operations needed to compute the product, or the efficiency. For example, suppose A is a 10 × 30
matrix, B is a 30 × 5 matrix, and C is a 5 × 60 matrix. Then,
Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of
dimension p[i-1] x p[i]. We need to write a function MatrixChainOrder() that should return the
minimum number of multiplications needed to multiply the chain.
This problem can be solved using Dynamic Programming. First we will compute results for sub-
chains of the original chain and store these results in a 2-D array. Then we will use these results to
compute results for larger chains.
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define P printf("\n")
int n,i,j,k,l,s,round;
int d[20],m[20][20],mul[5];
45
void PrintLine();
void main()
{
clrscr();
for(i=0;i<=n;i++)
{
printf("\nEnter D%d :--> ",i);
scanf("%d",&d[i]);
}
round=n-1;
s=0;
PrintLine();
while(s<=round)
{
if(s==0)
{
for(i=1;i<=n;i++)
{
m[i][i]=0;
printf("\nm%d%d=%d",i,i,m[i][i]);
}
PrintLine();
getch();
}
// ---------------------------------------------
if(s==1)
{
for(i=1;i<n;i++)
{
m[i][i+1]=d[i-1]*d[i]*d[i+1];
printf("\nm%d%d=%d",i,i+1,m[i][i+1]);
}
PrintLine();
getch();
getch();
}
// ---------------------------------------------
if(s>1)
{
for(i=1;i<=n-s;i++)
{
46
l=i+1;
j=0;
for(k=i;k<(s+i);k++)
{
mul[j]=(m[i][k]+m[l][s+i]+
d[i-1]*d[k]*d[s+i]);
l++;
j++;
}
int temp,x,y;
for(x=0;x<j-1;x++)
{
for(y=x+1;y<j;y++)
{
if(mul[x]>mul[y])
{
temp=mul[x];
mul[x]=mul[y];
mul[y]=temp;
}
}
}
m[i][i+s]=mul[0];
printf("\nm%d%d=%d",i,i+s,m[i][i+s]);
}
PrintLine();
getch();
}
s++;
}
printf("\n Minimum Number Of Multiplications :--> %d ",m[1][n]);
getch();
}
void PrintLine()
{
printf("\n-----------");
}
47
48
Output:
49
Solve the below mention questionnaires :
3. Which of the following methods can be used to solve the matrix chainmultiplication
problem?
a) Dynamic programming c) Recursion
b) Brute force d) All of the mentioned
Answer : (D )
50
4. Consider the matrices P, Q and R which are 10 x 20, 20 x 30 and 30 x 40 matrices
respectively. What is the minimum number of multiplications required tomultiply
the three matrices?
a) 18000 c) 24000
b) 12000 d) 32000
Answer : (B)
Answer : (C )
Conclusion / Outcome:
51
Practical Set-7
For example, for N = 4 and S = {1,2,3}, there are four solutions: {1,1,1,1},{1,1,2},{2,2},{1,3}. So
output should be 4. For N = 10 and S = {2, 5, 3, 6}, there are five solutions: {2,2,2,2,2}, {2,2,3,3},
{2,2,6}, {2,3,5} and {5,5}. So the output should be 5
Code:
#include<stdio.h>
#include<conio.h>
#define P printf("\n")
int d[12],val[12][12],J,n,i,j,k;
int min(int,int);
void MakeAChange();
void disp();
void main()
{
clrscr();
for(i=1;i<=n;i++)
{
printf("Enter v%d :--> ",i);
scanf("%d",&d[i]);
}
P;
void MakeAChange()
{
int a1,a2;
for(i=1;i<=n;i++)
{
for(j=0;j<=J;j++)
{
if(j==0)
{
val[i][j]=0;
}
if(j!=0 && i==1)
{
val[i][j]=j;
}
if(j!=0 && i!=1)
{
a1=val[i-1][j]; // Memory Function
a2=(val[i][j-d[i]])+1;
if((j-d[i])<0)
val[i][j]=a1;
else
val[i][j]=min(a1,a2);
}
}
}
P;P;
disp();
}
void disp()
{
P;P;
printf(" "); // Create Table
for(i=0;i<=J;i++)
printf("%02d ",i);
P;
printf(" ");
53
for(i=0;i<=J;i++)
printf("----");
P;
for(i=1;i<=n;i++)
{
printf("%02d | ",d[i]);
for(j=0;j<=J;j++)
{
printf("%02d ",val[i][j]);
}
printf("\n\n");
}
}
54
Output:
55
Give the Answer to the below Short Questions:
1.What is time complexity of making change using dynamic programming?
In Dynamic programming problems, Time Complexity is the number of unique states/subproblems * time taken
per state. In this problem, for a given n, there are n unique states/subproblems. For convenience, each state is said
to be solved in a constant time. Hence the time complexity is O(n * 1).
2. If S = 5 and N = {1,2,3}, means we have a sum of 5 and want to make change for thissum
using coins of denomination 1,2 and 3. There is infinite supply of these coins. We have to
find in how many ways we can make this change.
ANS:
1) Optimal Substructure
To count the total number of solutions, we can divide all set solutions into two sets.
1) Solutions that do not contain mth coin (or Sm).
2) Solutions that contain at least one Sm.
Let count(S[], m, n) be the function to count the number of solutions, then it can be written as sum
of count(S[], m-1, n) and count(S[], m, n-Sm).
Therefore, the problem has optimal substructure property as the problem can be solved using
solutions to subproblems.
2) Overlapping Subproblems
Following is a simple recursive implementation of the Coin Change problem. The implementation
simply follows the recursive structure mentioned above.
Conclusion / Outcome:
56
Practical Set- 8
Problem Scenario
A thief is robbing a store and can carry a maximal weight of W into his knapsack. There are n
items available in the store and weight of ith item is wi and its profit is pi. What items should the
thief take?
In this context, the items should be selected in such a way that the thief will carry those items for
which he will gain maximum profit. Hence, the objective of the thief is to maximize the profit.
Fractional Knapsack
Knapsack
Fractional Knapsack
In this case, items can be broken into smaller pieces, hence the thief can select fractions of items.
57
The ith item contributes the weight xi.wixi.wi to the total weight in the knapsack and
profit xi.pixi.pi to the total profit.
Hence, the objective of this algorithm is to
maximize∑n=1n(xi.pi) maximize∑n=1n(xi.pi)
subject to constraint,
∑n=1n(xi.wi)⩽W∑n=1n(xi.wi)⩽W
It is clear that an optimal solution must fill the knapsack exactly, otherwise we could add a
fraction of one of the remaining items and increase the overall profit.
In this context, first we need to sort those items according to the value of pi/wi, so
that pi+1wi+1pi+1wi+1≤ pi/wi . Here, x is an array to store the fraction of items.
Analysis
If the provided items are already sorted into a decreasing order of pi/wi, then the whileloop takes
a time in O(n); Therefore, the total time including the sort is in O(n logn).
58
Example
Let us consider that the capacity of the knapsack W = 60 and the list of provided items are shown
in the following table −
Item A B C D
Weight 40 10 20 24
Ratio (pi)/(wi) 7 10 6 5
As the provided items are not sorted based on pi/wi. After sorting, the items are as shown in the
following table.
Item B A C D
Weight 10 40 20 24
Ratio (pi/wi) 10 7 6 5
Solution
After sorting all the items according to pi/wi. First all of B is chosen as weight of B is less than
the capacity of the knapsack. Next, item A is chosen, as the available capacity of the knapsack is
greater than the weight of A. Now, C is chosen as the next item. However, the whole item cannot
be chosen as the remaining capacity of the knapsack is less than the weight of C.
Hence, fraction of C (i.e. (60 − 50)/20) is chosen.
Now, the capacity of the Knapsack is equal to the selected items. Hence, no more item can be
selected.
And the total profit is 100 + 280 + 120 * (10/20) = 380 + 60 = 440
This is the optimal solution. We cannot gain more profit selecting any different combination of
items.
59
Code:
#include<stdio.h>
#include<time.h>
#include<conio.h>
void knapsack(float capacity, int n, float weight[], float profit[])
{
float x[20], totalprofit,y;
int i,j;
y=capacity;
totalprofit=0;
for(i=0;i < n;i++)
x[i]=0.0;
for(i=0;i < n;i++)
{
if(weight[i] > y)
break;
else
{
x[i]=1.0;
totalprofit=totalprofit+profit[i];
y=y-weight[i];
}
}
if(i < n)
x[i]=y/weight[i];
totalprofit=totalprofit+(x[i]*profit[i]);
printf("The selected elements are:-\n ");
for(i=0;i < n;i++)
if(x[i]==1.0)
printf("\nProfit is %f with weight %f ", profit[i], weight[i]);
else if(x[i] > 0.0)
printf("\n%f part of Profit %f with weight %f", x[i], profit[i], weight[i]);
printf("\nTotal profit for %d objects with capacity %f = %f\n\n", n, capacity,totalprofit);
}
void main()
{
float weight[20],profit[20],ratio[20], t1,t2,t3;
int n;
time_t start,stop;
float capacity;
int i,j;
printf("Enter number of objects: ");
scanf("%d", &n);
printf("\nEnter the capacity of knapsack: ");
60
scanf("%f", &capacity);
for(i=0;i < n;i++)
{
printf("\nEnter %d(th) profit: ", (i+1));
scanf("%f", &profit[i]);
printf("Enter %d(th) weight: ", (i+1));
scanf("%f", &weight[i]);
ratio[i]=profit[i]/weight[i];
}
start=time(NULL);
for(i=0;i < n;i++)
for(j=0;j < n;j++)
{
if(ratio[i] > ratio[j])
{
t1=ratio[i];
ratio[i]=ratio[j];
ratio[j]=t1;
t2=weight[i];
weight[i]=weight[j];
weight[j]=t2;
t3=profit[i];
profit[i]=profit[j];
profit[j]=t3;
}
}
knapsack(capacity,n,weight,profit);
stop=time(NULL);
printf("\nKnapsack = %f\n", difftime(stop,start));
getch();
}
61
Output:
62
Give the Answer to the below Short Questions:
1. The Knapsack problem is an example of
a) Greedy algorithm b) 2D dynamic programming
c) 1D dynamic programming d) Divide and conquer Answer: (A )
2. Which of the following methods can be used to solve the Knapsack problem?
a) Brute force algorithm b) Recursion
c) Dynamic programming d) All of the mentioned Answer:
(B)
3. You are given a knapsack that can carry a maximum weight of 60. There are 4 items withweights
{20, 30, 40, 70} and values {70, 80, 90, 200}. What is the maximum value of the items you can
carry using the knapsack?
a) 160 b) 200
c) 170 d) 90 Answer: (C )
b) You are studying for an exam and you have to study N questions. The questions take {t1, t2,
t3,… .., tn} time(in hours) and carry {m1, m2, m3,…., mn} marks. You can study for amaximum
of T hours. You can either study a question or leave it. Choose the questions in such a way that
your score is maximized.
c) You are given infinite coins of denominations {v1, v2, v3,….., vn} and a sum S. You haveto
find the minimum number of coins required to get the sum S.
Answer: (B )
Answer: ( A)
63
Practical Set-9
Explanation:
A standard DFS implementation puts each vertex of the graph into one of two categories:
1. Visited
2. Not Visited
The purpose of the algorithm is to mark each vertex as visited while avoiding cycles.
DFS Example
Let's see how the Depth First Search algorithm works with an example. We use an undirected
graph with 5 vertices.
64
We start from vertex 0, the DFS algorithm starts by putting it in the Visited list and putting all its
adjacent vertices in the stack.
Next, we visit the element at the top of stack i.e. 1 and go to its adjacent nodes. Since 0 has
already been visited, we visit 2 instead.
Vertex 2 has an unvisited adjacent vertex in 4, so we add that to the top of the stack and visit it.
65
After we visit the last element 3, it doesn't have any unvisited adjacent nodes, so we have
completed the Depth First Traversal of the graph.
Code:
#include <stdio.h>
#include <stdlib.h>
struct node {
int vertex;
struct node* next;
};
struct Graph {
int numVertices;
int* visited;
graph->visited[vertex] = 1;
printf("Visited %d \n", vertex);
if (graph->visited[connectedVertex] == 0) {
DFS(graph, connectedVertex);
}
temp = temp->next;
}
}
// Create a node
struct node* createNode(int v) {
struct node* newNode = malloc(sizeof(struct node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
// Create graph
struct Graph* createGraph(int vertices) {
struct Graph* graph = malloc(sizeof(struct Graph));
graph->numVertices = vertices;
int i;
for (i = 0; i < vertices; i++) {
graph->adjLists[i] = NULL;
graph->visited[i] = 0;
}
return graph;
}
// Add edge
void addEdge(struct Graph* graph, int src, int dest) {
// Add edge from src to dest
struct node* newNode = createNode(dest);
newNode->next = graph->adjLists[src];
graph->adjLists[src] = newNode;
int main() {
struct Graph* graph = createGraph(4);
addEdge(graph, 0, 1);
addEdge(graph, 0, 2);
addEdge(graph, 1, 2);
addEdge(graph, 2, 3);
printGraph(graph);
DFS(graph, 2);
return 0;
}
68
OUTPUT:
69
Output:
70
Give the Answer to Questions:
1. Depth First Search is equivalent to which of the traversal in the BinaryTrees?
a) Pre-order Traversal b) Post-order Traversal
c) Level-order Traversal d) In-order Traversal Answer: (C)
Conclusion/ Outcome:
Here we conclude Implementation of Graph and Searching (DFS) How its work and how to implement.
71
Practical Set-10
Explanation:
Traversal means visiting all the nodes of a graph. Breadth first traversal or Breadth first Search is
a recursive algorithm for searching all the vertices of a graph or tree data structure. In this article,
you will learn with the help of examples the BFS algorithm, BFS pseudocode and the code of the
breadth first search algorithm with implementation in C++, C, Java and Python programs.
BFS algorithm
A standard DFS implementation puts each vertex of the graph into one of two categories:
1. Visited
2. Not Visited
The purpose of the algorithm is to mark each vertex as visited while avoiding cycles.
The algorithm works as follows:
1. Start by putting any one of the graph's vertices at the back of aqueue.
2. Take the front item of the queue and add it to the visited list.
3. Create a list of that vertex's adjacent nodes. Add the ones which aren't in the visited list to
the back of the queue.
4. Keep repeating steps 2 and 3 until the queue is empty.
The graph might have two different disconnected parts so to make sure that we cover every
vertex, we can also run the BFS algorithm on every node
BFS example
Let's see how the Breadth First Search algorithm works with an example. We use an undirected
graph with 5 vertices.
72
We start from vertex 0, the BFS algorithm starts by putting it in the Visited list and putting all its
adjacent vertices in the stack.
Next, we visit the element at the front of queue i.e. 1 and go to its adjacent nodes. Since 0 has
already been visited, we visit 2 instead.
Vertex 2 has an unvisited adjacent vertex in 4, so we add that to the back of the queue and visit 3,
which is at the front of the queue.
73
Only 4 remains in the queue since the only adjacent node of 3 i.e. 0 is already visited. We visit it.
Since the queue is empty, we have completed the Depth First Traversal of the graph.
Code:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 40
struct queue {
int items[SIZE];
int front;
int rear;
};
struct node {
int vertex;
struct node* next;
};
struct Graph {
int numVertices;
struct node** adjLists;
int* visited;
};
// BFS algorithm
void bfs(struct Graph* graph, int startVertex) {
struct queue* q = createQueue();
graph->visited[startVertex] = 1;
enqueue(q, startVertex);
while (!isEmpty(q)) {
printQueue(q);
int currentVertex = dequeue(q);
printf("Visited %d\n", currentVertex);
while (temp) {
int adjVertex = temp->vertex;
if (graph->visited[adjVertex] == 0) {
graph->visited[adjVertex] = 1;
enqueue(q, adjVertex);
}
temp = temp->next;
}
}
}
// Creating a node
struct node* createNode(int v) {
struct node* newNode = malloc(sizeof(struct node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
// Creating a graph
struct Graph* createGraph(int vertices) {
75
struct Graph* graph = malloc(sizeof(struct Graph));
graph->numVertices = vertices;
int i;
for (i = 0; i < vertices; i++) {
graph->adjLists[i] = NULL;
graph->visited[i] = 0;
}
return graph;
}
// Add edge
void addEdge(struct Graph* graph, int src, int dest) {
// Add edge from src to dest
struct node* newNode = createNode(dest);
newNode->next = graph->adjLists[src];
graph->adjLists[src] = newNode;
// Create a queue
struct queue* createQueue() {
struct queue* q = malloc(sizeof(struct queue));
q->front = -1;
q->rear = -1;
return q;
}
if (isEmpty(q)) {
printf("Queue is empty");
} else {
printf("\nQueue contains \n");
for (i = q->front; i < q->rear + 1; i++) {
printf("%d ", q->items[i]);
}
}
}
int main() {
struct Graph* graph = createGraph(6);
addEdge(graph, 0, 1);
addEdge(graph, 0, 2);
addEdge(graph, 1, 2);
addEdge(graph, 1, 4);
addEdge(graph, 1, 3);
addEdge(graph, 2, 4);
addEdge(graph, 3, 4);
bfs(graph, 0);
return 0;
}
77
78
79
Output:
3. The Data structure used in standard implementation of Breadth First Search is?
a) Stack b) Queue
c) Linked List d) None Answer: (B )
80
4. What can be the applications of Breadth First Search?
a) Finding shortest path between two nodes
b) Finding bipartitions of a graph
c) GPS navigation system
d) All of the mentioned Answer: (C )
Conclusion/ Outcome:
Here we lern about best firsty search how to implement and use.
81
Practical Set-11
Explanation:
The idea behind Prim’s algorithm is simple, a spanning tree means all vertices must be connected.
So the two disjoint subsets (discussed above) of vertices must be connected to make
a Spanning Tree. And they must be connected with the minimum weight edge to make it
a Minimum Spanning Tree.
Algorithm
1) Create a set mstSet that keeps track of vertices already included in MST.
2) Assign a key value to all vertices in the input graph. Initialize all key values as INFINITE.
Assign key value as 0 for the first vertex so that it is picked first.
3) While mstSet doesn’t include all vertices
a) Pick a vertex u which is not there in mstSet and has minimum key value.
b) Include u to mstSet.
c) Update key value of all adjacent vertices of u. To update the key values, iteratethrough
all adjacent vertices. For every adjacent vertex v, if weight of edge u-v is less than the
previous key value of v, update the key value as weight of u-v
The idea of using key values is to pick the minimum weight edge from cut. The key values are
used only for vertices which are not yet included in MST, the key value for these vertices indicate
the minimum weight edges connecting them to the set of vertices included in MST.
Example:
The set mstSet is initially empty and keys assigned to vertices are {0, INF, INF, INF, INF, INF,
INF, INF} where INF indicates infinite. Now pick the vertex with minimum key value. The vertex
0 is picked, include it in mstSet. So mstSet becomes {0}. After including to mstSet, update key
values of adjacent vertices. Adjacent vertices of 0 are 1 and 7. The key values of 1 and 7 are
updated as 4 and 8. Following subgraph shows vertices and their key values, only the vertices
with finite key values are shown. The vertices included in MST are shown in green color.
82
Pick the vertex with minimum key value and not already included in MST (not in mstSET). The
vertex 1 is picked and added to mstSet. So mstSet now becomes {0, 1}. Update the key values of
adjacent vertices of 1. The key value of vertex 2 becomes 8.
Pick the vertex with minimum key value and not already included in MST (not in mstSET).
We can either pick vertex 7 or vertex 2, let vertex 7 is picked. So mstSet now becomes {0, 1, 7}.
Update the key values of adjacent vertices of 7. The key value of vertex 6 and 8 becomes finite
(7 and 1 respectively).
Pick the vertex with minimum key value and not already included in MST (not in mstSET).
Vertex 6 is picked. So mstSet now becomes {0, 1, 7, 6}. Update the key values of adjacent
vertices of 6. The key value of vertex 5 and 8 are updated.
83
We repeat the above steps until mstSet includes all vertices of given graph. Finally, we get the
following graph.
Code:
#include<stdio.h>
#include<stdbool.h>
int main() {
int no_edge; // number of edge
return 0;
}
85
Output:
1. What is the time complexity to extract a vertex from the priority queue in
Prim’s algorithm?
a) log (V) c) V.V
b) E.E d) log (E) Answer: (A )
2. What algorithm technique is used in the implementation of Prim’s solution for the MST?
86
a) Greedy Technique
b) Divide-and-Conquer Technique00
c) Dynamic Programming Technique
d) The algorithm combines more than one of the above techniques Answer: (B )
87
3. The output of Prims algorithm is KRushkal algorithem .
In computer science, Prim's (also known as Jarník's) algorithm is a greedy algorithm that finds a
minimum spanning tree for a weighted undirected graph. This means it finds a subset of the edges
that forms a tree that includes every vertex, where the total weight of all the edges in the tree is
minimized.
Conclusion/ Outcome:
88
Practical Set-12
Explanation:
Below are the steps for finding MST using Kruskal’s algorithm
1. Sort all the edges in non-decreasing order of their weight.
2. Pick the smallest edge. Check if it forms a cycle with the spanning tree formed so far. If cycleis
not formed, include this edge. Else, discard it.
3. Repeat step#2 until there are (V-1) edges in the spanning tree.
The algorithm is a Greedy Algorithm. The Greedy Choice is to pick the smallest weight edge that
does not cause a cycle in the MST constructed so far. Let us understand it with an example:
Consider the below input graph.
The graph contains 9 vertices and 14 edges. So, the minimum spanning tree formed will be having
(9 – 1) = 8 edges.
After sorting:
Weight Src Dest
1 7 6
2 8 2
2 6 5
4 0 1
4 2 5
6 8 6
7 2 3
7 7 8
8 0 7
8 1 2
9 3 4
10 5 4
11 1 7
14 3 5
89
Now pick all edges one by one from sorted list of edges
90
6. Pick edge 8-6: Since including this edge results in cycle, discard it.
8. Pick edge 7-8: Since including this edge results in cycle, discard it.
10. Pick edge 1-2: Since including this edge results in cycle, discard it.
Since the number of edges included equals (V – 1), the algorithm stops here.
91
Code:
#include <stdio.h>
#define MAX 30
edge_list elist;
int Graph[MAX][MAX], n;
edge_list spanlist;
void kruskalAlgo();
int find(int belongs[], int vertexno);
void applyUnion(int belongs[], int c1, int c2);
void sort();
void print();
sort();
spanlist.n = 0;
92
for (i = 0; i < elist.n; i++) {
cno1 = find(belongs, elist.data[i].u);
cno2 = find(belongs, elist.data[i].v);
if (cno1 != cno2) {
spanlist.data[spanlist.n] = elist.data[i];
spanlist.n = spanlist.n + 1;
applyUnion(belongs, cno1, cno2);
}
}
}
// Sorting algo
void sort() {
int i, j;
edge temp;
int main() {
93
int i, j, total_cost;
n = 6;
Graph[0][0] = 0;
Graph[0][1] = 4;
Graph[0][2] = 4;
Graph[0][3] = 0;
Graph[0][4] = 0;
Graph[0][5] = 0;
Graph[0][6] = 0;
Graph[1][0] = 4;
Graph[1][1] = 0;
Graph[1][2] = 2;
Graph[1][3] = 0;
Graph[1][4] = 0;
Graph[1][5] = 0;
Graph[1][6] = 0;
Graph[2][0] = 4;
Graph[2][1] = 2;
Graph[2][2] = 0;
Graph[2][3] = 3;
Graph[2][4] = 4;
Graph[2][5] = 0;
Graph[2][6] = 0;
Graph[3][0] = 0;
Graph[3][1] = 0;
Graph[3][2] = 3;
Graph[3][3] = 0;
Graph[3][4] = 3;
Graph[3][5] = 0;
Graph[3][6] = 0;
Graph[4][0] = 0;
Graph[4][1] = 0;
Graph[4][2] = 4;
Graph[4][3] = 3;
Graph[4][4] = 0;
Graph[4][5] = 0;
Graph[4][6] = 0;
Graph[5][0] = 0;
Graph[5][1] = 0;
Graph[5][2] = 2;
Graph[5][3] = 0;
Graph[5][4] = 3;
Graph[5][5] = 0;
Graph[5][6] = 0;
94
kruskalAlgo();
print();
}
95
Output:
Ans:[D}
96
2. The output of Krushkal’s algorithm is Spanning Tree .
4. Assume a graph is having 10 vertices and 20 edges. In Krushkal’s minimum spanning tree
method, 5 edges are rejected. How many edges are not considered during execution of
algorithm on the given graph?
a) 6 c) 5
b) 4 d) 10 Answer: (C )
Conclusion/ Outcome:
Here we conclude how krushkal algorithem works and implement.
97
References
1. http://www.personal.kent.edu/~rmuhamma/Algorithms/algorithm.html
2. http://www.princeton.edu/~achaney/tmve/wiki100k/docs/Merge_sort.html
3. http://cs.uef.fi/pages/franti/asa/notes.html
4. https://www8.cs.umu.se/kurser/TDBA77/VT06/algorithms/INDEX.HTM
5. IETE e Material
6. https://www.geeksforgeeks.org
7. https://www.programiz.com/
8. https://www.thecrazyprogrammer.com
9. http://c-program-example.com/2011/10
10.https://www.tutorialspoint.com/data_structures_algorithms
11.http://www.c4learn.com/c-programs
12.http://c-program-example.com/
98