6

Java で平面内の円のコレクションに重複があるかどうかを判断する 2 つの異なるアルゴリズムを視覚化したいと考えています。

  • 円のすべての組み合わせをチェックする O(n²) アルゴリズム
  • スイープ ラインを使用した O(nlogn) アルゴリズム

視覚化クラスのオブジェクトがアルゴリズム クラスのオブジェクトを「リッスン」できるようにする方法はありますか?たとえば、アルゴリズムが円のペア間のオーバーラップ チェックをいつ実行しているかを確認し、いつ更新するかを知ることができます。視覚化?

他の例: アクティブな円 (スイープ ラインと交差する円) のリストをスイープ ライン アルゴリズムの変数として保持し、別のクラス (視覚化クラス) にその変数を取得させることができます。しかし、そのクラスは、リストが更新され、ビジュアライゼーションを更新する必要があることをどのように知るのでしょうか?

まさに私が考えた戦略です。もっと良い方法があるかもしれません...

4

3 に答える 3

1

おそらく、オブザーバーパターンを読むことはあなたを助けることができます:https ://en.wikipedia.org/wiki/Observer_pattern

java.util.Observerを実装するか、アルゴリズムにコールバック関数/オブジェクトを与えることができます。

オブザーバーに任意のデータを渡すことができます。これにより、アルゴリズムがオーバーラップチェックを実行するタイミングをオブザーバーが決定できるようになります。

于 2012-04-05T23:04:30.080 に答える
1

これが役立つかどうかはわかりませんが、オブザーバーをサポートするようにアルゴリズムのコードを変更できない場合は、アスペクト指向プログラミングを調べるという (興味深い) オプションがあります。

たとえば、AspectJ (例: http://en.wikipedia.org/wiki/AspectJを参照) では、 (「ポイントカット」と呼ばれるものを使用して) 場所 (「結合ポイント」と呼ばれる) を指定できます。 ') を実行する必要があります。これを使用して、アルゴリズムによって実行されているオーバーラップ チェックを検出し、必要に応じて応答することができます。

もちろん、この方法で行うには AspectJ を使用する必要があるため、通常の Java だけでは不可能ですが、調べてみると興味深いことです。

于 2012-04-05T23:15:03.703 に答える
0
  1. 円(およびこの問題/アルゴリズムに存在するその他のオブジェクト)を表すクラスを持ち、各操作のメソッドを含みます。
  2. (1) のオブジェクトに対する操作として、メソッドの呼び出しとしてアルゴリズムを実装します。
  3. オブジェクトを 1 から調べて、各メソッドの状態を視覚化する視覚化クラスを作成しますUpdate()
  4. (1) のすべてのクラスのサブクラスを作成します。これは、元の動作とは別に、Visualization.Update()各操作を呼び出すものです。

(1) の代わりに (4) クラスから「あなたの世界」を構築して視覚化します。

于 2012-04-05T22:40:30.843 に答える