ืกืืืื ืฉื ืงืืจืก ืืืืืจืืชืืื 1 ื-2 2021
ืืืจืฃ ืื ืืฉืืงืื, ืืงืื ืืืืง ืื ืงืืื ืืกืืื ืืื ืงืืืงืื ืืืฉื ืื ืืื ืืจืืง ืืงืฆืจ ืืืืชืจ ืื ืื ืืืืฉื ืืืืจืืฆืช ืฉืื ืืืืช.
ืืืืืืจืืชื ืขืืืจ ืืืืืง ืืื ืืื ืฉื ื ื ืงืืืืช ืงืืื ืืจื ืงืฆืจื ืืืชืจ ืืจื ื ืงืืื ื ืืกืคืช K.
O(n^3)
ืืืืง ืืขืืจ ืืจื ืงืืืงืืO(n)ืืืื ืืขืืจ ืขืืืจ ืขื ืืืจืืฆืO(n^2)
O(n)*O(n^2) = O(n^3)
ืืงืื ืืืจืืฆืช ืฉืื ืืืืช
ืืืืืจ ืืืจืืฆืช ืฉืื ืืืืช ืขื ืืืจืืงืื
Floyd_Warshel(matrix mat):
n = len(mat)
distance = new array[n][n]
for i to n: # matrix init
for j to n:
if(mat[i][j] == 0 && i!=j):
distance[i][j] = infinity
else:
distance[i][j] = mat[i][j]
for k=0 to n:
for i=0 to n:
for j=0 to n:
if( distance[i][k] + distance[k][j] < distance[i][j] ):
distance[i][j] = distance[i][k] + distance[k][j]
return distanceืงืื ืืืื ืฉืขืืืจ ืขื ืืขืจื ืืืืืืจ ืืช ืชืช ืืืขืจื ืืืืื ืืืืชืจ ืฉืื.
ืจืฅ ืขื ืืืขืจื ืืื ืืืืจ ืืงืื ืคืืืช ื0 ืืชืืื ืืื ืงืืื ืฉืืืจื.
O(n)
ืืงืื ืืขืจื
ืืืืืจ ืืช ืืกืืื, ืืช ืืืชืืื ืืืช ืืกืืฃ.
best (Array array):
start = 0
best = 0
sum = 0
end = 0
temp_start = 0
for (i in array):
sum += array[i]
if (sum<0):
sum = 0
temp_start = i+1
if(best<sum):
best = sum
start = temp_start
end = i
return (best,start,end)ืงืื ืืืื ืฉืขืืืจ ืขื ืืขืจื ืืืืืืจ ืืช ืชืช ืืืขืจื ืืืืื ืืืืชืจ ืฉืื ืจืง ืืืขืื.
ืืขืฆื ืืื ืืืืง ืื ืืืฉืืื ืฉื ืืืขืจื(ืชืช ืืขืจื ืขื ืืกืืื ืืืื ืืืืื) ืคืืืช ืกืืื ืืืขืจื ืืืื ืืืชืจ.
O(n)
ืืงืื ืืขืจื
ืืืืืจ ืกืืื, ืืชืืื ืืกืืฃ ืืื ืฉื ืืขืื(ืืืืืจ ืืืื ืืืืืช start>end)
cycle_best(Array array):
array_r = -array # doing minus to all the array O(N)
(r_best,r_start,r_end) = best(array_r)[best]
(best,start,end) = best(array)
if(best <array.sum()-(-r_best)):
cycle_best =array.sum()-(-r_best)
return (cycle_best,r_end,r_start)
return best(best,start,end)ืงืื ืืืื ืฉืขืืืจ ืขื ืืืจืืฆื ืืืืืืจ ืืช ืชืช ืืืืจืืฆื ืขื ืืกืืื ืืืืื ืืืืชืจ.
ืืืืจ ืฉืืจืืช ืืืขืจื ืขืืจ ืืื ืืคืขืื ืืช best
O(n^3)
ืืงืื ืืืจืืฆื
best,startCol,startRow,endCol,endRow
Super-Best(matrix mat[rows,cols]) :
maxSum, start_x, start_y ,end_x, end_y = 0
for i=0 to rows :
New help[cols]
for j=i to rows :
for k=0 to cols :
help[k] += mat[j,k]
tempSum, tempStart, tempEnd = best(help)
if maxSum < tempSum :
maxSum = tempSum
start_x = tempStart
end_x = tempEnd
start_y = i
end_y = j
return (maxSum, start_x, start_y, end_x, end_y)O(|V|log|V|)+O(|E|log|V|) = O((|V|+|E|)log|V|)
return distance, previous
dijkstra(G(E,V),startPoint):
queue = PriorityQueue
was = array[|V|]
previous = array[|V|]
distance = array[|V|]
for i to |V|: //init
was[i] = false
distance[i] = infinity
previous[i] = null
queue.add(startPoint,0)
while(!queue.empty())O(|V|)
v = queue.popPriority()
was[v] = true
for neighbor in G(v): o(|E|)
if(!was[neighbor] && distance[neighbor]>distance[v]+G.getEdge(v,neighbor).distance())
distance[neighbor] = distance[v]+G.getEdge(v,neighbor).distance()
previous[neighbor] = v
if(queue.have(neighbor)) // O(log(n))
queue.rePriority(neighbor,distance[neighbor])
else
queue.add(neighbor,distance[neighbor])
return distance, previousืืขืืจ ืขื ืืจืฃ ืืืืฆืขืืช ืกืจืืงื ืืจืืื ืืืืืจ ืืคืฉืจ ืืืืืื ืฉืขืืืจ ืืืขืืืื ืฉืื ืคืขื ืืืืื
ืืืื ืชืืจ ืฉืื ืืืืจ ืฉืืื ืขืืืจ ืชืืื ืขื ืื ืฉื ืื ืก ืจืืฉืื ืฉืื ืืงืจืื ืืืืจ ืื ืขืืืจ ืืจืืืงืื ืืืชืจ.
O(|V|+|E|)
- ืืงืื ืืจืฃ ืื ืงืืืช ืืชืืื
- ืืืืืจ ืืขืจืื ืืจืืง ืืืืจืื
BFS(G(V,E),start):
# init:
queue = new Queue # main queue
color[len(V)]
distance[len(V)]
parent[len(V)]
for i to len(V):
color[i] = white
distance[i] = infinity
parent[i] = null
# Algorithm:
queue.add(start)
while queue is not empty:
vert = queue.dequeue()
for neighbor in G(vert).neighbor():
if(color[neighbor] == white): # if dident pass on him then add him to the queue
color[neighbor] = gray
distance[neighbor] = distance[vert] + 1
parent[neighbor] = vert
queue.add(neighbor)
color[vert] = black # passed on the verticy so color it black
return distance, arentืืขืืจ ืขื ืืจืฃ ืืืืฆืขืืช ืกืจืืงื ืืขืืืง
O(|V|+|E|)
DFS(G) :
for each v in V : v.color = WHITE
for each v in V :
if v.color = WHITE :
DFS-VISIT(G, v)
DFS-VISIT(G, n) :
n.color = GRAY
for each v in adj[n] :
if v.color = WHITE :
DFS-VISIT(G, v)
n.color = BLACKืืฉืชืืฉ ื DFS
O(|V|+|E|)
DFS-Number-Of-Connected-Components(G) :
counter = 0
for each v in V : v.color = WHITE
for each v in V :
if v.color = WHITE :
counter++
DFS-VISIT(G, v)
return counterืืฆืืืช ืืขืื ืืืืืืจ ืืืจืฃ
O(|V|+|E|)
euler_path (G=(v,e)){
stack work, done;
work.add(v1);
while(!work.isempty()){
v = work.peek();
if (g(v).degree()==0){
work.pop();
done.add(v);
}else {
u = g(v)[0]; // take first neighbor
work.add(u);
g.delete(u,v);
}
}
return done.toArray();
}
## or
Euler-Cycle(G) :
select some vertex s from G
list C = โ
stack = {s}
while stack โ โ
:
v = stack.peek()
if v.degree = 0 :
C.add(stack.pop())
else :
u = first of adj[v]
stack.push(u)
G.remove(u,v)
G.remove(v,u)
return C ืืฆืืืช ืงืืืจ, ืจืืืืก ืืืจืืืื ืฉื ืขืฅ ืข"ื ืืืืืจืืชื ืฉืจืืคืช ืขืืื
O(|V|+|E|)
Diameter-Fire(T) :
n = |V|, radius = 0, leaves = โ
for each v in V :
if v.deg = 1 :
leaves.add(v)
while n > 2 :
future = โ
for each leaf in leaves :
leaf.deg = 0
n--
for each v in adj[leaf] :
if --v.deg = 1 :
future.add(v)
radius++
leaves = future
diameter = radius*2 + |leaves|-1
centers[] = leaves
return {centers, radius, diameter}O(|V|+|E|log|V|)
ืืงืื ืืจืฃ ืืืืืืจ ืขืฅ
MST-Prim(G) :
T = โ
for each v in V :
v.key = โ
v.prev = null
V[0].key = 0
Q = V
while Q โ โ
:
u = Q.extractMin()
if u.prev โ null :
T.add((u, u.prev))
for each v in adj[u] :
if v in Q AND v.key > w(u,v) :
v.key = w(u,v)
v.prev = u
return Tืืฆืืจืช ืขืฅ ืคืืจืก ืืื ืืืืื
O(|E|log|E|)
ืืงืื ืืจืฃ ืืืืืืจ ืขืฅ
MST-Kruskal(G:graph,V:vertices) :
T = Tree()
for each v in V :
makeSet(v)
sort E by weights
for each (u,v) in E :
if findSet(u) โ findSet(v) :
T.add((u,v))
union(u, v)
return Tืืจืขืืื ืืื ืืืชืืื ืขื "ืขืฅ" ืฉืืฉ ืื ืืช ืื ืืฆืืขืืช ืฉื G. ื ืขืืืจ ืขื ืืฆืืขืืช ืืืืืืืืช ืืงืื ืืช ืื ืฉืื ืขื ืื ืฆืืข ืืื ืืคืฉืจ ืื ืชืง ืืืชื ืืืืจืฃ ืืืื ืขืืืื ืืืฉืืจ ืงืฉืืจ. ืื ืื ื ืืืง ืืช ืืฆืืข ืืืขืฅ, ืืื ืืืืชื ืืืืคื ืขื ืฉื ืืืข ืืขืฅ ืืืืื ืชืงืื.
O(|E|(|E|+|V|))
ืืงืื ืืจืฃ ืืืืืืจ ืขืฅ
MST-Reversed-Kruskal(G) :
T = E
Q = E
while |T| > |V|-1 :
e = Q.extractMax()
G.removeEdge(e)
if isConnected = false :
G.addEdge(e)
return TO(|E|log|V|)
ืืงืื ืืจืฃ ืืืืืืจ ืขืฅ
MST-Boruvka(G) :
T = โ
for each v in V : makeSet(v)
while |T| < |V|-1 :
New cheapest[|V|] := array of edges
for (u,v) in E :
g1 = findSet(u)
g2 = findSet(v)
if g1 โ g2 :
if w(cheapest[g1]) > w(u,v) :
w(cheapest[g1]) = w(u,v)
if w(cheapest[g2]) > w(u,v) :
w(cheapest[g2]) = w(u,v)
for i=0 to |v| :
if cheapest[i] โ null :
T.add(cheapest[i])
union(cheapest[i].u, cheapest[i].v)
return Tืืจืขืืื ืืื ืืืฆืืจ ืืืฆืื ืืื ืืจื ืืืืจืืืช ืืื ืขืฅ. ืื ืืืืจืืืช ืฉื ืืขืฅ ืืจืืฉืื ืืื ืืืืจืืืช ืฉื ืืขืฅ ืืฉื ื, ืืื ืฉื ื ืืขืฆืื ืืืืืืืจืคืืื. ืืฆืืจืช ืืืืฆืื ืืืื ืืจื ืืืืจืืืช ืืขืฅ ืืชืืืื ืจืงืืจืกืืืืช ืืืฉืืจืฉ ืืืคื ืืื, ืืืฉืจ ืื ืขืื ืืืืฆื ืข"ื "01" ืืื ืืื ืืฉืจืฉืจ ืืช ืืืืฆืืืื ืฉื ืืืืืื ืฉืื ืืกืืจ ืืืืื ืืืฉืจ ืืฉืืื ืืฉ "0" ืืืืืื ืืฉ "1". ืื ืื ื ืชืื ืื ืืฉืืจืฉ ืฉื ืืขืฅ ืื ื ืฉืชืืฉ ืืืืืืจืืชื ืฉืจืืคื ืืืฆืืืช ืืจืื ืืขืฅ ืืืื ืืืื ืืฉืืจืฉ. ืื ืืขืฅ ืืจืืฉืื ืืฉ ืืจืื ืืื ืืืฉื ื ืืฉ ืฉื ื ืืจืืืื, ืืื ืืขืฆืื ืื ืืืืืืืจืคืืื. ืื ืืฉ 2 ืืจืืืื ืืขืฅ, ื ืืืืง ืื ืืืืจืืืช ืฉื ืืขืฅ ืืจืืฉืื ืฉืืื ืืืืจืืืช ืฉื ืืขืฅ ืืฉื ื ืืืืืืคื ืชืคืงืืืื ืืื ืืืจืืืื ืฉื ืืฆืื.
O(VlogV)
AHU-Tree-Isomorphism(T1, T2) :
r1 = T1.root
r2 = T2.root
if r1 = null AND r2 = null :
r1 = findCenter(T1) // by Fire Algorithm
r2 = findCenter(T2)
New global List<String> childrenCodes[|V|]
code1 = findCode(r1)
code2 = findCode(r2)
return (code1 == code2)
findCode(u)
u.color = BLACK
if u is a leaf :
return "10"
for each v in adj[u] :
if v.color = WHITE : // then v is child of u
childrenCodes[u].add(findCode(v))
Sort(childrenCodes[u])
temp = ""
for each s in childrenCodes[u] :
temp += s
return "1"+temp+"0"ืฆืจืื ืืืืืง ืงืืื ืฉืืื ืืชืงืืื Sum(degs) = 2*(|V|-1) ืืคื ื ืฉืืชืืืืื ืืช ืืืืืืจืืชื ืืขืจื: ืืืื ืืงืก ืฉื ืืืืืจ ืืจืืฉืื ืืืขืจื ืืื 0, ืืืื ืืงืก ืฉื ืืืืืจ ืืืืจืื ืืืขืจื ืืื N-1.
O(VlogV)ืื ืืืขืจื ืื ืืืืื.O(V)ืื ืืืขืจื ืืืืื ืืืจ.
GenerateTreebyDegrees(deg[N]) :
sort(deg)
j = 0
while deg[j] = 1 : j++
New Tree[N,N] = {false}
for i=0 to N-2 :
Tree[i,j] = true
Tree[j,i] = true
if --deg[j] = 1 :
j++
Tree[N-2,N-1] = true
Tree[N-1,N-2] = true
return Treeืืืคืื ืื ืืคืชืืจ ืืช ืื ืฉืฉืืืืฉ ืืืืชืืืช ืืคืขืืื ืชืืคืก ืืจืื ืืงืื,
ืื ืื ืฉืขืืฉื ืื ืืงืืช ืืช ืืืืชืืืช ืฉืืืคืืขืืช ืืื ืืจืื ืคืขืืื,
ืืืืืืืช ืืืืชืืืช ืฉืื ืืื ืืงืืข ืฉืื ืืืื ืืื ืฉืืืชืจ ืงืื ืื.
ืืื ืืืกื ืืงืื ืืงืืฆื ืืงืกื.
ืฉืื ืจืืฉืื ืื ืืืช ืืขืฅ ืฉืื ืฉื ื ืืืฆืืช ืืืืฆืืืื ืืืื ืืจืืื ืฉื ืื ืชื ืืืขืฅ
O(n*log(n))
ืืืฉืจ ืืืขืจื ืืืืื ืขื ืคื ืฉืืืืืืืช:O(n)
- ืืงืื ืืขืจื
- ืืืืืจ ืขืฅ ืื ืืืคืืก ืืช ืืืืฆืื
Huffman(C): # O(n*log(n)) making the tree
Q = C
while |Q| > 1 :
New node z
z.left = x = q.extractMin()
z.right = y = q.extractMin()
z.freq = x.freq + y.freq
Q.insert(z)
Huffman-process(root = Huffman(C)): # O(n) printing
if(root.left == null AND root.right == null) :
print(root.char)
else:
print('0' + Huffman-process(root.left)
print('1' + Huffman-process(root.right)