O(n) 相对于 O(n log n) 是被认为更快的吗?如果我有一个包含循环的函数,其时间复杂度为 O(n),然后在循环外使用归并排序(O(n log n)),那么总运行时间是否应该是 O(n log n)?
“O(n)和O(n log n)哪个更快?”
直接来说不是,大O符号是关于算法的极限因素的,这与算法的可扩展性更有关系,而非速度。对于一个特定的数据集,您可以有一个时间复杂度为O(1)的例程,它比O(n ^ 2)的例程需要更长的时间,但前者的扩展性会更好。
话虽如此,一般而言,O(n)当然将比O(n log n)具有更好的可扩展性,并可能被认为是“更快”或“更好”的。
“如果我有一个O(n)和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)。
(来自评论)
我的意思是归并排序(nlogn)在循环外面,所以仍然是O(nlogn)。
如果你想做这样的事情:
- 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)。
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),这就是您的情况。
当N趋近于无穷大时,O(N)渐进地比N更快--但对于任何有限的N值,它可能会更慢、更快或相等。
我不太确定你在第二句话中想要问什么。如果你的意思是算法的一部分与N log N成正比,而另一部分与N成正比,那么是的,大O表示你可以忽略其他部分,只要它们被加到主要部分上,而不是乘以它。