タグ付けされた質問 「graph-traversal」

BFSやDFSなどのグラフトラバーサルアルゴリズムに関する質問。

8
グラフ検索:幅優先と深さ優先
グラフを検索する場合、幅優先と深さ優先の 2つの簡単なアルゴリズムがあります(通常、すべての隣接グラフノードをキュー(幅優先)またはスタック(深さ優先)に追加することによって行われます)。 さて、他のものよりも優れているものはありますか? 私が考えることができるもの: グラフ内のデータがかなり下にあると予想される場合、グラフのより深い部分に非常に高速で進むため、深さ優先の方が早く検索される場合があります。 逆に、データがグラフのかなり上にあると予想される場合、幅優先の方が結果が早くなる可能性があります。 私が見逃したものはありますか、それは主に個人的な好みに帰着しますか?

7
BFS / DFSを使用して木の直径を見つけるアルゴリズム。なぜ機能するのですか?
このリンクは、BFS / DFSを使用して無向木の直径を見つけるためのアルゴリズムを提供します。要約: グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。 なぜ機能するのですか? このページ2には理由がありますが、混乱を招きます。証明の最初の部分を引用しています: グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。 正しさ:d(a、b)が木の直径になるように、aとbを2つのノードとします。aからbへの一意のパスがあります。tをBFSによって検出されたそのパス上の最初のノードとします。sからuへのパスとaからbへのがエッジを共有しない場合、tからuへのパスにはsが含まれます。そうp1p1p_1p2p2p_2 d(t,u)≥d(s,u)d(t,u)≥d(s,u)d(t,u) \ge d(s,u) d(t,u)≥d(s,a)d(t,u)≥d(s,a)d(t,u) \ge d(s,a) ....(さらに不等式が続きます..) 不平等は私には意味がありません。

4
グラフの深さ優先検索におけるグレーノードの目的
私が見た深さ優先検索の多くの実装(例:ここ)では、コードは灰色の頂点(発見されたが、そのすべての隣人が訪問されたわけではない)と黒の頂点(発見され、そのすべての隣人が訪問された)を区別します。この区別の目的は何ですか?DFSアルゴリズムは、グレーであるか黒であるかに関係なく、訪問先の頂点にアクセスすることはないようです。

2
ユークリッド平面に埋め込まれたグラフの最短非交差パス(2D)
経路に自己交差が含まれないように、ユークリッド平面に埋め込まれたグラフの最短経路を見つけるためにどのアルゴリズムを使用しますか? たとえば、次のグラフでは、ます。通常、ダイクストラのアルゴリズムのようなアルゴリズムは、次のようなシーケンスを生成します。(0 、0 )→ (- 3 、2 )(0、0)→(−3、2)(0,0) \rightarrow (-3,2) [(0 、0 )→3(0 、3 )→2√(1 、2 )→4(- 3 、2 )] = 7 + 2–√。[(0、0)→3(0、3)→2(1、2)→4(−3、2)]=7+2。\left[ (0,0) \stackrel {3}{\rightarrow} (0,3) \stackrel{\sqrt{2}}{\rightarrow} (1,2) \stackrel{4}{\rightarrow} (-3,2) \right] = 7+\sqrt{2}. 完全なグラフ: 最短経路: 最短の非交差パス: しかし、ユークリッド平面上のこのパスが交差自体は、それゆえ私はしたい、この場合には、私の最短非交差シーケンスを与えるアルゴリズムを: [(0 、0 )→3(0 、3 )→3(0 、6 )→5(- 3 、2 )] = …

1
迷路からの脱出を保証する手順
4つのコマンド「上/下/右/左に移動」を与えることができる2次元の迷路があるとします。迷路を知っているが、人がどこにいるかは知らないので、迷路を抜けることを保証するコマンドの最小シーケンスを見つける方法は?迷路のどこから始めても機能する単一のコマンドシーケンスを探しています。 右側に壁があるときにパートナーに「右に移動」コマンドが与えられた場合、彼は単に現在の場所に留まると仮定します。 つまり、迷路が与えられ、一連のコマンドを選択する必要があります。その後、パートナーは迷路のどこかに配置され、事前に選択した一連のコマンドに従います。このシーケンスにより、パートナーが最初に配置された場所に関係なく、パートナーが確実に脱出できるようになります。許可されるコマンドには条件ステートメントがないため、パートナーに応じて異なるシーケンスに従うことはできません。 迷路の説明が与えられた場合、そのようなシーケンスを構築する多項式時間アルゴリズムはありますか? Yuval Filmusは、これは同期語問題の特殊なケースであり、ユニバーサルトラバーサルシーケンスに関連している可能性があると述べています。また、関連があると思われる論文を見つけました。 同時迷路解決問題。Stefan Funke、AndréNusser、Sabine Storandt。AAAI 2017。 残念ながら、一般的なグラフの場合、これは未解決の問題のように見えますが、この特定のケースに適したアルゴリズムがあるのではないかと思っています。候補者のアプローチを思い付きました。すべての位置に、終了するのに必要な最小ステップ数をラベル付けし、迷路内のすべてのエージェントを追跡します。この方法でA *検索を実行できる場合があります。

2
BSTでの検索時に可能な検索パスの数
次の質問がありますが、答えはありません。私の方法が正しいかどうか私は感謝します: Q.バイナリサーチツリーでキー値60を検索すると、キー値10、20、40、50、70、80、90を含むノードが、必ずしも指定された順序で移動されるわけではありません。これらのキー値が、値60を含むルートノードからの検索パスで発生する可能性のある順序はいくつありますか? (A)35(B)64(C)128(D)5040 質問から、与えられたすべてのノードをトラバーサルに含める必要があり、最終的にキー60に到達する必要があることを理解しています。たとえば、そのような組み合わせの1つは次のようになります。 10、20、40、50、90、80、70、60。 上記のすべてのノードをトラバースする必要があるため、10または90から開始する必要があります。20から開始すると、10に到達しません(60> 20であり、20の右サブツリーをトラバースするため)。 同様に、80から始めることはできません。90に到達できないためです。80> 60なので、80の左のサブツリーをトラバースし、90に到達しません。 残りのノードは20、40、50、70、80、90です。次のノードは20または90のいずれかです。前述の同じ理由で他のノードを取得することはできません。 同様に考えると、各レベルで2つの選択肢があります。ノードは7つあるため、最初の6つには2つの選択肢があり、最後の1つには選択肢がありません。だから完全にあります 2∗2∗2∗2∗2∗2∗12∗2∗2∗2∗2∗2∗12*2*2*2*2*2*1順列= = 6426262^6646464 これは正解ですか? そうでない場合、より良いアプローチは何ですか? 一般化したいと思います。場合ノードが次に与えられる合計の可能な検索パスは次のようになり2 n − 1nnn2n−12n−12^{n-1}

4
2つの異なるツリーの予約注文トラバーサルは、たとえ異なっていても同じですか?
この質問は、それらが可能であることをかなり説明していますが、同じプレオーダートラバーサルを持つ2つの異なるツリーがある例は示していません。 また、構造的には異なりますが、2つの異なるツリーの順序トラバーサルは同じでもかまいません。この例はありますか?

3
幅優先検索での「幅」の意味は何ですか?
私は幅優先検索について学んでいて、なぜBFSがそう呼ばれるのかという疑問が頭に浮かびました。「CLRSによるアルゴリズムの紹介」の本で、私はこれについて次の理由を読みました。 幅優先探索は、発見された頂点と発見されていない頂点の間の境界を、境界の幅全体に均一に拡張するため、このように呼ばれています。 しかし、私はこの発言の意味を理解することができません。私はこの「フロンティア」という言葉とそのフロンティアの幅について混乱しています。 それで、私のような初心者にとって理解しやすい方法でこの質問に誰かが答えてもらえますか?

1
DFSとBFSがまったく同じ順序でノードを処理するようにするグラフ
一部のグラフでは、DFSとBFSの検索アルゴリズムは、ノードが同じノードで開始する場合、まったく同じ順序でノードを処理します。2つの例は、パスであるグラフと星型のグラフ(任意の数の子を持つ深さ木)です。このプロパティを満たすグラフを分類する方法はありますか?111

3
DFTのクロスエッジとフォワードエッジの違い
深さ優先ツリーには、ツリーを定義するエッジがあります(つまり、トラバーサルで使用されたエッジ)。 他のノードのいくつかを接続するいくつかの残りのエッジがあります。クロスエッジとフォワードエッジの違いは何ですか? ウィキペディアから: このスパニングツリーに基づいて、元のグラフのエッジは3つのクラスに分けることができます。ツリーのノードからその子孫の1つを指す前方エッジ、ノードからその祖先の1つを指す後方エッジ、そしてどちらもしないクロスエッジ。時々、スパニングツリー自体に属するエッジであるツリーエッジは、フォワードエッジとは別に分類されます。元のグラフが無向の場合、そのエッジはすべてツリーエッジまたはバックエッジです。 あるノードから別のノードを指すトラバーサルで使用されていないエッジは、親子関係を確立しませんか?

2
DFSがスペースの複雑さを持っていると見なされるのはなぜですか?
これらのメモによると、DFSは空間の複雑さを持っていると見なされます。ここで、はツリーの分岐係数であり、は状態空間内のパスの最大長です。b mO (b m )O(bm)O(bm)bbbメートルmm 同じことが、Uninformed SearchのこのWikibookページでも述べられています。 現在、DFSに関するWikipediaの記事の「情報ボックス」は、アルゴリズムのスペースの複雑さについて次のことを示しています。 O ()O (| V| )O(|V|)O(|V|)、繰り返しなしでグラフ全体をトラバースする場合、重複ノードを排除せずに、暗黙的グラフの検索された最長経路長O (O(O())) これは、DFSのスペースの複雑さ、つまりであると私が考えたものにより似ています。ここで、はアルゴリズムが到達する最大長です。mO(m)O(m)O(m)mmm なぜこれが事実だと思いますか? まあ、基本的には、現在見ているパスのノード以外のノードを保存する必要はないので、Wikibookと私が紹介したメモの両方が提供する分析でを掛けても意味がありません。に。bbb さらに、Richard KorfによるIDA *に関するこの論文によると、DFSのスペースの複雑さはであり、は「深度カットオフ」と見なされます。dO(d)O(d)O(d)ddd では、DFSの正しいスペースの複雑さは何ですか? それは実装に依存すると思うので、異なる既知の実装のスペースの複雑さの説明をいただければ幸いです。

1
2つのノード間のk最短経路を見つける
重み付き有向グラフ、および重み関数d (u 、v )が与えられると、通常はダイクストラのアルゴリズムを使用して最短経路を取得できます。私が興味を持っているのは、2 n d-最短経路、3 r d-最短経路などを取得する方法です。G = V、EG=V、EG=V,Ed(u 、v )d(あなた、v)d(u,v)2n 日2んd2^{nd}3r d3rd3^{rd} 質問: 重み付きグラフの2つのノード間のi番目に最短のパスを取得する効率的なアルゴリズムはありますか? 重み付きグラフの2つのノード間のk最短経路を取得するための効率的なアルゴリズムはありますか? 2番目の質問への回答は、最初の質問への回答への呼び出しよりも効率的に実行できるのではないでしょうか。kkk

3
有向グラフの一意のパス
私は、有向グラフが頂点に対して一意であるかどうかを判別するクラスのアルゴリズムを設計しています。これにより、任意のu ≠ vに対して、vからuまでのパスが最大で1つ存在します。BFS(幅優先検索)を使用してvから別の頂点uへの最短パスを見つけ、次にBFSを再度実行して、vからuへの代替パスが見つかるかどうかを確認することから始めました。しかし、これは時間がかかりすぎると思います。より短い実行時間でソリューションを見つける方法についてのヒントはありますか?vvvu ≠ vあなた≠vu \ne vvvvあなたあなたu

2
有向グラフの強く接続されたコンポーネントアルゴリズムの正確性
私は有向グラフ強連結成分を見つけるためのアルゴリズムについて読んでいます。2つのDFS検索を考慮し、2番目のステップは元のグラフG Tを転置します。G=(V,E)G=(V,E)G=(V,E)GTGTG^T アルゴリズムは次のとおりです。 DFSを実行し(任意の開始頂点から開始)、すべての頂点の終了時間を追跡します。GGG 転置を計算し、 でDFSを実行し、最後の終了時刻の頂点から開始して、その頂点をルートとするツリーを形成します。ツリーが完成したら、次の最新の終了時刻で未訪問の頂点に移動し、DFSを使用して別のツリーを形成し、G Tのすべての頂点が訪問されるまで繰り返します。GTGTG^TGTGTG^T 2番目のDFSによって形成された各ツリーの頂点を、個別に強く接続されたコンポーネントとして出力します。 私の質問は: 転置計算のこの中間ステップの背後にある直感は何ですか?

3
フォレスト内のすべてのノードの高さを見つける
私にはフォレスト、つまり有向エッジがあり、サイクルがない(有向または無向)ノードがあります。頂点高さを、vvv入力エッジがない場合は0として定義するか、高さ0の頂点に到達するために逆方向に移動するエッジの最大数を定義します。 また、ノードの平均次数は小さな定数、たとえば2程度であることも知っています。すべての頂点の高さを見つけるには、2つのアルゴリズムを考えることができます。 歩行アルゴリズム 入力エッジのない頂点について、とマークしh = 0h=0h=0ます。 各頂点について、出て行くエッジをたどり、以前の高さがより小さければ、遭遇した各頂点の高さを更新します。h = 0h=0h=0 フロンティアアルゴリズム 通過マークのない着信エッジを持つ頂点の、およびフロンティアとしてこれらをマークします。h = 0h=0h=0 すべてのフロンティア頂点について、親がフロンティア以下に子を持っているかどうかを確認します。もしそうであれば、親に加え、その子の中で最大の高さがあることをマークします。親がフロンティアにいるとマークします。111 フロンティアを超えるものがなくなるまで、2を繰り返します。 私の質問: この問題に名前はありますか、そして最もよく知られている最速の解決策はありますか? 私はすべての頂点から単に上に行くことが最も速い解決策であると考える傾向があります。私は正しいですか?h = 0h=0h=0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.