假设您有一个算法,它首先处理N个元素,然后处理N的一半,然后处理N的四分之一,依此类推。将O(fibonacci(n))这样的算法的运行时间表征出来是否有意义,而不是说O(n log n)?我想使用Fibonacci函数,因为它看起来更具体,另一方面 - 它听起来有争议。
编辑:
抱歉,看起来这可能是一个有趣的问题,但答案让我意识到我需要一些完全不同的东西:)
答案 0 :(得分:2)
虽然使用O(nlogn)
和O(fibonacci(n))
在数学上都是正确的 - 因为大O符号只提供渐近上限 - 这个界限不会很紧。
假设您处理的每个元素都是O(1)
,那么函数复杂度的复杂性实际上是Theta(n)
,因为您确实拥有:
n + n/2 + n/4 + ... + 1 <= 2n
上述说法是正确的,因为实际上geometric series的q=1/2
为n->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)
时隐含的隐藏常量。类似地,我们假设在分析中建模的每个操作都是相同的成本,除了罕见的,特定的情况(例如,在某些加密计算中使用的任意精度算术)。 目标不是精确,而是一个易于理解的共识。