计算算法时间

本文关键字:时间 算法 计算 | 更新日期: 2023-09-27 17:59:13

我有一个算法,它适用于2阶左右的非常大的数字,其幂为4500000。我在中使用BigInteger类。NET 4来处理这些数字。

该算法非常简单,因为它是一个基于一些预定义标准减少大量初始数的单个循环。每次迭代,这个数字都会减少大约10个指数,因此在下一次迭代中,4500000将变成4499990。

我目前每秒得到5.16次迭代,即每次迭代0.193798秒。基于此,算法的总时间应该大约为22小时,以将指数值降至0。

问题是,随着数字的减少,在内存中处理数字所需的时间也减少了。此外,当指数降低到200000范围时,每秒的迭代次数变得巨大,每次迭代的减少也呈指数级增加。

有没有一种数学方法可以根据初始起始次数和每秒迭代次数来计算它需要多少时间,而不是让算法运行一整天?

这将是非常有帮助的,因为我可以快速测量优化尝试的改进。

考虑以下伪代码:

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));
}

计算算法时间

第一次重写

double log = BigInteger.Log(b, 10);

作为

double log = log(2)/log(10) * e; // approx 0.3 * e

然后你注意到算法在O(1)次迭代后终止(每次迭代约70%的终止机会),你可能会忽略除了第一次迭代之外的所有东西的成本。

对于初始指数e,算法的总成本大约是Math.Pow(2, e)的1到2倍。对于base=2,这是一个微不足道的位移,对于其他位移,您需要平方和乘积

由于您使用的是Random!