0

私のコードでは、有向非巡回グラフを表すクラスを使用しています。私は自分でコードを書きました、それは難しくありませんでした。しかし、後で私は自分のアプリにもっと多くの要件があることに気付きました。グラフは推移簡約である必要があります。つまり、部分的なオードラーの一意の表現である必要があります。ユーザーがグラフのビジュアルGUI表現でドラッグアンドドロップまたはカット/コピー/貼り付けを行うたびに、それを検証してこの要件に適合させる必要があります。今、物事はより複雑になります。そこで、すべてのグラフ操作を安全に実行する方法などを計画しましたが、実際にコードに飛び込む前に、次のことを知りたいと思います。

半順序の既知のC/C ++インターフェースはありますか?(できればC ++)

グラフ用のライブラリをたくさん見つけましたが、私はすでに単純な非巡回有向グラフコードを持っています。推移簡約グラフを具体的に扱うものは見つかりませんでした(隣接行列は必要ありません。データはユーザーから取得されるため、ここでは非効率的です...これはユーザーデータ用の小さなグラフであり、数学的な使用)

不要な接続を自動的に検出して削除し、ノードのコピー/移動操作が半順序で有効かどうか、つまり半順序のプロパティを保持するかどうかを確認するためのテストを行うインターフェイスを探しています。

4

2 に答える 2

1

半順序検証メソッドを追加することをお勧めします。編集が行われているときに、グラフ全体のコピーを作成し、編集を1つのコピーに適用してから、それを検証します。合格した場合は、変更したコピーを保持します。合格しない場合は、保存したコピーに戻します。

おそらく、バリデーターはすべての最下位ノードを見つけ、それぞれについて、その祖先(または、それらを呼び出す場合は子孫)のマルチセットを構築し、重複するエントリをチェックすることができます。小さなグラフしか期待できない場合は、検索の再帰に戻ります。

于 2013-01-24T21:12:20.583 に答える
1

私の知る限り、数学以外の目的で使用する場合、通常、プログラムには独自のグラフクラスがあります。これは、グラフがSTLコンテナー(ベクトル、リストなど)などの線形コンテナーよりもはるかに複雑になる可能性があるために発生します。

数学やアルゴリズムの分野で特別なニーズはないので(あなたの場合の検索アルゴリズムは単純なループになりますが、ほとんどの場合、それ以上は必要ありませんが、(時期尚早)の場合は確かにそうではありません) 最適化)。もしそうなら、あなたはブースト::グラフを持っています、しかし私はそれがあなたを助ける以上に物事を複雑にするだろうと思います。

つまり、優れたグラフ/ノードクラスを作成します。それが十分に優れていて、汎用向けに作成されていれば、私たち全員がその恩恵を受けることができます。あなたのニーズに一致する既存の公開コードが実際にはないため、誰も質問に答えていません。良いlibreコードを一度書けば、どこでも使用できます。幸運を。

PS独自の検索アルゴリズムは、boost ::graphなどの汎用グラフライブラリ用に作成されたものよりもはるかに高速である可能性があります。これは、特定のグラフの既知の制限とルールを利用できるため、検索がはるかに高速になるためです。たとえば、推移簡約グラフでは、AがBの親である場合、Aはbを非子の子孫(たとえば孫)として持つこともできないため、この知識を使用して検索を最適化できます。グラフを変更するときに支払う代償は多くのテストを行うことですが、検索/スキャンがはるかに高速になる可能性があるため、多くの利益を得ることができます。

于 2013-02-16T13:50:53.153 に答える