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

C 时间复杂度或代码的大O,c,data-structures,time-complexity,heap,binary-heap,C,Data Structures,Time Complexity,Heap,Binary Heap,我有一个数组,它有一个max heap属性。deleteMax的时间复杂度为O(logn)。如果下面的代码只迭代7次,那么下面的代码的时间复杂度是多少(大O) int heap\u size=15; int i,值,堆_数组[];//数组的形式为最大堆 .... 对于(i=0;i

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

int heap\u size=15;
int i,值,堆_数组[];//数组的形式为最大堆
....
对于(i=0;i<7;i++){//迭代七次
值=deleteMax(堆数组);
printf(“%d”,值);
}
我有两个解决办法。第一:时间复杂度为O(7*logn)或简单地为O(logn)

第二个是O(1/2*n*logn)或O(nlogn),因为1/2只是一个常数,我假设迭代次数是7,几乎等于堆大小的一半,我可以忽略1/2。因此O(nlogn)


哪一个是正确的?

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

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

我认为您在学习堆排序算法,我确信复杂度为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(logn)。这仅仅是因为没有改变循环数的输入。

如果堆大小始终为15,那么这里的时间复杂度是恒定的。O(1)。它不是输入的函数,因为没有输入。@ LukeLee,我认为您需要考虑for循环-O(Logn)内的DeleTeMax函数,以及for循环中的迭代次数。我感到困惑的是for循环最多只能迭代7个元素,而不是整个heap_大小。如果for循环运行
n/2次,这更有趣。这可能是您实际要求的。因此,如果我使I<7到I<20(假设这是无错误的),时间复杂度仍然是O(logn),因为它不依赖于数据的大小?我说的对吗?@Archmede:如果循环运行了固定的次数,那么复杂度将与deleteMax相同,后者被称为O(logn)。因此,如果我将I<7到I<20(假设这是无错误的),时间复杂度仍然是O(logn),因为它不依赖于数据的大小?我说的对吗?顺便说一句,答案是可以接受的。Thanks@labyrinthdeux对的从7更改为20不会影响复杂性。符号不是用来表示执行一段代码需要多长时间。符号告诉您当您更改某些内容时,执行时间是如何变化的,例如,您指定为input@labyrinthdeux-但如果您使循环限制取决于某些内容,例如
i
,那么复杂性就会改变。@4386427:我想补充一点,复杂性告诉您当某些输入发生变化时,对于大的输入,执行时间是如何变化的。这是因为我们只保留主导项。如果执行时间由T(n)=n^2+1000*n给出,则复杂度为O(n^2),但对于较小的ns,增加量将接近线性。只有对于较大的ns,它才变成(接近)二次型。
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