大O运行时效率的疑点

时间:2011-10-28 17:44:14

标签: algorithm big-o

与O(n log n)相比,O(n)被认为更快吗?如果我有一个执行循环的函数,即O(n)然后在循环O(n log n)之外的合并排序,那么运行时间将是O(n log n)我假设?

5 个答案:

答案 0 :(得分:5)

  

与O(n log n)相比,O(n)被认为更快吗?

不,不是直接的。 Big-O表示法是关于算法的限制因素,它与算法可扩展性而不是速度有关。对于特定数据集,您可以使用O(1)的例程,该例程花费的时间比O(n ^ 2)的例程长 - 但前者的扩展性要好得多。

话虽如此,一般来说,O(n)当然会比O(n log n)更好地扩展,并且可能被认为是“更快”或“更好”。

  

如果我有一个执行循环的函数,即O(n)a O(n log n)那么运行时间是O(n log n)我假设?

目前还不清楚你在这里说的是什么 -

如果你的意思是你有一个包含2个函数的循环,即:

Loop over N elements
    - Call O(n) function
    - Call O(n log n) function

然后整体限制因素将是O(n ^ 2 log n)。

  

(来自评论)

     

我的意思是合并排序(n log n)在循环之外,所以它仍然是O(n log n)

相反,如果你说你要做的事情如下:

- Call O(n log n) function
- Loop over N elements
     - Process each element using O(1) algorithm

然后整体复杂性仍为O(n log n),因为这是限制因素。这是因为“O(n + n)”仍然是O(n)。

答案 1 :(得分:0)

O(n)渐渐地比O(n log n)“更好”或“更快”,是的。如果你有一个执行循环的函数,并且循环体调用O(n log n)函数n次,则整体复杂度为O(n ^ 2 log n)...除非我误解了你的问题。换句话说,做一次O(n log n)事情会导致O(n * n log n)= O(n ^ 2 log n)复杂度。

答案 2 :(得分:0)

O(n * log n)当然大于O(n)。

O(n * n * log n)> O(n * n)> O(n * log n)> O(n)> O(1)

等等。

O(n + 1)= O(n)

O(2 * n)= O(n)

O(n + log n)= O(n)

O(n + n * log n)= O(n * log n),这是你的情况。

答案 3 :(得分:0)

当N接近无穷大时,O(N)渐近“更快” - 但是对于N的任何有限值,可能更慢,更快或相等。

我不太确定你在第二句中提到的是什么。如果你的意思是算法的一部分与N log N成比例,而另一部分与N成比例,那么是的,big-O表示你忽略其他部分,只要它们被添加到主部分,而不是乘以它。 / p>

答案 4 :(得分:0)

随着n变大,log n无限制地增加。这意味着:

  • O(log n)> O(1),所以O(log n + 1)= O(log n)
  • O(n log n + n)= O(n(log n + 1))= O(n log n)

O()表示法的全部思想是通过忽略除最大组件之外的所有内容来简化运行时公式。

另一方面,它还允许您忽略较大组件中的常量因子。因此,仅仅因为算法对于大问题而言渐近更快,并不意味着它对任何特定问题实际上更快......