Professional Documents
Culture Documents
Practical -1
Aim:
Sort a given set of elements using Insertion sort method and determine the time required to sort
the elements. Plot the graph of the time taken versus n. The elements can be generated using
random number generator.
Insertion-Sort (A)
for j = 2 to A.length()
key = A[ j ]
// Insert A[ j ] into the sorted sequence A[ 1….j-1 ]
i = j -1
while i > 0 and A[ i ] > key
A [ i +1 ] = A [ i ]
i=i–1
A[ i + 1 ] = key
Code:
import time
import numpy.random as np
list1=[]
def insertion_sort(A):
for j in range(2,len(A)):
key=A[j]
i=j-1
A[i+1]=A[i]
1
2316043
i=i-1
A[i+1]=key
list2=[]
for i in range(5,0,-1):
A=np.randint(i, 900,i*1000)
list1.append(len(A))
Starttime=time.clock()
insertion_sort(A)
endtime=time.clock()
list2.append(endtime - Starttime)
plt.plot(list1,list2)
Output:
[5000, 4000, 3000, 2000, 1000]
[4.181740838952919, 2.6366416284978413, 1.5231062973732605,
0.6836392882361224, 0.16351879782666856]
2
2316043
Practical – 2
Aim:
Sort a given set of elements using Merge sort and determine the time required to sort the
elements. Plot a graph of time taken versus n. The elements can be generated random number
generator.
Merge ( A , p , q , r )
n1 q – p +1
n2 r – q
create arrays L [ 1..…n1+1] & R [ 1……n2+1]
for i 1 to n1
do L[ i ] A[ p + i -1 ]
for j 1 to n2
do R[ j ] A[ q + p]
L[ n1 + 1] ∞
R[ n2 + 1] ∞
I1
J1
for k p to r
do if L[ i ] <= R[ j ]
A[ k ] L [ i ]
i i+1
else
A[k] R[j]
Jj+1
Merge_Sort ( A , p , r )
if p < r then
q L [ ( p + (r -1))//2 ]
Merge_Sort ( A , p, q )
3
2316043
Merge_Sort ( A , q+1 , r )
Merge ( A , p , q , r )
Code:
import time
import numpy.random as np
list1=[]
def merge(arr,p,q,r):
n1=q-p+1
n2=r-q
L=[0]*(n1)
R=[0]*(n2)
for i in range(0,n1):
L[i]=arr[p+i]
for j in range(0,n2):
R[j]=arr[q+1+j]
i=0
j=0
k=1
if(L[i]<=R[j]):
arr[k]=L[i]
i+=1
else:
arr[k]=R[j]
j+=1
4
2316043
k+=1
while i<n1:
arr[k]=L[i]
i+=1
k+=1
while j<n2:
arr[k]=R[j]
j+=1
k+=1
def mergeSort(arr,p,r):
if p<r:
q=(p+(r-1))//2
mergeSort(arr,p,q)
mergeSort(arr,q+1,r)
merge(arr,p,q,r)
list2=[]
for i in range(0,5,1):
arr=np.randint(i, 900,i*1000)
list1.append(len(arr))
Starttime=time.clock()
mergeSort(arr,0,len(arr)-1)
endtime=time.clock()
list2.append(endtime - Starttime)
plt.plot(list1,list2)
5
2316043
Output:
[0, 1000, 2000, 3000, 4000]
[2.133328784736932e-06, 0.00887720772862366, 0.01926822556112029,
0.03390627433328319, 0.057405744201076914]
--
6
2316043
Practical – 3
Aim:
Sort a given set of elements using Quick sort and determine the time required to sort the
elements. Plot a graph of time taken versus n. The elements can be generated random number
generator.
Algorithm:
Quick_Sort ( A, p , r )
if p < r then
q Partition ( A , p , r )
Quick_Sort ( A , p , q-1 )
Quick_Sort ( A , q+1 , r )
Partition ( A , p , r )
XA[r]
i p -1
for j p to r-1
do if A[ j ] <= x then
i i +1
Exchange A[ i ] A[ j ]
Exchange A[ i+1 ] A[ r ]
return i+1
Code:
import time
import numpy.random as np
list1=[]
def partition(A,p,r):
7
2316043
pivot=A[r]
i=p-1
for j in range(p,r):
if A[j]<=pivot:
i=i+1
A[i],A[j]=A[j],A[i]
A[i+1],A[r]=A[r],A[i+1]
return (i+1)
def quicksort(A,p,r):
if p<r:
q=partition(A,p,r)
quicksort(A,p,q-1)
quicksort(A,q+1,r)
list2=[]
A = None
for i in range(5,0,-1):
A=np.randint(i, 900,i*1000)
list1.append(len(A))
Starttime=time.clock()
quicksort(A,0,len(A)-1)
endtime=time.clock()
list2.append(endtime - Starttime)
plt.plot(list1,list2)
8
2316043
Output:
[5000, 4000, 3000, 2000, 1000]
[0.04519831225363902, 0.03296019772623282, 0.024484453939617623,
0.013818320519646932, 0.006184599314458694]
9
2316043
Practical – 4
Aim:
Sort a given set of elements using Heap sort and determine the time required to sort the elements.
Plot a graph of time taken versus n. The elements can be generated random number generator
Algorithm:
MaxHeapify(A, i)
then largest l
else largest i
then largest r
if largest != i
MaxHeapify(A, largest)
end function
BuildMaxHeap(A)
heap-size[A] length[A]
for i length[A] to -1
do MaxHeapify(A, i)
end function
HeapSort(A)
BuildMaxHeap(A)
10
2316043
for i = length[A]-1 to 0
heap-size[A] = heap-size[A] – 1
MaxHeapify(A, 1)
end function
Code:
import numpy.random as np
import time
class Heap:
def __init__(self):
self.arr = None
self.size = None
def left(i):
return 2*i+1
def right(i):
return 2*i+2
def max_heapify(heap,i):
L=left(i)
R=right(i)
#print(i)
largest=L
else:
largest=i
11
2316043
if R < heap.size and heap.arr[R]>heap.arr[largest]:
largest=R
if largest != i:
heap.arr[i],heap.arr[largest]=heap.arr[largest],heap.arr[i]
max_heapify(heap,largest)
def build_max_heap(heap):
for i in range(heap.size//2,-1,-1):
max_heapify(heap,i)
def heap_sort(heap):
build_max_heap(heap)
for i in range(heap.size-1,0,-1):
heap.arr[i],heap.arr[0] = heap.arr[0],heap.arr[i]
heap.size -= 1
max_heapify(heap,0)
list2=[]
list1 = []
for i in range(5,0,-1):
heap = Heap()
heap.size = len(heap.arr)
list1.append(heap.size)
Starttime=time.clock()
heap_sort(heap)
endtime=time.clock()
list2.append(endtime - Starttime)
12
2316043
print(list1)
print(list2)
plt.plot(list1,list2)
plt.show()
Output:
13
2316043
Practical-5
Aim:
a. Print all the nodes reachable from a given starting node in a digraph using BFS method.
b. Check whether a given graph is connected or not using DFS method.
Algorithm:
bfs(graph, root)
visited.append(root)
while queue
vertex queue.popleft()
visited.append(neighbour)
queue.append(neighbour)
return visited
dfs(graph,root,visited = None)
if visited == None
visited list()
visited.append(root)
dfs(graph,neighbor,visited)
return visited
14
2316043
Code:
import networkx as nx
visited.append(root)
while queue:
vertex = queue.popleft()
visited.append(neighbour)
queue.append(neighbour)
return visited
if visited == None:
visited = list()
visited.append(root)
dfs(graph,neighbor,visited)
return visited
G = nx.DiGraph()
G.add_edge(5,1)
15
2316043
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(2,5)
G.add_edge(5,3)
G.add_edge(2,1)
G.add_edge(3,4)
nx.draw_networkx(G)
plt.show()
Output:
16
2316043
Practical – 6
Aim:
Algorithm:
lcs(X,Y,m,n)
if(m==0 or n==0)
return (0)
elif(X[m-1]==Y[n-1])
return (1+lcs(X,Y,m-1,n-1))
else:
return max(lcs(X,Y,m,n-1),lcs(X,Y,m-1,n))
Code:
def lcs(X,Y,m,n):
if(m==0 or n==0):
return (0)
elif(X[m-1]==Y[n-1]):
return (1+lcs(X,Y,m-1,n-1))
else:
return max(lcs(X,Y,m,n-1),lcs(X,Y,m-1,n))
X="knowledge"
Y="pledge"
Output:
17
2316043
Practical – 7
Aim:
Compute the transitive closure of a given directed graph using Warshall's algorithm.
Algorithm:
for k 1 to n do
for I 1 to n do
for j 1 to n do
return R(n)
Code:
import networkx as nx
def printSolution(reach):
ll=[]
for i in range(4):
l=[]
for j in range(4):
l.append(reach[i][j])
ll.append(l)
print()
def transitiveClosure(graph):
18
2316043
for k in range(4):
for i in range(4):
for j in range(4):
printSolution(reach)
G = nx.DiGraph()
G.add_edge(1,1)
G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,2)
G.add_edge(2,3)
G.add_edge(3,3)
G.add_edge(3,4)
G.add_edge(4,4)
G.add_edge(4,3)
nx.draw_networkx(G)
plt.show()
[0, 1, 1, 0],
[0, 0, 1, 1],
[0, 0, 1, 1]]
transitiveClosure(graph)
19
2316043
Output:
20
2316043
Practical – 8
Aim:
Code:
class QueenChessBoard:
self.size = size
self.columns = []
self.columns.append(column)
def remove_in_current_row(self):
21
2316043
return self.columns.pop()
row = len(self.columns)
if column == queen_column:
return False
return False
return False
return True
def display(self):
if column == self.columns[row]:
else:
print()
def solve_queen(size):
board = QueenChessBoard(size)
number_of_solutions = 0
row = 0
22
2316043
column = 0
while True:
if board.is_this_column_safe_in_next_row(column):
board.place_in_next_row(column)
row += 1
column = 0
break
else:
column += 1
if row == size:
board.display()
print()
number_of_solutions += 1
board.remove_in_current_row()
row -= 1
try:
prev_column = board.remove_in_current_row()
except IndexError:
break
row -= 1
column = 1 + prev_column
n = int(input('Enter n: '))
solve_queen(n)
23
2316043
Output:
24
2316043
Practical – 9
Aim:
Code:
import networkx as nx
def TopologicalSort(graph):
TopologicalSortedList = []
ZeroInDegreeVertexList = []
for u in graph:
for v in graph[u]:
inDegree[v] += 1
for k in inDegree:
if (inDegree[k] == 0):
ZeroInDegreeVertexList.append(k)
while ZeroInDegreeVertexList:
v = ZeroInDegreeVertexList.pop(0)
TopologicalSortedList.append(v)
25
2316043
for neighbour in graph[v]:
inDegree[neighbour] -= 1
if (inDegree[neighbour] == 0):
ZeroInDegreeVertexList.append(neighbour)
return TopologicalSortedList
graph = {
'1': set(['2','3']),
'2': set(['4']),
'3': set(['2','4']),
'4': set([])
G = nx.DiGraph()
G.add_edge(1,2)
G.add_edge(2,4)
G.add_edge(1,3)
G.add_edge(3,2)
G.add_edge(3,4)
nx.draw_networkx(G)
plt.show()
result = TopologicalSort(graph)
if (len(result) == len(graph)):
else:
26
2316043
Output
27
2316043
Practical – 9
Aim:
HUFFMAN(C)
n ← |C|
Q←C
for i 1 to n - 1
INSERT(Q, z)
return EXTRACT-MIN(Q)
Code:
import heapq
def encode(frequency):
heapq.heapify(heap)
lo = heapq.heappop(heap)
hi = heapq.heappop(heap)
28
2316043
pair[1] = '1' + pair[1]
data = "SHIVANI"
frequency = defaultdict(int)
frequency[symbol] += 1
huff = encode(frequency)
for p in huff:
Output:
29