Pythonアルゴリズム-幅の最初の検索

今日は、別のアルゴリズムである幅優先検索について学習します
。最短パスの問題を解決するアルゴリズムは、幅優先検索と呼ばれます。

写真は何ですか:

グラフは一連の接続をシミュレートします。
グラフは、さまざまなものがどのように接続されているかをシミュレートするために使用されます。グラフはノードとエッジで構成されます。
ノードは多くのノードに直接接続される場合があり、これらのノードはネイバーと呼ばれます。

最短パスを見つける:

最初のタイプの問題:ノードAから開始し、次にノードBのパスに移動しますか?
2番目のタイプの問題:ノードAから開始し、ノードBに最短のパスはどれですか?
2番目のタイプの問題解決するには、2より大きい関係と見なすことができます。次数の関係、2次の関係は3次の関係よりも大きい...したがって、1次の関係で検索し、見つからない場合は2番目の次数の関係で検索します...ターゲットが見つかるまで、1次の関係、2次の関係を順番に追加できます...検索リストには、最初に最も近いターゲットを見つけるために、この目的を達成できるデータ構造があります-キュー

キュー:

キューはスタックに似ています。キュー内の要素にランダムにアクセスすることはできません。
キューは、エンキューとデキューの2つの操作のみをサポートします。キューはFirst In First Out(FIFO)データ構造であり、スタックは種のラストインファーストアウト(ラストインファーストアウト、LIFO)データ構造

実装図:

ハッシュテーブルは、各ノードが隣接ノードに接続されているという関係を実現できます。ハッシュテーブルは、キーを値にマップできます
。キーと値のペアが追加される順序は重要ですか?ハッシュテーブルは順序付けられていないため、キーと値のペアが追加される順序は重要ではありません。
ノードとノードの関係は一方向です。他を指す矢印はありません。
これを有向グラフと呼びます。ノードとノードが直接接続されているノードの間に矢印はありません。これは無向グラフと呼ばれます。

アルゴリズム:

キューを更新するときは、「エンキュー」と「デキュー」という用語を使用しますが、「プッシュ」と「ポップ」という用語が使用されることもあります。プッシュはキューに入るのとほぼ同じで、ポップはデキューとほぼ同じです。Python
では、関数dequeを使用して
、コレクションからdequeを作成できます。importdequeインポートモジュール
固有のコード:

from collections import deque

my_dict = {
    
    "a": ["a", "b", "c"], "b": ["d", "e"], "c": [], "d": [], "e": ["a"]}

def find_friend(name):
    my_deque = deque()
    my_deque += my_dict["a"]
    finish = []
    while my_deque:
        person = my_deque.popleft()
        if not person in finish:
            if person == "e":
                print("找到了!")
                return True
            else:
                my_deque += my_dict[person]
                finish.append(person)
    print("没找到!")
    return False

find_friend("a")

幅の最初の検索の実行時間はO(人数+エッジの数)で、通常はO(V + E)と記述されます。ここで、Vは頂点の数、Eはエッジの数です。

おすすめ

転載: blog.csdn.net/Layfolk_XK/article/details/108363882