当一个人使用多个功能时,我有一个关于大O符号的问题。 假设我想知道以下伪代码的时间复杂度:
heap sort array of size n
for i = 1 to n{
retrieve array[i]
change value of array[i]
}
我知道使用堆排序是O(n log(n))。由于检索和更改数组中的数据是O(1),因此循环具有复杂度O(n)。 现在我的问题是:整个代码的复杂性是多少?它只是最大的时间复杂度;在这种情况下O(n log(n))? 如果是这样,那么函数的复杂性将是这样的:
for i = 1 to n{
// nothing fancy here
}
for y = 1 to n{
// nothing fancy here either
}
提前致谢。
答案 0 :(得分:2)
for i = 1 to n{
// nothing fancy here
} //O(n)
for y = 1 to n{
// nothing fancy here
} //O(n)
所以它是O(n) + O(n) = O(n)
。
答案 1 :(得分:1)
Big-O表示法是关于当n
(输入大小)接近无穷大时哪个因素占主导地位。因此,如果您按顺序执行了两个代码A
和B
,那么整体时间行为将是O(A
)和O(B
)中的较大者。
在您的情况下,如果heapsort是O(nlogn)
算法,并且循环只是O(n)
算法,那么当n
接近无穷大时,nlogn
最终会方式更大,所以它是唯一重要的术语。 因此,您的整体时间行为为O(nlogn)
。
当然这都是理论。在现实世界中,如果你在循环内部做一些缓慢的事情(比如I / O),那么在mergesort变慢之前你的n
可能必须变得庞大(可能比它合理得到的更大)而不是循环。