2011-07-26 4 views
10

私は分裂征服アルゴリズム(実際には、いくつかの入力ポイントに合わせてカーブフィッティングを行うアルゴリズム)に取り組んでいます。 'divide'部分では、各点の誤差項を計算する必要があります。エラーが所定のしきい値を超えている場合は、その点で曲線を分割し、入力の左右の部分を別々に処理します。単純なループがそのトリックを行います。現在のセクションの真ん中から始め、外側に向かって作業することは私にとっては有益でしょう。 (明確にするために、誤差が大きすぎる点を見つけたら、再帰的に呼び出して左と右の部分に別々の曲線を生成します - すべての点が閾値内にあれば、私の曲線は適合して返します)。周辺の開始、すなわち配列を中央から外側にループするアルゴリズムですか?

int steps = (endIndex+1-startIndex); 
int i = (startIndex+endIndex)>>1; 
int stepdir = 1; 
for(int q=0; q<steps; q++, i+=stepdir*q, stepdir=-stepdir) 
{ 
    // test point i here and return early if error exceeds threshold 
} 

は、ヘッド傷のビットの後、私は、この(点がアレイにあり、現在のセクションがstartIndexから包括endIndexである)を思い付い中位、前向きに1つ、後ろに2つ、前に3つ、後ろに4つ...それは機能し、効率的だと確信していますが、それを行うためのよりクリーンな方法があるはずです。 Java言語の仕様をチェックして、for update式の文が(C/C++のようにシーケンス演算子ではなくても)順番に評価されたことを確認する必要があります。

感謝の意を表します。よりクリーンな方法がありますか?

+0

あなたは再帰関数の一部として、このループを使用していますか?すなわち各分割で再帰的に分割して呼び出す。 –

+0

はい...明確にするために質問を編集しました。最終的な結果は、いくつかのソースポイントで結合された一連の「シンプルな」カーブと、その間にあるものに「十分に近い」カーブです。 –

答えて

14

これは

for (int q=0; q < steps; q++) { 

    int index = i + (q% 2 == 0 ? q/2 : -(q/2+1)); //index lookup here 
} 

編集私見より読みやすいでしょう:あなたの過剰-エラーチェッカは、(例えば、関数呼び出し)単純な場合、インデックス検索でのミスを実現

+0

合意。これは、各インデックスが正確に1回訪問され、アレイ全体がカバーされることをより明白にする。ありがとう。 –

+0

は2回訪れませんか? – phkahler

+0

q == 1の場合は、index = i + - (0 + 1)となります。 q == 2の場合、index = i +(1)となります。私は例に括弧を入れてもっと明確にする – jontro

1

、明確な事はしています書き込み:

int mid = npoints/2; 
for (int i = 0; i <= mid; i++) { 
    if(excess_error(mid + i + 1)) { 
      // divide at mid + i + 1 
    } else if excess_error(mid - i) { 
      // divide at mid - i 
    } 
} 

再び「分割XYZで」コードが関数呼び出しであるべきか、&貼り付けコードをカットし得ます。

は(私はコーナーケースについて慎重に考えていない、と私は==半ば、しかし、あなたが画像を取得するときにオフすることにより-1のエラー、ので注意してください。)

+0

大きすぎるエラーが見つかるとすぐに、私はループから逃げ出し、2つの半分を再帰的に繰り返すので... '分割'部分はかなり分裂しているループから抜け出すことができます。後で報告するためにエラー計算の結果を保存します。関数呼び出しの中で一般的な振る舞いを実装する必要があることは間違いありません。 –

+0

これで、セーブポイントとブレークも非常に簡単です。コードの繰り返し回数は、関数呼び出しの場合とほとんど変わりません。 –

0

はここで誰のためのより一般的なソリューションです任意の点(この例では、長さ7の配列のセル[6])から外側に検索する必要があります。

int arraySize = 7; 
int start = 6; 

for (int i=0; i < arraySize; i++) { 
    int index = (start+((i%2==0)?i/2:arraySize-(i+1)/2))%arraySize; 
    print(index+","); 
} 
exit(); 

プリント6,5,0,4,1,3,2、

関連する問題