今日は、別のアルゴリズムである幅優先検索について学習します
。最短パスの問題を解決するアルゴリズムは、幅優先検索と呼ばれます。
写真は何ですか:
グラフは一連の接続をシミュレートします。
グラフは、さまざまなものがどのように接続されているかをシミュレートするために使用されます。グラフはノードとエッジで構成されます。
ノードは多くのノードに直接接続される場合があり、これらのノードはネイバーと呼ばれます。
最短パスを見つける:
最初のタイプの問題:ノード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はエッジの数です。