一般的に使用されるデータ構造のグラフの深さ最初の検索_幅最初の検索_スパンニングtree_primeアルゴリズム_kruskalアルゴリズム

1.グラフの基本概念

先ほど、1対1(線形テーブル)、1対多(ツリー)の3つの形式のデータ間の関係について説明しましたが、今日は、多対多のデー​​タ表現グラフの3番目の形式について説明します。下の最初の画像は、頂点間に矢印がない場合、無向グラフと呼ばれます。矢印のある2番目の画像は、有向グラフと呼ばれます頂点から開始し、特定のパスの後でそれ自体に戻る場合、それはループと呼ばれます図3の各パス上の番号が呼び出され、重量、および重み付けされたグラフが呼び出されネット2つの頂点が特定の数のパスで接続されいる場合、それを接続済みと呼びます。グラフ内の2つのノードが接続されている場合、グラフは接続済みグラフと呼ばれます接続されていない場合、接続されている最大のサブグラフは接続されているコンポーネントと呼ばれます有向グラフの任意の2つのノードAとBに、AからBへのパスが少なくとも1つあり、BからAへのパスが少なくとも1つある場合、そのようなグラフは強く接続されたグラフと呼ばれます強く接続されていない有向グラフ、および強く接続されている各グラフの最大のサブグラフは、強く接続されているコンポーネントと呼ばれます最初にこれらの基本的な概念を紹介し、次にそれらが後で使用されるときに関連する概念を説明します。
ここに写真の説明を挿入 ここに写真の説明を挿入

ここに写真の説明を挿入

2.写真の保存方法

1.隣接マトリックスストレージ

隣接とは、2つの頂点の間にエッジ(無向グラフのノードの接続をエッジと呼びます)または円弧(有向グラフのノードの接続を円弧と呼び、矢印のない端を円弧の尾と呼び、矢印のある端をアークヘッドと呼ばれる)が存在します。
次の図の隣接マトリックスの行は頂点を表し、行の番号の列は、頂点が対応する列番号の頂点に隣接しているかどうかを示します。隣接は1です。それ以外の場合は、0です。
隣接マトリックスを使用して頂点を格納します。さらに、配列を使用して各ノードの値を格納できます。

ここに写真の説明を挿入

2.隣接テーブルストレージ

上記の隣接行列が実際に使用されています。頂点間の関係を表すために、配列とリンクリストを使用することもできます。配列を使用して各頂点の値を格納し、リンクリストを使用して隣接する頂点を格納します。
隣接リストは、有向グラフと無向グラフの保存に適しています。
ここに写真の説明を挿入

ここに写真の説明を挿入

3.クロスリンクリストストレージ

クロスリンクリストは、有向グラフの保存に適しています。各リンクリストの最初の位置がヘッドノードになります。ヘッドノードは3つのブロックで構成されます。最初のブロックは頂点の値を格納し、2番目のポインタはヘッドノードを指します。ポイントはアークヘッドのノードであり、3番目のノードはヘッドノードをアークエンドとするノードを指します。リンクリストの共通ノードを図2に示します
。tailvex:
ヘッドノードをアークヘッドとして持つ頂点位置を表しますheadvex:ヘッドノードをアークヘッドとして持つ頂点位置を表します
hlink:次のヘッドノードはアークヘッドです頂点
tlinkのノード:arc.infoの終わりとしてヘッドノード持つ次の頂点のノード
:重みなどの情報を格納します
ここに写真の説明を挿入

ここに写真の説明を挿入
ここに写真の説明を挿入

4.隣接する複数のテーブルストレージ

隣接リストは、無向グラフの保存に適しています。これは、隣接リストとクロスリンクリストの組み合わせに相当します。ヘッドノードの構造を図1に示します。これは、隣接リストのヘッドノード構造と一致しています。通常のノードの構造を図2に示します。
これは、クロスリンクリスト一致しています。ここで、
マーク:ノードなどの追加情報を格納します。操作するかどうか
ivex、jvex:アレイ内のストレージエッジの両端のノードの位置
ilink:ivexに直接関連する
次のノードjlink:jvexに直接関連する次のノード
info:重量およびその他の情報
ここに写真の説明を挿入

ここに写真の説明を挿入
ここに写真の説明を挿入

5.まとめ

上記では、ツリーを格納する4つの方法について説明しました。隣接マトリックスは、ノード間の隣接関係を表すために2次元配列を使用するシーケンステーブルです。隣接テーブルは、配列とリンクリストを使用し、配列は頂点の値を格納し、リンクリストは格納します。隣接する頂点の添え字の位置。有向グラフと無向グラフの保存に適しています。クロスリンクリストのノードの構造は隣接リストとは異なり、各ノードはリンクリストの次のノードを指すだけでなく、他のリンクリストの対応するノードも指し、複数のクロスを形成します。 。有向グラフの保存に適しています。複数の隣接リスト、ヘッドノードは隣接リストの構造を採用し、通常のノードは無向グラフの保存に適したクロスリンクリストの構造を採用します。

3.深さ優先検索と幅優先検索

前のツリートラバーサルに関連して、深度優先検索は、ルートノードから開始する事前注文トラバーサルに似ており、後でアクセスする頂点の隣接ポイントが最初にアクセスされます。これは、ノードに子ノードがあると仮定した場合のバックトラッキングのアイデアです。検索に移動し、見つかった場合は子ノードの検索を続行し、見つからなかった場合は戻り、前のノードの子ノードを検索します。幅優先検索は、階層トラバーサルに似ています。最初にアクセスされた頂点が最初にアクセス
されます次のコードはpythonで実装されています。考え方は次のとおりです。幅優先検索では、キューを使用して各レイヤーのすべてのノードをプッシュし、順番にポップします。そして、すべての要素にアクセスするまで、各ノードの子ノードをプッシュします。深度優先検索では、すべての要素がトラバースされるまで、各子ノードの子ノードを繰り返しトラバースする反復を使用します。

#-*- coding:utf-8 -*-
from queue import Queue
class node:
    def __init__(self,val):
        self.val = val
        self.next = None
class Traversion:
    def __init__(self,nodes):
        self.peeks = []
        self.visted = [0]*len(nodes)
        self.nodes = nodes
    #广度优先搜索
    def bfs(self):
        #使用队列将需要遍历的节点按顺序压入
        queue = Queue()
        queue.put(0)
        self.visted[0] = 1
        self.peeks.append(self.nodes[0][0])
        while not queue.empty():
            index = queue.get()
            for i in self.nodes[index][1]:
                if self.visted[i] == 0:
                    self.visted[i] = 1
                    self.peeks.append(self.nodes[i][0])
                    queue.put(i)
        return self.peeks
    #对每一层中每一个节点进行递归的访问
    def dfs(self,index):
        self.visted[index] = 1
        self.peeks.append(self.nodes[index][0])
        for i in self.nodes[index][1]:
            if self.visted[i] == 0:
                self.dfs(i)
        return self.peeks
if __name__ == '__main__':
    nodes = [("a", [1, 2, 4]),
                ("b", [2]),
                ("c", [4, 3]),
                ("d", [4]),
                ("e", []),]
    traversion = Traversion(nodes)
    print(traversion.dfs(0))

4.深さ優先のスパニングツリーと幅優先のスパニングツリー

ここで、グラフをツリーに変換して、いくつかのツリー操作に従ってグラフを操作できるようにする方法を検討します。深さ優先と幅優先の2つの生成方法を検討します。無向グラフの場合、深度優先スパニングツリーは深度優先トラバーサル方式であり、グラフを通過した頂点を記録して得られるツリーは深度優先スパニングツリーです。幅優先のスパンツリーは、幅優先がトラバースしてツリーを形成する頂点を記録することです。グラフの場合、そのノードの発生と拡張は不規則で乱雑です。それをツリーの形で表現することで、データの開発をある程度定期的に行うことができます。
たとえば、図1の無向グラフの場合、深さを最初に生成したツリーは図2のスタイルであり、幅を最初に生成したツリーは図3のスタイルです。
ここに写真の説明を挿入
ここに写真の説明を挿入
ここに写真の説明を挿入
もちろん、接続されていないグラフの場合。深さを最初に、幅を最初に使用して、複数の木で構成されるフォレストを生成します。次に、前述の子兄弟表記を使用して、ツリーに変換できます。

5.最小スパニングツリー

以前の調査を通じて、グラフをツリーに変換でき、深さ優先と幅優先の方法を採用できることがわかりました。しかし実際には、最適な意味は、次に説明する最小のスパンツリーであることがよくあります。簡単に言えば、最小スパンツリーは、ツリー内のパスの最小の加重和です。
グラフの頂点を都市と見なします。次に、これらの都市間に信号ネットワークを確立する必要があります。両側の重みは、これら2つの都市間の通信コストに相当します。都市がn個ある場合、 n-1行を作成する必要があります。これらのn-1ラインの総コストを最小化する方法は、最小スパンツリーに対応します。
これは白い花の銀です!次に、緊急の場合に備えて、2つの特定のアルゴリズムについて説明します。

1.プリムのアルゴリズム

Primmのアルゴリズムは、実際には2つの頂点間の最短距離を見つけることです。具体的なプロセスは次のとおりです。まず、データをAとBのカテゴリに分類します。Aは決定された頂点のセットを表し、Bは決定されていない頂点のセットを表します。初期状態Aは空で、Bにはすべての頂点が含まれています。まず、Aに追加する頂点をランダムに選択し、Bから頂点を削除します。次に、Aの頂点に最も近いBの頂点を選択し、それをAに追加して、Bから頂点を削除します。Bが空になるまで、上記のプロセスを繰り返します。
このアルゴリズムの時間の複雑さはO(N ^ 2)です。

2. Kruskalアルゴリズム(Kruskalアルゴリズム)

上記のPrimのアルゴリズムは、密接続されたネットワークに適していますが、次のKruskalアルゴリズムは、疎接続されたネットワークに適しています。密および疎を次のように定義します。e<nlog(n)、ここでeはエッジを表します。数、nは頂点の数を表します。アルゴリズムの時間の複雑さは、elog(e)の
特定の実現アイデアです。最初にすべてのエッジを重みに従って小さいものから大きいものに並べ替えてから、エッジをトラバースします。このエッジでツリーがループを形成しない場合は、それを保持します。それ以外の場合は削除します。 。エッジの数がn-1に達するまで(n個の頂点を接続するにはn-1個のエッジが必要であると前述しました)。要約すると、ツリーを生成するためのループを形成せずに、重みが最小のn-1個のエッジを選択します。
では、ループを判断する方法は?最初に各頂点に異なる状態値を割り当て、ツリーに追加されたすべての頂点状態が一貫するように変更されます。このように、次のエッジを選択するときは、エッジの両端の頂点が一貫しているかどうかを判断するだけで済みます。一貫している場合は、すでにツリー内にあり(ループが形成されます)、破棄されます。それ以外の場合は、保持します。

5.まとめ

この記事では、最初に、有向グラフ、無向グラフ、接続グラフ、ループなどのグラフの基本概念を紹介します。次に、グラフを保存する4つの方法を紹介します。隣接マトリックスはシーケンステーブルであり、隣接リストは有向グラフと無向グラフの両方に適しています。クロスリンクリストは有向グラフの保存に適しており、複数の隣接リストは無向グラフの保存に適しています。また、プレオーダートラバーサルやレベルトラバーサルと同様に、深度優先アルゴリズムと幅優先アルゴリズムを導入しました。深さ優先アルゴリズムは子ノードを完全にトラバースし、幅優先アルゴリズムは兄弟ノード層をトラバースします。最後に、深さ優先と幅優先を使用して無向グラフをツリーに変換する方法。

6.火遊び

男は84歳まで生きていたが、幼い頃にした恥ずべきことを突然思い出し、後悔し、そのせいで亡くなった。他の人がそれを見るとき、彼らはこの人が病気を持っておらず、死んでいると言うだけです。誰もこの問題に深く入り込みたくないのです。人々はすでに死んでおり、死者への最大の親切は彼の秘密を彼と一緒に死なせることです。しかし、死んだ人たちが本当に死んでいなかったとしたら、彼らはただより高い次元に昇りました。彼らの秘密をそんなに守ることは私たちにとって慰めになるでしょうか?しかし、私自身の秘密はどうですか?私が一人でいるとき、私は時々恥ずべきことをします。これらはすべて、亡くなった人々から映画として評価されていますか?彼らはとにかく他の人に言わないので、私はそれを真剣に受け止めません。私は自分の恥を他の人に話すほど愚かではありませんが、私自身の最大の親切は、私が大衆の前にいるふりをしても、私が何千人もの卑劣な人々の1人にすぎないことを心の中で理解しなければならないことだと思います。

[マーベル/ DC /ステップオン/ 1080p]高エネルギーを先取り!グースバンプと収束の視覚的な饗宴!

おすすめ

転載: blog.csdn.net/gaobing1993/article/details/108923320