私は、2 の 4,500,000 乗程度の非常に大きな数で動作するアルゴリズムを持っています。これらの数値を処理するには、.NET 4 の BigInteger クラスを使用します。
このアルゴリズムは非常に単純で、あらかじめ定義された基準に基づいて大きな初期数を減らす単一のループです。反復ごとに、数値は約 10 の指数で減少するため、4,500,000 は次の反復で 4,499,990 になります。
現在、1 秒あたり 5.16 回の反復、または 1 回の反復あたり 0.193798 秒を取得しています。それに基づいて、アルゴリズムの合計時間は、指数値を 0 にするのに約 22 時間かかるはずです。
問題は、数値が減少するにつれて、メモリ内の数値を処理するのに必要な時間も減少することです。さらに、指数が 200,000 の範囲に減少すると、1 秒あたりの反復回数が膨大になり、反復ごとの減少も指数関数的に増加します。
アルゴを 1 日実行する代わりに、最初の開始数と 1 秒あたりの反復回数に基づいてどれくらいの時間を計算するかを計算する数学的な方法はありますか?
最適化の試みの改善をすばやく測定できるため、これは非常に役立ちます。
次の疑似コードを検討してください。
double e = 4500000; // 4,500,000.
Random r = new Random();
while (e > 0)
{
BigInteger b = BigInteger.Power(2, e);
double log = BigInteger.Log(b, 10);
e -= Math.Abs(log * r.Next(1, 10));
}