一般来说,当你有一些 O(N 4 ) 时,你还必须引入 O(N 3 )、O(N 2 )、O(N) 和 O(1) 的术语。换句话说,尝试将 x 3、 x 1和 x 0添加到曲线拟合模型中。
对于这种特殊情况,你有一个 O(N!),好吧,我会遵循 amit 的建议,只考虑阶乘部分,因为它似乎收敛得很快。
但无论如何,如果你真的有一个 O(N!) 你不需要估计,只需使用迭代加深方法。让您的计算机迭代地运行 n=1,2,3,4,5,6,7... 的案例并让它尽可能地运行。
看起来你在浪费你的计算机时间,但如果你分析它,你会发现浪费的时间是微不足道的。例如,您已经在 n=12,因此对于 n=13,所需的 CPU C 13将是 13*C 12、 C 12 = 12*C 11等等。介绍您的测量值 sum(C 13 ..C 0 )/C 13 = 1.082,因此对从 0 到 13 的所有值运行函数仅比运行 13 贵 8%。 N 值越大,该百分比将进一步降低。
更新:
为什么您需要为复杂性级别以下的所有幂添加项:
考虑一个复杂度为 O(N 3 )的简单三级循环:
void foo(int n) {
int i, j, k;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
for (k = 0; k < n; k++)
do_something(i, j, k);
}
foo(3);
很明显,do_something(i, j, k)
调用了 n 3次。
但是我们从头开始考虑执行的每条指令,我们可以看到比进入和离开函数、设置堆栈和其他低级任务都完成一次;该i=0
指令也执行一次。这些是对应于 n 0成本的指令。
指令i < n
和被调用 n 次i++
,j=0
它们对应于 n 1项。
指令j < n
和被调用 n 2j++
次,它们对应于 n 2项。k=0
嗯,等等。
更复杂的情况是一样的,你总是有指令运行的次数与低于复杂性级别的所有幂成正比。
关于你的测量C(0) = 0
,这只是你的时间不够准确的问题。它可能非常小,但绝不是绝对的 0。
最后,如果你的曲线拟合不起作用,那是因为 N! 在这种情况下,您还将运行指令(n-1)!次,和(n-2!)次等等。