私はプログラムのためにいくつかのcコードを作成しました。これは、サウンドデータに対していくつかの音響心理学を行います。
実行速度が非常に遅いコードがあります。
ルックアップテーブルを使用するのが最善だと思います。どのようにそれを実装するのでしょうか?
任意のポインタまたはヘルプをいただければ幸いです!:)
私はプログラムのためにいくつかのcコードを作成しました。これは、サウンドデータに対していくつかの音響心理学を行います。
実行速度が非常に遅いコードがあります。
ルックアップテーブルを使用するのが最善だと思います。どのようにそれを実装するのでしょうか?
任意のポインタまたはヘルプをいただければ幸いです!:)
あなたの価値観は等距離ではないので、それほど簡単ではありません。しかし、それでも可能です。すべての条件値(ここでは50)の最大公約数を取り、テーブルを作成します。
byteout = lut [difference / 50 + 12];
また、ルックアップテーブルでは、転記された順序で値を使用できます。ステップが100の場合は、エントリを複製します。
ところで、間違いがあります。すべてのネガティブなケースが最初のケースに捕らえられます<=0
(私の例では、最初のケースを省略したいと想定しています)。
まず、最初のチェックを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];
}
値の数が十分に少ないため、配列のサイズが禁止されていません。プログラムの開始時にループで初期化します。
勝利のための二分探索。
可能なすべての値を配列に格納し、必ず並べ替えてください。
真ん中から始めて、difference
がその値よりも小さいかどうかを確認します。その場合は、カーソルの左側の中央に移動して、再試行してください。そうでない場合は、右に移動します。必要な値が見つかるまで続けて、それを使用します。
配列は、最小値と対応するbyteout
値を持つ構造体である可能性があります。
編集:考えられる誤解を解消するために、「すべての可能な値」とは、-1400から1400までのすべての数値を意味するのではなく、元のコードでチェックする値だけを意味します。
最初のビットを見てみましょう:
if (difference <= 0)
byteout = 0b0000;
else if (difference <= -600)
byteout = 0b0111;
-601の値があるとしましょう。
<= 0ですか?はい、そうですbyteout = 0b0000;
-600に到達することはありません。したがって、事実上、すべての負の値は0b0000
です。これは仕様による場合とそうでない場合がありますが、そうである場合は、他のすべての負の値を取り除くことができます。
それ以外の場合は、これを式(可能な限り少ないブランチ)に減らすか、事前に計算されたルックアップテーブルとバイナリ検索の@Ebomikeのソリューションを使用することを検討します。