我的函数是O(n!),还是O((n-1)!)更准确?

时间:2016-09-05 10:29:21

标签: algorithm time-complexity big-o

我为旅行商问题编写了一个强力搜索算法,并对其进行了测试,以查看各种“城市”所需的时间。从下图中,我们可以看到时间与(n-1)!大致成比例,其中n是“城市”的数量。它与n!(毕竟,(n-1)! = n! / n)不成正比。

我的问题是,说这个算法是在O(n!)中运行还是正确的,还是我说O((n-1)!)更好?我以前从未见过后者,但似乎更准确。我似乎在这里误解了一些东西。

[t =所用时间,n =城市数量]

4 个答案:

答案 0 :(得分:49)

根据定义,O(f(n))是由f(n)渐近支配的所有函数的集合,即具有常数C和n_0的所有函数g(n)的集合,使得< / p>

g(n) < C * f(n)   for all n > n_0

根据这个定义,O(n!)实际上是O((n-1)!)的超集,因为函数f(n)= n!是第一组的成员,但不是第二组的成员。这两套实际上并不相同。

但是,说你的问题是O(n!)是正确的,因为这只是一个上边界。说你的问题是Θ(n!)是不正确的,因为这表示直到常数因子的精确渐近行为。

在实践中没有太大的区别,并且,如另一个答案中所述,您可以将n重新定义为减去一个城市的数量。

答案 1 :(得分:5)

one two已经足够了。对于大型O(n!)nn-1没有任何区别。

参见https://www.wikiwand.com/en/Time_complexity#/Table_of_common_time_complexities 举些例子。

答案 2 :(得分:1)

你可以简单地证明:

O((n-1)!)表示存在常数c,例如:

算法步骤(或者时间复杂度)&lt; c(n-1)! &LT; c n!/ n&lt; c n!对于每个n> 1。

因此,您的for算法复杂度函数包含: 算法步骤(或时间复杂度)

你的算法也是O(n!)。

所以我们证明了如果算法的时间复杂度为O((n-1)!),那么它也是O(n!)。

答案 3 :(得分:1)

Sven Marnach的答案非常好,我只想详细说明这一部分:

  

或者我说O((n-1)!)更好吗?

正如其他人所说,O(n)通常足够好。如果您想了解有关该问题的更多信息,可以尝试查找并证明:

  • 下限(通常用Ω(n)表示)
  • 紧上限

下限基本上表明,在某些情况下,没有算法可以渐进地解决问题。紧上限是与下限匹配的上限,即,您必须证明Ω(f(n))的下限和O(f(n))的上限。如果您可以证明下限和上限,则表示您的算法是该问题的渐近最优算法。

举一个具体的例子:你肯定知道排序算法,如合并排序或快速排序以及O(n log n))的上限。 Donald Knuth(几十年前)表明,基于比较的整数排序算法至少需要进行n log n次比较,即Ω(n log n)次运算。由于我们有一个匹配的上限,因此合并排序和快速排序都被称为渐近最优(尽管它们在实践中的性能差异很大)。