繁体   English   中英

时间复杂度或代码的大O.

[英]Time complexity or Big O of the code

我有这个具有最大堆属性的数组。 deleteMax的时间复杂度为O(logn)。 如果下面的代码只迭代7次,那么下面的代码(大O)的时间复杂度是多少?

int heap_size = 15;
int i, value, heap_array[]; // array is in the form of max heap
....
for(i = 0; i < 7; i++){ // iterates seven times
    value = deleteMax(heap_array);
    printf("%d ", value);
}

我脑子里有两个解决方案。 第一:时间复杂度为O(7 * logn)或简单为O(logn)。

然后第二个是O(1/2 * n * logn)或O(nlogn),因为1/2只是一个常数,我假设因为迭代次数是7,这几乎与一半相同heap_size,我可以忽略1/2。 因此O(nlogn)

哪一个是正确的?

一般来说,当数字固定(也就是常数)时,谈论复杂性是没有意义的。 表示法的全部目的是评估数字更改时执行时间的变化。 恒定数量的循环永远不会改变执行时间和复杂性。 如果将循环数更改为另一个常量值,则会改变执行时间, 复杂性是相同的。

典型的用途是计算函数的复杂性,以便为函数的用户提供关于当用户改变某些输入值时执行时间如何变化的想法。 例:

void foo()                 // Pointless to talk about complexity as there is no input

void foo(int x)            // Complexity tells you how execution time change 
                           // when you change x

void foo(char* someString) // Complexity tells you how execution time change 
                           // when you change the length of someString

注意:复杂性永远不会告诉您实际的执行时间! 仅更改某些输入时执行时间的变化。

所以在你的情况下,它仍然是确定复杂性的deleteMax ,即它仍然是O(log n)。 仅仅因为没有输入改变循环的数量。

如果循环仅运行7次,则复杂度为O(1)。 这是因为循环不依赖于数据的大小,并且总是在恒定时间内运行。

这里,堆大小和循环运行的次数都是不变的。 因此代码将具有O(1)的时间复杂度,即恒定的时间复杂度。

我认为你倾向于堆排序算法,我确信复杂性是O(nlogn)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM