1

始める前に、私はグラフ理論があまり得意ではありません。でも、

ウィキペディアからの引用、

単純なサイクルのない連結グラフはすべてツリーです。森は木の非交和です。

JUNGライブラリのソースコードを調べていると、フォレストの定義が次のようになっていることに気付きました。

public interface Forest<V,E> extends DirectedGraph<V,E>

純粋なセマンティックレベルで言えば、それは正しくありませんか?

また

それがそうする特定の理由はありますか?(一部のアルゴリズムの実装では、より意味があり、理解しやすいように)

DirectedGraphPS:それは単なるタグ付けインターフェースであり、関数を宣言していないことを私は知っています。したがって、DirectedGraph代わりに使用すると、UndirectedGraph何らかの影響があります(少なくとも私には何も表示されません)。

4

2 に答える 2

1

JUNGのForestインターフェースはメソッドを定義getChildrengetParentます。これらは、人々が一般的に木や森に関連付けられることを期待する方法であり、グラフが指示されない限り意味がありません。

さらに、そのようなメソッドシグネチャなしでフォレストまたはツリーインターフェイスを使用する意味はありません。確かに、グラフ理論では、ツリーは単に接続された非巡回グラフです。しかし、一般的にグラフに適用されない無向エッジを持つツリーに適用される(少なくとも一般的なユーティリティの)メソッドはありません。とは言うものの、無向のエッジを持つツリーになるようにそれ自体を制約するGraphの実装を確かに作成することができます-そしてあなたはそれを自由に行うことができます。

于 2013-03-08T15:42:55.693 に答える
1

JUNG がツリーを有向グラフと定義していることを考えると、フォレストも有向グラフであることは確かに理にかなっています。有向グラフの和集合は有向グラフです。

これにより、Tree が DirectedGraph を拡張する必要があるかどうかという疑問が軽減されます。ツリーがグラフであることは確かに理にかなっています。それらには確かにノードとエッジがあり、上で引用した定義はそれらを特定のクラスのグラフとして定義しています。そこで問題になるのは、木を向けるべきかということです。

多くの場合、すべてのエッジがルートを指している有向木 (これらは和集合検索アルゴリズムで使用されます)、またはすべてのエッジがルートから離れた方向を指している有向木 (探索木がその例です) を考慮することは理にかなっています。ただし、無向木 (無向グラフのスパニング ツリーなど) を考慮することも理にかなっています。

デザイナーが、エッジの方向とツリー構造との関係を指定せずに、すべてのツリーが方向付けられていることを指定することを選択したことは、私にとって少し驚くべきことです (ただし、「間違っている」わけではありません)。つまり、ツリーがグラフを拡張することを単純に指定し、特定のインスタンス化でツリーが有向か無向かをさらに指定するのが合理的だと思います規則 (ルートに向かう方向またはルートから離れる方向) を選択し、javadoc でその規則を明確に指定します。開発者が選択したソリューションでは、ツリーの実装者がエッジ全体の方向を指定することを余儀なくされ、ツリーのユーザーがその構造を利用できなくなります。たとえば、ユーザーがすべてのエッジがルートから離れていることを知っている場合、ルートから開始してルートから出るすべてのエッジにアクセスすることでグラフをトラバースできますが、両方の着信を考慮する必要があることを知らない場合は、および発信エッジ。

Java の instanceof テストのために、メソッドを持たないインターフェースを実装すると、結果が生じる可能性があります。たとえば、グラフ描画ルーチンは、グラフが有向グラフのインスタンスであるかどうかをチェックし、そうであれば、線の代わりに矢印を描画できます。

最後に、図書館で使われている用語を理解しようとするときは、ウィキペディアやその他の情報源にアクセスすることに少し注意を払う必要があります。たとえば、一部のライブラリでは、「グラフ」は実際には「有向加重グラフ」を意味します。javadoc にアクセスすることをお勧めします。

于 2013-03-08T05:20:46.673 に答える