8

私のプログラムはMath.pow()、2の累乗で比較的大きな倍数を計算するために使用します。後で、非常に大きな倍数の平方根を見つける必要があります。問題は、これを10万回以上行う必要があり、非常に時間がかかることです。このプロセスをスピードアップできる代替手段はありますか?ありがとう

編集:大きな数字とは、1000から10000の間を意味します(したがって、計算用語ではおそらくそれほど大きくはありません)。そして、時間がかかるという点では、500回の機能を実行するのに約30秒かかります

4

5 に答える 5

9

Java Mathよりも優れた(より高速な)実装を見つけることはまずありません。アルゴリズムで計算を行う方法を変更しようとすると、運が良くなる可能性があります。たとえば、膨大な数の平方根を見つけないようにする方法はありますか?

これが機能しない場合は、高速の数学的計算を目的としたより適切な言語(Matlabなど)で実装してみてください。

それ以外の場合は、他の領域でこれを最適化してみてください。後で役立つ場合は、過去の結果をキャッシュしてみることができます。

于 2013-02-27T00:17:55.127 に答える
9

「2の力」は二乗です。あなたはそれ自体で数を掛けることによってそれをするほうがよいでしょう。

のライブラリバージョンは、sqrt他の場所で掘り下げることができるものよりもおそらく高速です。Cルーチンを呼び出す場合は、言語間の呼び出しからオーバーヘッドを追加するだけです。しかし、正確な平方根が必要ですか、それとも近似のテーブルルックアップが必要ですか?値は何度も繰り返されますか?つまり、同じ数の根を計算する必要があることがよくありますか?その場合、平方根をHashMap計算するよりもキャッシュする方が速い場合があります。

于 2013-02-27T00:19:20.193 に答える
1

2の累乗に関する問題は、数値にそれ自体を掛けることで簡単に実行できます。たとえば、変数aが2に上げたい数値であるとします。これは次と同じです。 int a=5; int b=a*a;

于 2013-02-27T00:23:04.283 に答える
1

私が考えることができる唯一のことは、速度のために結果を保存することです。平方根は変化せず、保存される数はそれほど多くありません。適切な結果を最適に検索できるように、データをフレーム化することをお勧めします。

于 2013-02-27T00:39:49.780 に答える
0

pow(x、2)の代わりにx*xを使用できます。

平方根の場合、最初にsqrtの実装(近似法)を確認する必要があります。

ニュートン法(方程式sqrt(N)-x = 0)など、より良い方法を見つけることができるかもしれません。

また、必要な精度にもよりますが、精度と時間のトレードオフが可能です。

結果を保存して、同じエントリでの複数の計算を回避することもできます。

于 2013-02-27T00:27:28.890 に答える