将复杂性指定为O(斐波那契(n))是否有意义?

时间:2013-03-31 13:06:48

标签: algorithm complexity-theory

假设您有一个算法,它首先处理N个元素,然后处理N的一半,然后处理N的四分之一,依此类推。将O(fibonacci(n))这样的算法的运行时间表征出来是否有意义,而不是说O(n log n)?我想使用Fibonacci函数,因为它看起来更具体,另一方面 - 它听起来有争议。

编辑:

抱歉,看起来这可能是一个有趣的问题,但答案让我意识到我需要一些完全不同的东西:)

4 个答案:

答案 0 :(得分:2)

虽然使用O(nlogn)O(fibonacci(n))在数学上都是正确的 - 因为大O符号只提供渐近上限 - 这个界限不会很紧。

假设您处理的每个元素都是O(1),那么函数复杂度的复杂性实际上是Theta(n) ,因为您确实拥有:

n + n/2 + n/4 + ... + 1 <= 2n

上述说法是正确的,因为实际上geometric seriesq=1/2n->infinity,而2n的{​​{1}}总和为O(n)


请注意,由于大O表示集合,因此O(nlogn)子集,如果O(fibonacci(n)),并且两者都是O(n) - 的子集,因此{ {1}}是在这种情况下使用最具信息性和特定性的符号。

答案 1 :(得分:2)

N + 1/2 N + 1/4 N + 1/8 N + ....约2 N :) 因此,如果处理一个项目是O(1),复杂性仍然是O(N)。

答案 2 :(得分:1)

只要其他人知道你的意思,你就可以写任何你想要的东西。

也就是说,写O(n logn)而不是O(fibonacci(n))更加困惑,因为没有那么多人会知道你对第二种符号的意思。

此外,斐波纳契(n)可以很容易地被认为是指斐波纳契次序的第n个元素。

答案 3 :(得分:0)

不,它不会。计算机科学中Big O notation的全部意义在于提供算法成本的渐近极限,并带有一些邋。。因此,例如,我们忽略几乎每次使用O(x)时隐含的隐藏常量。类似地,我们假设在分析中建模的每个操作都是相同的成本,除了罕见的,特定的情况(例如,在某些加密计算中使用的任意精度算术)。 目标不是精确,而是一个易于理解的共识。