14

半順序が定義されている要素のコレクションを保持し、トポロジカル順序でそれらの要素を反復できるデータ構造のJava実装を探しています(可能な順序はどれでも問題ありません。できれば安定しています)。コレクションの内容が変更されたときの順序)。

理想的には、、、、またはインターフェイスを実装し、インターフェイス上のすべてのメソッドをサポートしますCollection<E>。全体の順序を指定するという点では、コレクションは。でインスタンス化でき、比較対象の2つの要素が相互に順序付けされていない場合、コンパレータは例外(?)をスローする可能性があります。ボーナスとして、挿入されている要素が順序異常(要素の順序グラフのサイクル)を生成する場合、例外がスローされます。Set<E>SortedSet<E>Comparator<E>ClassCastException

そうですね、トポロジカルソートが必要ですが、SortedSetがコレクションをソートされた順序で維持するのと同様に、挿入/削除のたびにそのソート順を維持するコレクションオブジェクトが必要です。

このようなものはありますか?いくつかのオープンソースライブラリでは?

参照:

http://en.wikipedia.org/wiki/Partially_ordered_set

http://en.wikipedia.org/wiki/Topological_sorting

アップデート

要件のパフォーマンスへの影響(および、ポセットを使用して完全に解決できなかった他のさまざまな問題)を認識した後、ポセットを必要としないという別のアプローチを採用することになりました。要素間の順序を決定するためにコンパレータに依存するということは、要素の挿入については、既存のすべての要素に対してコンパレータを参照する必要があり、挿入ごとにO(n)のコストがかかることを意味します。

パフォーマンスがそれほど重要ではなく(そうである場合)、要素の数が合理的なものに制限されている場合(そうではない)、おそらく私自身のグラフの実装とトポロジカルを使用して、ウィリーによって提案されたアプローチを採用したと思います依存関係を最小限に抑えるために実装をソートします。

4

1 に答える 1

4

有向非巡回グラフは、ニーズに対して十分に一般的でしょうか?これは一般的にポセットをキャプチャしないことは知っていますが、グラフサイクルを除外したいとおっしゃいました。

もしそうなら、あなたはJGraphTを見るかもしれません:http://jgrapht.org/

トポロジソート用のグラフイテレータがあります。

有向グラフはjava.util.Collectionsではありませんが、java.util.Setである頂点を取得できることに注意してください。データ構造自体をコレクションにする必要がある場合は、頂点を要素として扱い、コレクションである薄いラッパーでJGraphT有向グラフをラップすることができます。

ここでの潜在的な欠点は、エッジを明示的に作成する必要があることです。これは、アプリケーションで受け入れられる場合と受け入れられない場合があります。

于 2012-09-11T05:07:27.200 に答える