2016-10-04 7 views
0

CGALで初めてのことですが、 (そして...はい、私はCGALとJavaを組み合わせて使用​​しなければなりません):/長い話を短い...私は持っています:Java/CGALはグラフが接続されているかどうかを確認します(説明に制約があります)

  • 私の頂点のx座標とy座標を表す2つのダブル配列。それらをdouble[] x, y;としましょう。
  • 両方の配列には、ランダム値のSがあります。
  • 2つの頂点uwは、distance(x[u], y[u], x[w], y[w]) < CONSTANT(ofc。I do distanceSquared(x[u], y[u], x[w], y[w]) < CONSTANT_SQUARED)と接続されているので、sqrt()を呼ぶのは避けてください。
  • xおよびyは、0からUPPER_LIMITまでの値でランダムに入力されます。他の情報はありません。

質問、xyは接続グラフを記述していますか?

  • アルゴリズム1::各頂点の

    1. ビルドの隣接リスト(Arraylist<Integer>[] adjLists;)(のみ上三角行列が探求)

      今私は2つのalgoritmsを持っています。複雑度O(|V|^2)(V =頂点集合)。

    2. 訪問グラフの頂点が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コードのインスタンス...すでに高速アルゴリズムが実装されていますか?

ありがとうございます!ハッピーコーディング!私はと考えてい

+0

だけでなく、それはあなたの第二アルゴが達成しようとしているかを理解するのは難しいですが、明白なバグがあります。 'double x [] = {1,2,3}'、 'double y [] = {0,0,0}'、 'S = 2'、' CONSTANT_SQUARED = 4'でテストしてください。 '離れてもポイントのペアが2つ離れていない場合でも> 2 **ハッピーデバッグ、Vento ** - 明確なコードを書くことを学ぶ、良いコードを書くチャンスが増えます。 –

+0

Ups申し訳ありませんswitchVarの前のifブロックに 'inside ++ 'と書くのを忘れていました。それを指摘するタイ。 Btw 'S'は配列の長さなので、あなたの例では3になるはずです。 – Vento

+0

2番目のメソッドは接続されたサブグラフを作成し、サブグラフにはインデックス' 0'から 'inside'までの頂点が含まれます。私のサブグラフ(ブロックであれば範囲チェック)にサブグラフ( 'unchecked'インデックス、' inside + 1'から 'S')に接続されているノードを接続する必要がある場合、この新しいノードを内側に移動します座標を切り替えることによって私のサブグラフ。 while条件は境界チェックと計算を高速化する方法です(サブグラフが全体のグラフであるため、グラフが接続されている - >最初のwhileが停止できます)。 – Vento

答えて

0

は、空間索引の方法なしに、あなたは最悪のケースのシナリオで達成しようとしている最高のパフォーマンスは、(すべての接続)O(n*(n-1)/2)になるだろう。

あなたが空間インデックスを構築するために余裕があれば(速度のブーストのために支払うために十分なメモリを持っている)、あなたはR-tree and variants検討すること - 挿入がO(n)検索がO(log2(n))である:これは、「距離を調べることによって、外れ値の検出」あなたを取得するアプローチ最悪のシナリオではO(n*log2(n))のコストである。

​​

関連する問題