我知道您觉得这有点容易,但是最近有些事情让我着迷。这两个方程具有相同的运行时间吗?
1)T(n)= T(n / 2)+ T(n / 2)+ n ^ 2?
2)T(n)= 2T(n / 2)+ n ^ 2?
因为在1中编译器必须为每个T每次都调用,但是在2中只有调用时返回结果将乘以2。1中有一个树,我的意思是每次我们都需要调用两次对于T,
我认为我不确定自己的错误, F(n)= F(n / 2)+ ....与T(n)不同!
如果我们编写代码{return f(n)+ f(n)} 根据运行时间,它必须不同于返回值2 * f(n)。无需优化编译器
答案 0 :(得分:1)
这两种算法都在O(log n)类中,但是在实践中,选项#2总是会更快。
函数调用通常比整数乘法慢,并且通常显着慢;即使在可以利用T的确定性来有效地缓存每个T(x)的结果的情况下,也是如此。
编辑:看来我误解了OP。
我理解OP正在询问特定递归函数T(n)的两种不同但在数学上等效的实现,该函数返回n ^ 2 + 2(n / 2)^ 2 + 4(n / 4)之和)^ 2 + ... + n(n / n)^ 2,假设T(1)= 1且n是2的幂。
每个递归级别的实现#1两次调用T()。我错误地指出,这样的算法将是O(log n),而实际上是O(2n-1),或更简单地说是O(n)。
实施#2在每个递归级别仅调用一次T(),这使其变为O(log n)。因此,这可能是两者中更快的一个。
我现在了解到T()是其他算法的时间函数!我的错。显然,在那种情况下,O()的解决方案将由n ^ 2项主导。