-1

私はプログラムのためにいくつかのcコードを作成しました。これは、サウンドデータに対していくつかの音響心理学を行います。

実行速度が非常に遅いコードがあります。

ルックアップテーブルを使用するのが最善だと思います。どのようにそれを実装するのでしょうか?

任意のポインタまたはヘルプをいただければ幸いです!:)

4

4 に答える 4

6

あなたの価値観は等距離ではないので、それほど簡単ではありません。しかし、それでも可能です。すべての条件値(ここでは50)の最大公約数を取り、テーブルを作成します。

byteout = lut [difference / 50 + 12];

また、ルックアップテーブルでは、転記された順序で値を使用できます。ステップが100の場合は、エントリを複製します。

ところで、間違いがあります。すべてのネガティブなケースが最初のケースに捕らえられます<=0(私の例では、最初のケースを省略したいと想定しています)。

于 2011-04-04T19:14:51.727 に答える
2

まず、最初のチェックを0に対して行う場所を確認します。これにより、すべてのネガティブチェックが無意味になります。

次に、ルックアップテーブルを1300要素の配列として作成し、500(最小の負の値)でオフセットします。各要素は、その番号を調べたときに必要な結果になります。-500未満のものを探している場合は、配列をチェックしないでください。

したがって、次のようになります。

table[0] = 0b0110; // -500 through -599
table[1] = 0b0110;
...
table[100] = 0b0101; // -400 through -499
table[101] = 0b0101;
...

ルックアップは次のようになります。

if (value <= -600) {
    return 0b0111;
}
else {
    return table[value + 600];
}

値の数が十分に少ないため、配列のサイズが禁止されていません。プログラムの開始時にループで初期化します。

于 2011-04-04T19:12:23.177 に答える
1

勝利のための二分探索。

可能なすべての値を配列に格納し、必ず並べ替えてください。

真ん中から始めて、differenceがその値よりも小さいかどうかを確認します。その場合は、カーソルの左側の中央に移動して、再試行してください。そうでない場合は、右に移動します。必要な値が見つかるまで続けて、それを使用します。

配列は、最小値と対応するbyteout値を持つ構造体である可能性があります。

編集:考えられる誤解を解消するために、「すべての可能な値」とは、-1400から1400までのすべての数値を意味するのではなく、元のコードでチェックする値だけを意味します。

于 2011-04-04T19:06:59.677 に答える
0

最初のビットを見てみましょう:

if (difference <= 0)
  byteout = 0b0000;
else if (difference <= -600)
  byteout = 0b0111;

-601の値があるとしましょう。

<= 0ですか?はい、そうですbyteout = 0b0000;

-600に到達することはありません。したがって、事実上、すべての負の値は0b0000です。これは仕様による場合とそうでない場合がありますが、そうである場合は、他のすべての負の値を取り除くことができます。

それ以外の場合は、これを式(可能な限り少ないブランチ)に減らすか、事前に計算されたルックアップテーブルとバイナリ検索の@Ebomikeのソリューションを使用することを検討します。

于 2011-04-04T19:12:09.650 に答える