根据定义,O(f(n))是所有被f(n)渐进占优的函数的集合,即所有函数g(n),这些函数存在常数C和n_0,使得
g(n) < C * f(n) for all n > n_0
由此定义可知,O(n!)实际上是O((n-1)!)的超集,因为函数f(n) = n!是第一个集合的成员,但不是第二个集合的成员。这两个集合实际上并不相同。
虽然如此,说你的问题是O(n!)是正确的,因为这只说明了一个上限。说你的问题是ϴ(n!)是不正确的,因为它表示了与常数因子相差无几的精确渐近行为。
实际上并没有太大的差别,正如另一个回答所指出的,你可以重新定义n,使其表示城市数量减一。
f
是一个多项式或指数函数,我们有 O(f(n)) = O(f(n-1))
。然而,正如上面所指出的,对于所有函数来说这并不总是成立的:当 n -> infty
时,我们有 lim n!/(n-1)! = lim n = infty
。 - chin
变得足够大,以至于增加或减少一个数都是微不足道的。 - leftaroundaboutO(n!)
已经足够好了。对于大型的n
来说,n
或者n-1
没有区别。
请看https://www.wikiwand.com/en/Time_complexity#/Table_of_common_time_complexities获取更多示例。
n=100
,那么O(n!)=9.33*10^157
,而O((n-1)!)=9.33*10^155
。你认为这两者没有区别吗? :) - jbsu32O(...)
是函数的一类,不能等于一个数字。而且,确实有O(10n) = O(n)
,所以对于O
符号来说,3990万
和360万
没有任何区别。 - user2512323O(n log n)
。Donald Knuth几十年前就证明,基于比较的整数排序算法至少需要n log n
次比较,也就是说,需要Ω(n log n)
次操作。由于我们有一个匹配的上限,因此归并排序和快速排序被认为是渐近最优的(尽管它们在实践中的性能差异很大)。