Skip to content

LeviEyal/Algorithms-2-Course

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

25 Commits
ย 
ย 

Repository files navigation

ืคืกืื•ื“ื• ืงื•ื“ื™ื - ืงื•ืจืก ืืœื’ื•ืจื™ืชืžื™ื 2 ืกืžืกื˜ืจ ื‘' 2021

Floyd Warshall

ื’ืจืฃ ืœื ืžืžื•ืฉืงืœ: ืžืคืขื™ืœื™ื ื›ื“ื™ ืœื‘ื“ื•ืง ืื ืงื™ื™ื ืžืกืœื•ืœ ื›ืœืฉื”ื• ื‘ื™ืŸ ืงื•ื“ืงื•ื“ ืžืกื•ื™ื™ื™ื ืœืงื•ื“ืงื•ื“ ืื—ืจ

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
FW-UnWheighted(g[N,N]) :
    for k=0 to N :
        for i=0 to N :
            for j=0 to N :
           		g[i,j] = g[i,j] || (g[i,k] AND g[k,j])

ื’ืจืฃ ืžืžื•ืฉืงืœ - ืžืฆื™ืืช ื›ืœ ื”ืžืจื—ืงื™ื ื”ืงืฆืจื™ื ื‘ื™ื•ืชืจ ื‘ื’ืจืฃ ื‘ื™ืŸ ื›ืœ ื–ื•ื’ ืงื•ื“ืงื•ื“ื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
FW-wheighted(g[N,N]) :
    for k=0 to N :
        for i=0 to N :
            for j=0 to N :
                if  g[i,j] > g[i,k] + g[k,j] :
                    g[i,j] = g[i,k] + g[k,j]
ื’ืจืฃ ืžืžื•ืฉืงืœ - ืžืฆื™ืืช ื›ืœ ื”ืžืกืœื•ืœื™ื ื”ืงืฆืจื™ื ื‘ื™ื•ืชืจ ื‘ื’ืจืฃ ื‘ื™ืŸ ื›ืœ ื–ื•ื’ ืงื•ื“ืงื•ื“ื™ื ืžื™ื•ืฆื’ื™ื ืข"ื™ ืžื—ืจื•ื–ื•ืช:
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
FW-wheighted-paths(g[N,N]) :
    New empty-string paths[N,N]
    for i=0 to N :
        for j=0 to N :
            paths[i,j] = i + "->" + j

    for k=0 to N :
        for i=0 to N :
            for j=0 to N :
                if  g[i,j] > g[i,k] + g[k,j] :
                    g[i,j] = g[i,k] + g[k,j]
                    paths[i,j] = paths[i,k] + "->" + paths[k,j]
    return paths

ื’ืจืฃ ืœื ืžื›ื•ื•ืŸ - ื‘ื“ื™ืงืช ืงืฉื™ืจื•ืช:

  • ืžืกืคื™ืง ืœื”ืคืขื™ืœ ืคืœื•ื™ื™ื“ ื•ื•ืจืฉืœ ืขืœ ื”ื’ืจืฃ ื•ืื– ืœื‘ื“ื•ืง ืืช ื”ืฉื•ืจื” ื”ืจืืฉื•ื ื”. ื›ื™ ืื ืžื”ืงื•ื“ืงื•ื“ ื”ืจืืฉื•ืŸ ื™ืฉ ืžืกืœื•ืœ ืœื›ื•ืœื ืื– ืืคืฉืจ ื™ืฉืจ ืœื”ื’ื™ื“ ืฉื”ื’ืจืฃ ืงืฉื™ืจ
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
isConnected-UnDirected-graphs(g[N,N]) :
    FW(g)
    for i=1 to N :
        if g[0,i] = false :
            return false
    return true

ื‘ื“ื™ืงืช ืงืฉื™ืจื•ืช ืฉืœ ื’ืจืคื™ื ืœื ืžื›ื•ื•ื ื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
isConnected-Directed-graphs(g[N,N]) :
    FW(g)
    for i=0 to N :
        if g[0,i] = โˆž :
            return false
    return true

ื‘ื“ื™ืงื” ื”ืื ืงื™ื™ื ืžืขื’ืœ ืฉืœื™ืœื™ ื‘ื’ืจืฃ ืžื›ื•ื•ืŸ:

  • ืžืกืคื™ืง ืœื”ืกืชื›ืœ ืขืœ ื”ืืœื›ืกื•ืŸ ื”ืจืืฉื™ ืื—ืจื™ ื”ืคืขืœืช Floyd-Washall
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
Has-Negative-Cycles-Directed(g[N,N]) :
    FW(g)
    for i=0 to N :
        if g[i,i] < 0 :
            return true
    return false
ื‘ื“ื™ืงื” ื”ืื ืงื™ื™ื ืžืขื’ืœ ืฉืœื™ืœื™ ื‘ื’ืจืฃ ืœื ืžื›ื•ื•ืŸ:
  • ืื™ืŸ ืฆื•ืจืš ืœื”ืคืขื™ืœ Floyd-Washall
  • ืื ืงื™ื™ืžืช ืฆืœืข ืขื ืžืฉืงืœ ืฉืœื™ืœื™ ืื– ืงื™ื™ื ืžืขื’ืœ ืฉืœื™ืœื™ ื‘ื’ืจืฃ ืœื ืžื›ื•ื•ืŸ
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^2)
Has-Negative-Cycles-UnDirected(g[N,N]) : 
    for i=0 to N :
        for j=0 to N :
            if g[i,j] < 0:
                return true
    return false

ื—ื™ืฉื•ื‘ ื“ืจื’ื•ืช ืงื•ื“ืงื•ื“ื™ื ืžืžื˜ืจื™ืฆืช ืžืจื—ืงื™ื ื‘ื’ืจืฃ ืžืžื•ืฉืงืœ ื•ืœื ืžื›ื•ื•ืŸ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^2)
Degrees-of-vertices(g[N,N]) :
    New D[N] = {0,0,..,0}
    for i=0 to N :
        for j=0 to N :
            if i โ‰  j AND g[i,j] โ‰  โˆž:
                D[i]++
                D[j]++
    sort(D)
    return D

ื—ื™ืฉื•ื‘ ื“ืจื’ื•ืช ืงื•ื“ืงื•ื“ื™ื ืžืžื˜ืจื™ืฆืช ืฉื›ื ื•ื™ื•ืช ื‘ื’ืจืฃ ืœื ืžืžื•ืฉืงืœ ื•ืœื ืžื›ื•ื•ืŸ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^2)
Degrees-of-vertices(g[N,N]) :
    New D[N] = {0,0,..,0}
    for i=0 to N :
        for j=0 to N :
            if g[i,j] = true:
                D[i]++
                D[j]++
    sort(D)
    return D

ื‘ืขื™ื™ืช ื”ื‘ืงื‘ื•ืงื™ื

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
Bottles-Problem(b1, b2) :
    mat = Bottles-Problem-Create-Matrix(b1, b2)
    return Bottles-Problem-Get-Paths(mat, max(b1, b2))

ืฉืœื‘ ืจืืฉื•ืŸ - ื‘ื ื™ื™ืช ืžื˜ืจื™ืฆืช ื”ืžืขื‘ืจื™ื ืžืžืฆื‘ ืœืžืฆื‘:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^2)
Bottles-Problem-Create-Matrix(b1, b2) :
    size = (b1+1)*(b2+1)
    max = max(b1, b2)
    new mat[size, size]

    for i=0 to b1 :
        for j=0 to b2 :
            index = getindex(max, i, j)

            1. mat[index, getIndex(max, 0, j)] = 1
            2. mat[index, getIndex(max, i, 0)] = 1
            3. mat[index, getIndex(max, b1, j)] = 1
            4. mat[index, getIndex(max, i, b2)] = 1
            5. mat[index, getIndex(max, min(b1, i+j), i+j-min(b1, i+j))] = 1
            6. mat[index, getIndex(max, i+j-min(b2, i+j) , min(b2, i+j))] = 1
    return mat

getIndex(n, i, j) :
    return (n+1) * i + j

ืฉืœื‘ ืฉื ื™ - ื™ืฆื™ืจืช ืžื˜ืจื™ืฆืช ืžืกืœื•ืœื™ื ืžืžืฆื‘ ืœืžืฆื‘:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^2)
Bottles-Problem-Get-Paths(mat[size, size], n) :
    New paths[size, size]
    for i=0 to size :
        x1, y1 = getPairFromIndex(n, i)
        for j=0 to size :
            x2, y2 = getPairFromIndex(n, i)
            if mat[i, j] โ‰  โˆž :
                paths[i, j] = "("+x1+","+y1+") โ†’ ("+x2+","+y2+")"
    for k=0 to size :
        for i=0 to size :
            for j=0 to size :
                if mat[i,j] > mat[i,k] + mat[k,j] :
                   mat[i,j] = mat[i,k] + mat[k,j]
                   paths[i,j] = paths[i,k] + "โ†’" + paths[k,j]
    return paths
    
getPairFromIndex(n, i) :
    return { i/(n+1), i%(n+1) }

ืชืช ืžืขืจืš ืขื ืกื›ื•ื ืชืื™ื ืžืงืกื™ืžืœื™

ื’ืจืกื” ืžืงื•ืฆืจืช ื›ืฉืฆืจื™ืš ืจืง ืืช ื”ืกื›ื•ื ืœืœื ืื™ื ื“ืงืกื™ื

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Best-basic(A[N]) :
    maxSum = tempSum = -โˆž

    for i=0 to N :
        tempSum += A[i]
        maxSum = max(maxSum, tempSum)
        tempSum = max(tempSum, 0)
    return maxSum

ื’ืจืกื” ืจื’ื™ืœื” ื›ืฉืฆืจื™ืš ืืช ื”ืกื›ื•ื ื•ืืช ื”ืื™ื ื“ืงืกื™ื ืฉืœ ืชืช ื”ืžืขืจืš

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Best(A[N]) :
    maxSum = tempSum = -โˆž
    start = end = 0

    for i=0 to N :
        tempSum += A[i]
        if maxSum < tempSum :
            maxSum = tempSum
            end = i
        if tempSum < 0:
            tempSum = 0
            start = i+1
    return {maxSum, start, end}

ื’ืจืกื” ืžืขื’ืœื™ืช ื›ืฉืœื ืฆืจื™ืš ืื™ื ื“ืงืกื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Best-Cycle(A[N]) :
    totalSum = sum(A)
    return max(Best(A), totalSum - Best(-A))

ื’ืจืกื” ืžืขื’ืœื™ืช ื›ื•ืœืœ ืื™ื ื“ืงืกื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Best-Cycle(A[N]) :
    totalSum = sum(A)
    max1, start1, end1 = Best(A)
    max2, start2, end2 = Best(-A)
    
    if max1 > totalSum + max2 :
        return {max1, start1, end1}
    else
        return {totalSum + max2, end2 + 1, start2 - 1}

ื‘ืขื™ื™ืช ืชื—ื ื•ืช ื”ื“ืœืง:

  • ืžื˜ืจื” ืœืžืฆื•ื ืชื—ื ื” ืžืžื ื” ืืคืฉืจ ืœื™ืกื•ืข ื•ืœืขืฉื•ืช ืกื™ื‘ื•ื‘ ืฉืœื.
  • ื”ืžืขืจืš A ืžื™ื™ืฆื’ ืืช ื›ืžื•ืช ื”ื“ืœืง ื‘ื›ืœ ืชื—ื ื”ืช ื”ืžืขืจืš B ืžื™ื™ืฆื’ ืืช ืขืœื•ืช ื”ื ืกื™ืขื” ื‘ื“ืœืง ืžืชื—ื ื” ืœืชื—ื ื”.
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Gas-Stations-Problem(A[N], B[N]) :
    C[N]
    sum = 0
    for i=0 to N :
        C[i] = A[i] - B[i]
        sum += C[i]
    
    if sum < 0 :
        return "No solution"
    return Best-Cycle(C)

ืชืช ืžื˜ืจื™ืฆื” ืขื ืกื›ื•ื ืชืื™ื ืžืงืกื™ืžืœื™

ื’ืจืกื” ืžืงื•ืฆืจืช ื›ืฉืฆืจื™ืš ืจืง ืืช ื”ืกื›ื•ื ืœืœื ืื™ื ื“ืงืกื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
Super-Best-basic(A[rows,cols]):
    maxSum = 0
    for i=0 to rows :
        New help[cols]
        for j=i to rows :
            for k=0 to cols :
                help[k] += A[j,k]
            maxSum = max(maxSum, Best-basic(help))
    return maxSum

ื’ืจืกื” ืจื’ื™ืœื” ื›ืฉืฆืจื™ืš ืืช ื”ืกื›ื•ื ื•ืืช ื”ืื™ื ื“ืงืกื™ื ืฉืœ ืชืช ื”ืžื˜ืจื™ืฆื”:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n^3)
Super-Best(A[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] += A[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(n*log(n))
Huffman(C) :
    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)
    return Q.extrctMin()

ืฉืœื‘ ืฉื ื™ - ื”ื•ืฆืืช ื”ื™ื™ืฆื•ื’ื™ื ื”ื‘ื™ื ืืจื™ื™ื ืฉืœ ื›ืœ ืชื• ืžื”ืขืฅ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Huffman-process(root = Huffman(C)) :
    if(root.left == null AND root.right == null) :
        print(root.char)
    else:
        print('0' + Huffman-process(root.left)
        print('1' + Huffman-process(root.right)

ืงื•ื“ ื”ืืคืžืŸ - ื›ืืฉืจ ืžืขืจืš ื”ืชื•ื™ื ืžืžื•ื™ืŸ ืœืคื™ ืฉื›ื™ื—ื•ื™ื•ืช:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(n)
Huffman-sorted(C) :
    Q1 = C
    Q2 = โˆ…
    while |Q1| + |Q2| > 1 :
        New node z
        z.left = x = getMin(Q1,Q2)
        z.right = y = getMin(Q1,Q2)
        z.freq = x.freq + y.freq
        Q2.insert(z)
    return getMin(Q1, Q2)

getMin(Q1,Q2):
    if Q1 = โˆ… :
        return Q2.dequeue()
    if Q2 = โˆ… :
        return Q1.dequeue()
    if Q1.front < Q2.front :
        return Q1.dequeue()
    else return Q2.dequeue()

ืขืฅ ืคื•ืจืฉ ืžื™ื ื™ืžืœื™

ื™ืฆื™ืจืช ืขืฅ ืคื•ืจืฉ ืžื™ื ื™ืžืœื™ - ืงืจื•ืกืงืœ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|E|log|E|)
MST-Kruskal(G) :
    T = โˆ…
    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 T

ื™ืฆื™ืจืช ืขืฅ ืคื•ืจืฉ ืžื™ื ื™ืžืœื™ - ืคืจื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: 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|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

ืžืขื‘ืจ ืขืœ ื’ืจืคื™ื

BFS

ืžืขื‘ืจ ืขืœ ื’ืจืฃ ื‘ืืžืฆืขื•ืช ืกืจื™ืงื” ืœืจื•ื—ื‘:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
BFS(G, s) :
    for each v in V :
        v.color = WHITE, v.dist = โˆž, v.prev = null

    s.color = GRAY, s.dist = 0, s.prev = -1
    Q = {s}
    while Q โ‰  โˆ… :
        u = Q.dequeue()
        for each v in adj[u] :
            if v.color = WHITE :
                v.color = GRAY
                v.dist = u.dist + 1
                v.prev = u
                Q.enqueue(v)
        u.color = BLACK

DFS

ืžืขื‘ืจ ืขืœ ื’ืจืฃ ื‘ืืžืฆืขื•ืช ืกืจื™ืงื” ืœืขื•ืžืง:

  • ืกื™ื‘ื•ื›ื™ื•ืช: 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

ื‘ื“ื™ืงื” ื”ืื ืฆืœืข ื ืชื•ื ื” ื ืžืฆืืช ืขืœ ืžืขื’ืœ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
Is-Edge-On-Cycle(G, e) :
    u = e.u
    v = e.v
    G.removeEdge(e)
    BFS(v)
    return (u.color โ‰  WHITE)

ืžืฆื™ืืช ืžืกืคืจ ืจื›ื™ื‘ื™ ืงืฉื™ืจื•ืช ื‘ื’ืจืฃ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: 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|)
DFS-Has-Cycle(G) :
    for each v in V : v.color = WHITE
    for each v in V :
        if v.color = WHITE :
            if DFS-VISIT(G, v) = true :
                return true
    return false
DFS-VISIT(G, n) :
    n.color = GRAY
    for each v in adj[n] :
        if v.color = GRAY : 
            return true
        if v.color = WHITE :
            if DFS-VISIT(G, v) = true :
                return true
    n.color = BLACK
    return false

ื‘ื“ื™ืงื” ื”ืื ืงื™ื™ื ืžืขื’ืœ ืื•ื™ื™ืœืจ ื‘ื’ืจืฃ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
Has-Euler-Cycle(G) :
    for each v in V :
        if v.degree % 2 โ‰  0 :
            return "No euler Cycle detected"
    if isConnected(G) :
        return Euler-Cycle(G)

ืžืฆื™ืืช ืžืขื’ืœ ืื•ื™ื™ืœืจ ื‘ื’ืจืฃ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
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|)
BFS-isConnected(G) :
    select some vertex s from G 
    BFS(G, s)
    for each v in V :
        if v.color โ‰  BLACK :
            return false
    return true 

ื‘ื“ื™ืงื” ื”ืื ืงื™ื™ื ืžืกืœื•ืœ ืื•ื™ื™ืœืจ ื‘ื’ืจืฃ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
Euler-HasEuler-path(G) :
    counter = 0
    for each v in V :
        if v.degree % 2 โ‰  0 :
            counter++
    return isConnected(G) = true AND counter = 2

ืงื•ื˜ืจ ื•ืจื“ื™ื•ืก ื‘ืขืฆื™ื

ืžืฆื™ืืช ืงื•ื˜ืจ, ืจื“ื™ื•ืก ื•ืžืจื›ื–ื™ื ืฉืœ ืขืฅ ืข"ื™ ืืœื’ื•ืจื™ืชื ืฉืจื™ืคืช ืขืœื™ื:

  • ืกื™ื‘ื•ื›ื™ื•ืช: 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|)
Diameter-DFS(T) :
    maxDist = 0, MaxDistVertex = 0 
    DFS(T, 0)
    for each v in V:
        if maxDist < v.dist :
            maxDist = v.dist
            MaxDistVertex = v 

    DFS(T, MaxDistVertex)

    for each v in V:
        if maxDist < v.dist :
            maxDist = v.dist
            
    return maxDist

ืžืฆื™ืืช ื”ืžืกืœื•ืœ ืฉืœ ืงื•ื˜ืจ ื‘ืขืฅ ืข"ื™ ืืœื’ื•ืจื™ืชื ืกืจื™ืงื” ืœืขื•ืžืง DFS:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
Diameter-Path-DFS(T) :
    maxDist = 0, MaxDistVertex = 0 
    DFS(T, 0)
    for each v in V:
        if maxDist < v.dist :
            maxDist = v.dist
            MaxDistVertex = v 

    DFS(T, MaxDistVertex)

    for each v in V:
        if maxDist < v.dist :
            maxDist = v.dist
            MaxDistVertex = v

    path = โˆ…
    while MaxDistVertex != -1 :
        path.add(MaxDistVertex)
        MaxDistVertex = MaxDistVertex.prev

    return path

ื‘ื“ื™ืงื” ื”ืื ืงื•ื“ืงื•ื“ ื ืชื•ืŸ ื ืžืฆื ืขืœ ืงื•ื˜ืจ ื‘ืขืฅ:

  • ื”ื‘ืขื™ื” ื“ื•ืžื” ืœื‘ื“ื™ืงื” ื”ืื ื ืงื•ื“ื” ื ืžืฆืืช ืขืœ ืฆืœืข ืžืกื•ื™ื.
  • ืฉืœื‘ ืจืืฉื•ืŸ: ื ืžืฆื ืืช ื”ืงื•ื˜ืจ (ืข"ื™ ืืœื’ื•ืจื™ืชื ืฉืจื™ืคื” ืื• ื‘ืืžืฆืขื•ืช DFS)
  • ืฉืœื‘ ืฉื ื™: ื ืžืฆื ืืช ื”ืงื•ื“ืงื•ื“ ื”ื›ื™ ืจื—ื•ืง ืžืงื•ื“ืงื•ื“ v - ืžื•ื‘ื˜ื— ืฉื”ื•ื ืงืฆื” ืื—ื“ ืฉืœ ื”ืงื•ื˜ืจ.
  • ืฉืœื‘ ืฉืœื™ืฉื™: ื ืžืฆื ืืช ื”ืฆืœืข ื”ืจืืฉื•ื ื” ืžืงื•ื“ืงื•ื“ v ื‘ืžืกืœื•ืœ ืœืขื‘ืจ ื”ืงื•ื“ืงื•ื“ ืฉืžืฆืื ื• ื‘ืฉืœื‘ ื”ืงื•ื“ื. ื ืฉืžื•ืจ ืืช ื”ืžืจื—ืง.
  • ืฉืœื‘ ืจื‘ื™ืขื™: ื ืกื™ืจ ืืช ื”ืฆืœืข ื”ื–ืืช ืžื” ืฉื‘ืขืฆื ืžืกื™ืจ ืืช ื›ืœ ื”ืขื ืฃ
  • ืฉืœื‘ ื—ืžื™ืฉื™: ื ืขืฉื” ืฉื•ื‘ ืืช ืฉืœื‘ 2. ืžื•ื‘ื˜ื— ืฉื”ืคืขื ื”ืงื•ื“ืงื•ื“ ื”ื›ื™ ืจื—ื•ืง ืž v ื”ื•ื ื”ืงืฆื” ื”ืฉื ื™ ืฉืœ ื”ืงื•ื˜ืจ.
  • ืฉืœื‘ ืื—ืจื•ืŸ: ืื ื”ืงื•ื˜ืจ ืฉื•ื•ื” ืœืžืจื—ืง ืฉืœ v ืžื”ืงืฆื” ื”ืจืืฉื•ืŸ ืฉืœ ื”ืงื•ื˜ืจ ื•ืขื•ื“ ืžืจื—ืงื• ืžื”ืงืฆื” ื”ืฉื ื™ - ืื–ื™ ื”ืงื•ื“ืงื•ื“ ื ืžืฆื ืขืœ ื”ืงื•ื˜ืจ (ืื—ื“ ืžื”ื ื‘ืžื™ื“ื” ื•ื™ืฉ ื›ืžื”)
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(|V|+|E|)
is-Vertex-on-Diameter(T, v) :
    diameter = Diameter(T)
    BFS(v)
    maxDist1 = maxDistIndex = 0
    for each v in V :
        if maxDist1 < v.dist :
            maxDist1 = v.dist
            maxDistIndex = v

    while maxDistIndex.prev โ‰  v :
        maxDistIndex = maxDistIndex.prev

    remove((v, maxDistIndex))
    BFS(v)
    maxDist2 = 0
    for each v in V :
        if maxDist2 < v.dist :
            maxDist2 = v.dist
    
    return (diameter == maxDist1 + maxDist2)

ื“ื™ื™ืงืกื˜ืจื”

ืžืฆื™ืืช ื”ืžืจื—ืงื™ื ื”ืงืฆืจื™ื ื‘ื™ื•ืชืจ ื‘ื’ืจืฃ ืžืงื•ื“ืงื•ื“ ื ืชื•ืŸ:

  • ืกื™ื‘ื•ื›ื™ื•ืช: O((V+E)logV) (ื›ืืฉืจ ืžืฉืชืžืฉื™ื ื‘ืขืจื™ืžื” ื‘ื™ื ืืจื™ืช)
Dijkstra(G, s) :
    for v in V : v.dist = โˆž

    s.dist = 0
    Q = V
    while Q โ‰  โˆ… :
        u = Q.extractMin() //by dists
        for v in adj[u] :
            if v.dist > u.dist + w(u,v) :
                v.dist = u.dist + w(u,v)
                v.prev = u

ื‘ื ื™ื™ืช ืขืฅ ืžืจืฉื™ืžืช ื“ืจื’ื•ืช

  • ืฆืจื™ืš ืœื‘ื“ื•ืง ืงื•ื“ื ืฉืื›ืŸ ืžืชืงื™ื™ื Sum(degs) = 2*(|V|-1) ืœืคื ื™ ืฉืžืชื—ื™ืœื™ื ืืช ื”ืืœื’ื•ืจื™ืชื.
  • ืกื™ื‘ื•ื›ื™ื•ืช: O(VlogV) ืื ื”ืžืขืจืš ืœื ืžืžื•ื™ืŸ. O(V) ืื ื”ืžืขืจืš ืžืžื•ื™ืŸ ื›ื‘ืจ.
  • ื”ืขืจื”: ื”ืื™ื ื“ืงืก ืฉืœ ื”ืื™ื‘ืจ ื”ืจืืฉื•ืŸ ื‘ืžืขืจืš ื”ื•ื 0, ื”ืื™ื ื“ืงืก ืฉืœ ื”ืื™ื‘ืจ ื”ืื—ืจื•ืŸ ื‘ืžืขืจืš ื”ื•ื N-1.
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

ืื™ื–ื•ืžื•ืจืคื™ื–ื ืฉืœ ืขืฆื™ื

  • ื”ืจืขื™ื•ืŸ ื”ื•ื ืœื™ืฆื•ืจ ื™ื™ืฆื•ื’ ื‘ื™ื ืืจื™ ื›ืžื—ืจื•ื–ืช ืœื›ืœ ืขืฅ. ืื ื”ืžื—ืจื•ื–ืช ืฉืœ ื”ืขืฅ ื”ืจืืฉื•ืŸ ื–ื”ื” ืœืžื—ืจื•ื–ืช ืฉืœ ื”ืขืฅ ื”ืฉื ื™, ืื–ื™ ืฉื ื™ ื”ืขืฆื™ื ืื™ื–ื•ืžื•ืจืคื™ื™ื.
  • ื™ืฆื™ืจืช ื”ื™ื™ืฆื•ื’ ื”ื‘ื™ื ืืจื™ ื›ืžื—ืจื•ื–ืช ืœืขืฅ ืžืชื—ื™ืœื” ืจืงื•ืจืกื™ื‘ื™ืช ืžื”ืฉื•ืจืฉ ื›ืœืคื™ ืžื˜ื”, ื›ืืฉืจ ื›ืœ ืขืœื” ืžื™ื•ืฆื’ ืข"ื™ "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"

About

A collection of pseudo-codes of all the algorithms studied in the Algorithms-2 2021 course

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors