我有一个算法,可以使用大约2的数量级增加到功率4,500,000的非常大的数字。我使用.NET 4中的BigInteger类来处理这些数字。
该算法非常简单,因为它是一个单循环,可以根据某些预定义的标准减少大的初始数。每次迭代,数量减少大约10个指数,因此4,500,000将在下一次迭代中变为4,499,990。
我目前每秒获得5.16次迭代或每次迭代0.193798秒。基于此,算法的总时间应该大约为22小时,以使指数值降至0。
问题是,随着数量的减少,处理内存中号码所需的时间也会减少。此外,随着指数减少到200,000范围,每秒的迭代变得巨大,每次迭代的减少也呈指数级增长。
不是让算法运行一整天,而是根据初始起始数和每秒迭代数来计算需要花费多少时间的数学方法?
这非常有用,因为我可以快速测量优化尝试的改进。
考虑以下psuedocode:
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));
}
答案 0 :(得分:1)
首先重写
double log = BigInteger.Log(b, 10);
作为
double log = log(2)/log(10) * e; // approx 0.3 * e
然后你注意到算法在O(1)次迭代后终止(每次迭代约70%的终止机会),你可以忽略除第一次迭代之外的所有东西的成本。
对于初始指数Math.Pow(2, e)
,算法的总费用约为e
的1至2倍。对于base = 2,这是一个简单的比特移位,对于其他人,你需要使用square-and-multiply
答案 1 :(得分:-1)
由于您使用Random,无法估计未知的时间!