我有一个在O(n log n)中运行的算法的实现,对于n = 10 ^ 7,算法需要570 ms。有谁知道如何找到我的算法运行时间的常量部分(C)?我想有这个,所以我可以计算算法应该为任意输入大小花多长时间。
答案 0 :(得分:1)
如果您知道算法的渐近复杂度为O(n log n),那么只需一个数据点就无法(确切地)确定未来运算的运行时间。想象一下,例如,你有一个你知道在时间O(n)运行的算法和一个大小为N的输入,运行时是T.你不能准确地预测运行时输入的内容。大小2T,因为不清楚T的多少由线性函数的斜率解释,以及截距解释了多少。
如果假设N“足够大”,大部分运行时T来自斜率,那么您可以在将来的输入上合理估计算法的运行时间。具体来说,由于函数线性增长,你可以假设如果你将输入的大小乘以某个常数k,那么运行时应该是Tk。在您的情况下,函数n log n线性增长 。由于 log 增长非常缓慢,因此对于足够大的n而言,其增长非常平缓。因此,如果您认为N“足够大”,则可以通过将大小为N的运行时缩放k倍来估计大小为kN的输入的运行时。
为了更准确,您还可以尝试收集有关运行时的更多数据点并进行回归。在线性情况下,如果您知道两个准确的数据点,则可以恢复实际的线性函数,然后进行外推以获得非常准确的运行时预测。使用n log n形式的东西,假设运行时的形式为c 0 n log n + c 1 n + c 2 n。如果你收集了足够的数据点,你可以将它插入到Excel中并恢复系数,从中可以非常精确地推断出这些系数。
希望这有帮助!
答案 1 :(得分:1)
我认为你不能完全计算它,但如果你确定复杂性是O(n log n)
那么我会推荐一个简单的比例作为估计你的运行时间:
10^10 log 10^10 unknown run time
--------------- = ----------------
10^7 log 10^7 570 ms
在这种情况下,应该是1428.6 * 570 ms =~ 814 sec
。
这在数学上并不完全正确,但是如果你没有多个数据点来尝试拟合曲线以找出各种常数,那么这不是一个不合理的起点。