[Data Structure&Algorithm]最小拡張ツリー&クルーズアルゴリズム(最短パス)


Data Structure


生成ツリー:

  • ツリーデータ構造の1つ

  • 一部の図を表し、1つの図がある場合、すべてのノードが含まれますが、ループは存在しません.
  • 最小生成ツリー(Minimum Spanning Tree,MST):
  • は、最小のツリーが最もコストの低い伸長ツリーである1つの図に複数の伸長ツリーを表示することができる.
  • Algorithm


    MSTを探すアルゴリズムにはKruskalアルゴリズムとPrim'sアルゴリズムがある.
    この文章はクルーズアルゴリズムを紹介した.
    クルーズアルゴリズムの特性:
  • 貪欲アルゴリズム
  • は、集合データ構造(disjoint set datastructure)に基づいて
  • を書く.
    クルーズアルゴリズム:
  • light edgeに重み付け(=優先検査費用の低いedge)
  • edgeを1つずつチェックし、現在のedgeにループが発生しているかどうかを確認します.
  • サイクルが発生しない:MSTに含まれる
  • サイクル:MSTに含まれない
  • すべてのedgeに対して2回のプロセス
  • を繰り返す

    ソースコードの例

    # 이코테 p.288 크루스칼 알고리즘
    def find_parent(parent, x):
        if parent[x] != x:
            parent[x] = find_parent(parent,parent[x])
        return parent[x]
    
    def union_parent(parent, a, b):
        a = find_parent(parent, a)
        b = find_parent(parent, b)
        if a < b:
            parent[b] = a
        else:
            parent[a] = b
    
    v, e = map(int, input().split())
    parent = [0] * (v + 1)
    
    edges = []
    result = 0
    
    for i in range(1, v + 1):
        parent[i] = i
    
    for _ in range(e):
        a, b, cost = map(int, input().split())
        edges.append((cost, a, b))
    
    edges.sort()
    
    for edge in edges:
        cost, a, b = edge
        if find_parent(parent, a) != find_parent(parent, b):    # cycle이 발생하지 않는 경우에만 포함
            union_parent(parent, a, b)
            result += cost
    
    print(result)

    クルーズアルゴリズム時間複雑度


    O(ElogE)O(ElogE)O(ElogE)
  • エッジ整列(ライトエッジ重み付け)
  • はすべてのノードに対して連合演算を実行するので、初期化に必要な計算量はO(N)O(N)O(N)O(N)である.
  • の後にエッジの周りをソートするので、従来のアルゴリズムで最も性能の良い技術が使用される場合、計算量はO(ElogE)O(ElogE)O(ElogE)O(ElogE)である.
    (Python表示sort()
  • エッジナビゲーション
  • Setのデータ数𝑛個数が小さい場合、find parent演算とunion parent演算の計算複雑性はいずれも𝑂(log𝑛)
  • はエッジ全体を繰り返し実行するため、文を繰り返すために必要な計算量𝑂(𝐸log𝐸).
  • 従って,クルーズカルアルゴリズムの全体計算の複雑さはO(ElogE)O(ElogE)O(ElogE)O(ElogE)である.
    伊科台p.290&24579152