CGALで初めてのことですが、 (そして...はい、私はCGALとJavaを組み合わせて使用しなければなりません):/長い話を短い...私は持っています:Java/CGALはグラフが接続されているかどうかを確認します(説明に制約があります)
- 私の頂点のx座標とy座標を表す2つのダブル配列。それらを
double[] x, y;
としましょう。 - 両方の配列には、ランダム値の
S
があります。 - 2つの頂点
u
とw
は、distance(x[u], y[u], x[w], y[w]) < CONSTANT
(ofc。I dodistanceSquared(x[u], y[u], x[w], y[w]) < CONSTANT_SQUARED
)と接続されているので、sqrt()を呼ぶのは避けてください。 x
およびy
は、0
からUPPER_LIMIT
までの値でランダムに入力されます。他の情報はありません。
質問、x
とy
は接続グラフを記述していますか?
アルゴリズム1::各頂点の
- ビルドの隣接リスト(
Arraylist<Integer>[] adjLists;
)(のみ上三角行列が探求)今私は2つのalgoritmsを持っています。複雑度
O(|V|^2)
(V =頂点集合)。 - 訪問グラフの頂点が
S
に等しい場合、再帰グラフの探索、頂点のマーキングとカウント、私のグラフには接続されたコンポーネントが1つしかありません。グラフが接続されています。複雑度O(|E|)
(E =エッジセット)。
- ビルドの隣接リスト(
アルゴリズム2:
private static boolean algorithmGraph(double[] x, double[] y) { int unchecked, inside = 0, current = 0; double switchVar; while (current <= inside && inside != S - 1) { unchecked = inside + 1; while (unchecked < S) { if ((x[current] - x[unchecked]) * (x[current] - x[unchecked]) + (y[current] - y[unchecked]) * (y[current] - y[unchecked]) <= CONSTANT_SQUARED) { inside++; // switch x coordinates | unchecked <-> inside switchVar = x[unchecked]; x[unchecked] = x[inside]; x[inside] = switchVar; // switch y coordinates | unchecked <-> inside switchVar = y[unchecked]; y[unchecked] = y[inside]; y[inside] = switchVar; } unchecked++; } current++; } return inside == S - 1; }
おかしい事は二番目が遅い、私はデータ構造を使用していない、コードを反復し、インプレースが、スイッチ作るの多用でありますそれは地獄のように遅くなる。
問題の仕様が変更されましたが、現在はCGALとJavaでそれを行う必要があります。「https://github.com/CGAL/cgal-swig-bindings」全体を読んでJava内でCGALを使用する方法を学習しますが、 CGALコードのインスタンス...すでに高速アルゴリズムが実装されていますか?
ありがとうございます!ハッピーコーディング!私はと考えてい
だけでなく、それはあなたの第二アルゴが達成しようとしているかを理解するのは難しいですが、明白なバグがあります。 'double x [] = {1,2,3}'、 'double y [] = {0,0,0}'、 'S = 2'、' CONSTANT_SQUARED = 4'でテストしてください。 '離れてもポイントのペアが2つ離れていない場合でも> 2 **ハッピーデバッグ、Vento ** - 明確なコードを書くことを学ぶ、良いコードを書くチャンスが増えます。 –
Ups申し訳ありませんswitchVarの前のifブロックに 'inside ++ 'と書くのを忘れていました。それを指摘するタイ。 Btw 'S'は配列の長さなので、あなたの例では3になるはずです。 – Vento
2番目のメソッドは接続されたサブグラフを作成し、サブグラフにはインデックス' 0'から 'inside'までの頂点が含まれます。私のサブグラフ(ブロックであれば範囲チェック)にサブグラフ( 'unchecked'インデックス、' inside + 1'から 'S')に接続されているノードを接続する必要がある場合、この新しいノードを内側に移動します座標を切り替えることによって私のサブグラフ。 while条件は境界チェックと計算を高速化する方法です(サブグラフが全体のグラフであるため、グラフが接続されている - >最初のwhileが停止できます)。 – Vento