DAA (all python prgms)(new)
DAA (all python prgms)(new)
import time
import random
import matplotlib.pyplot as plt
plt.plot(n_values, times)
plt.xlabel('n')
plt.ylabel('Time taken (seconds)')
plt.show()
import time
import random
import matplotlib.pyplot as plt
def binary_search (arr, x):
low=0
high = len (arr) -1
while low<=high:
mid=(low+high)//2
if arr [mid]==x:
return mid
elif arr[mid]<x:
low = mid + 1
else:
high = mid-1
return -1
n_values=(10,100,1000,10000,100000)
times = []
for n in n_values:
arr= [random.randint(0,n) for _ in range (n)]
print("the value of n=",n)
print("The Array values::",arr)
x=random.randint(0,n)
print("the value of x=",x)
start_time=time.time()
print("start time = ",start_time)
binary_search(arr,x)
end_time=time.time()
print("End time=",end_time)
times.append(end_time - start_time)
plt.plot(n_values,times)
plt.xlabel('n')
plt.ylabel ("Time laken (seconds)")
plt.show()
def move_disk(source,dest):
print(f"Move disk from {source}to{dest}")
def tower_of_hanoi(n,source,temp,dest):
if n==1:
move_disk(source,dest)
else:
tower_of_hanoi(n-1,source,dest,temp)
move_disk(source,dest)
tower_of_hanoi(n-1,temp,source,dest)
num_disks=int(input("Enter the number of disks:"))
tower_of_hanoi(num_disks,'A','B','C')
import time
import random
import matplotlib.pyplot as plt
def selection_sort(arr):
n = len(arr)
for i in range(0,n-1):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
n_values = [10, 100, 1000]
times = []
for n in n_values:
arr=['random.randint(0,n)for_in range(n)']
start_time = time.time()
selection_sort(arr)
end_time = time.time()
times.append(end_time-start_time)
plt.plot(n_values, times)
plt.xlabel('n')
plt.ylabel('Time taken (seconds)')
plt.show()
output:
result = 1
for i in range(n):
result*=a
return result
def divideconquer(a, n):
if n == 0:
return 1
elif n % 2 == 0:
return divideconquer(a*a, n//2)
else:
return a * divideconquer(a*a, (n-1)//2)
import time
import matplotlib.pyplot as plt
import random
def quicksort(arr):
if len(arr)<=1:
return arr
pivot=arr[0]
left=[x for x in arr[1:] if x <=pivot]
right=[x for x in arr[1:] if x >=pivot]
return quicksort(left)+[pivot]+quicksort(right)
n_values=[10,100,500,750,900]
time_taken=[]
for n in n_values:
arr=[i for i in range(n)]
#random.shuffle(arr)
start_time = time.time()
print(arr)
sorted_arr = quicksort(arr)
pass
end_time = time.time()
time_taken.append(end_time - start_time)
print(f"sorted {n} elements in {end_time-start_time:.6f} seconds")
plt.figure(figsize=(10,6))
plt.plot(n_values,time_taken)
plt.xlabel("number of elements(n)")
plt.ylabel("time taken (seconds)")
plt.title("quick sort performance")
plt.grid(True)
plt.show()
def binomial_brute_force(n,k):
if k==0 or k==n:
return 1
else:
return binomial_brute_force(n-1,k-1)+binomial_brute_force(n-1,k)
def binomial_dynamic(n,k):
dp=[[0 for i in range(k+1)]for j in range(n+1)]
for i in range(n+1):
for j in range(min(i,k)+1):
if j ==0 or j==i:
dp[i][j]=1
else:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
return dp[n][k]
n=eval(input("enter the n value::"))
k=eval(input("enter the k value::"))
print(f"Brute-force method:{binomial_brute_force(n,k)}")
print(f"Dynamic programming method:{binomial_dynamic(n,k)}")
nv=4
INF=999
def floyd(G):
#dist = (list map(lambda p:list(map(lambda:q,p)),G))
dist=[row[:] for row in G]
for r in range(nv):
for p in range(nv):
for q in range(nv):
dist[p][q]=min(dist[p][q],dist[p][r]+dist[r][q])
sol(dist)
def sol(dist):
for p in range(nv):
for q in range(nv):
if(dist[p][q]==INF):
print("INF",end=" ")
else:
print(dist[p][q],end=" ")
print(" ")
G=[
[0,5,INF,INF],
[10,0,15,5],
[40,INF,0,15],
[45,INF,5,0]
]
floyd(G)
output:
0 5 15 10
10 0 10 5
40 45 0 15
45 50 5 0
output:
Brute_force time: 0.015601873397827148
Horner's rule time: 0.0
10) write a program to solve the string matching problrm using Boyer-
Moore approach.
def boyer_moore(text,pattern):
m=len(pattern)
n=len(text)
bad_char=[-1]*256
for i in range(m):
bad_char[ord(pattern[i])]=i
s=0
while s<=n-m:
j=m-1
while j>=0 and pattern[j]==text[s+j]:
j=-1
if j<0:
print("pattern found at shift",s)
s+=m-bad_char[ord(text[s+m])] if s+m<n else 1
else:
s+=max(1,j-bad_char[ord(text[s+j])])
boyer_moore("ABAAABCD","ABC")
output:
pattern found at shift 4
11)Write a program to solve the string matching problem using KMP
algorithm.
def kmp_prefix_function(pattern):
pi=[0]*len(pattern)
k=0
for q in range(1,len(pattern)):
k=pi[k-1]
if pattern[k]==pattern[q]:
k +=1
pi[q]=k
return pi
def kmp(text,pattern):
pi=kmp_prefix_function(pattern)
i=0
j=0
if text[i]==pattern[j]:
i+=1
j+=1
elif j>0:
j=pi[j-1]
else:
i+=1
if j==len(pattern):
text="ABAABABCD"
pattern="ABC"
kmp(text,pattern)
output:
def bfs(graph,start):
# create a queue for bfs
queue=deque([start])
# mark the start node as visited
visited={start}
# traverse the graph
while queue:
# dequeue a vertex from the queue
vertex=queue.popleft()
# print the vertex
print(vertex)
# enqueue all adjacent vertices that have not been visited
for adjacent in graph[vertex]:
if adjacent not in visited:
queue.append(adjacent)
visited.add(adjacent)
graph={
'A':['B','C','D','E'],
'B':['A','D','F'],
'C':['A','G'],
'D':['A','B','F'],
'E':['A','G'],
'F':['B','D'],
'G':['C','E']
}
start='A'
bfs(graph,start)
output: A
B
C
D
E
F
G
13) Write a program to find the minimum spanning tree of a
given graph using Prim's algorithm.
import sys
def prim(graph):
vertices = list(graph.keys())
visited = {vertices[0]}
edges = []
mst =[]
total_cost = 0
while len(visited)!=len(vertices):
min_edge=(None,None,sys.maxsize)
for u in visited:
for v,w in graph[u].items():
if v not in visited and w<min_edge[2]:
min_edge=(u,v,w)
edges.append(min_edge)
visited.add(min_edge[1])
total_cost+=min_edge[2]
for edge in edges:
mst.append((edge[0],edge[1],graph[edge[0]][edge[1]]))
return mst,total_cost
graph ={
'A':{'B':7,'C':8},
'B':{'A':7,'D':6,'C':3},
'C':{'A':8,'B':3,'D':4,'E':3},
'D':{'B':6,'C':4,'E':2,'F':5},
'E':{'C':3,'D':2,'F':2},
'F':{'D':5,'E':2}
}
mst,cost=prim(graph)
print("the minimumspanning tree is:",mst)
print("the cost of the minimum spanning tree is:",cost)
output: the minimumspanning tree is: [('A', 'B', 7), ('B', 'C', 3), ('C', 'E',
3), ('E', 'D', 2), ('E', 'F', 2)]
the cost of the minimum spanning tree is: 17
14(a) Write a program to obtain the topological ordering of vertices in a given
digraph.
def main():
n=int(input("enter the number of verices:"))
count=0
c=[[0 for _ in range(n)] for _ in range(n)]
indeg=[0]*n
flag=[0]*n
i,j,k=0,0,0
for i in range(n):
for j in range(n):
indeg[i] += c[j][i]
return 0
if __name__ == "__main__":
main()
output:
enter the number of verices:5
enter the cost matrix (row by row):
00100
00100
00011
00001
00000
the topologocal order is:
1 2 3 4 5
14(b) Write a program to compute transitive closure of a given directed graph using Warshall’s
algorithm
def warshalls(c, n):
for k in range(n):
for i in range(n):
for j in range(n):
if c[i][j] or (c[i][k] and c[k][j]):
c[i][j] = 1
def main():
n = int(input("enter the number of verticrs:"))
c = []
print("enter the adjacency cost matrix:")
for i in range(n):
row = list(map(int, input().split()))
c.append(row)
warshalls(c, n)
main()
output:
if __name__ == "__main__":
w = [0] * 10
x = [0] * 10
count = 0
i=0
sum = 0
for i in range(n):
x[i] = 0
sum += w[i]
output:
Enter the number of elements:4
enter the elementsin ascending order:
15
5
10
10
enter the sum: 20
Subset 1 = 15 5
Subset 1 = 10 10