Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 嵌套循环分析(每个循环限制内部循环) 在我的数据结构讲座中,我做了关于算法和时间复杂性的家庭作业。我真的找不到我需要做什么_C_For Loop_Complexity Theory - Fatal编程技术网

C 嵌套循环分析(每个循环限制内部循环) 在我的数据结构讲座中,我做了关于算法和时间复杂性的家庭作业。我真的找不到我需要做什么

C 嵌套循环分析(每个循环限制内部循环) 在我的数据结构讲座中,我做了关于算法和时间复杂性的家庭作业。我真的找不到我需要做什么,c,for-loop,complexity-theory,C,For Loop,Complexity Theory,问题:此算法的时间复杂度是多少 我的解决方案是逐循环分析,去掉每个循环本身的常数项和低阶项。由于这个原因,彼此之间有三个循环。复杂性应该是O(n3)。关键点是最里面的循环是动态有界的。 此表上有什么错误(如果有): intc=0; 对于(int i=0;i

问题:此算法的时间复杂度是多少

  • 我的解决方案是逐循环分析,去掉每个循环本身的常数项和低阶项。由于这个原因,彼此之间有三个循环。复杂性应该是O(n3)。关键点是最里面的循环是动态有界的。
此表上有什么错误(如果有)

intc=0;
对于(int i=0;i

欢迎所有答案。

为了计算时间复杂度,您可以尝试评估最内部循环的迭代次数

  • k
    上的循环计算简单表达式
    2*j
  • j
    上的循环运行
    n次。因此,内部循环运行
    2*n*(n+1)/2
    ,从而简化为
    n*(n+1)
  • 外部循环运行
    n*n
    次。因此,内部循环精确地运行
    n*n*n*(n+1)
对主导项进行简化,得到的时间复杂度为n4

然而,一个非常精明的编译器会将这种复杂性降低到常数时间O(1),并生成以下代码:

return n * n * n * (n + 1);

尝试这一点表明,到目前为止,没有一种常见的编译器能够实现这一点,尽管clang花了大量时间试图用深不可测的SIMD代码优化代码。

概述您的想法,我们可以帮助您发现问题。我们告诉你答案对你没有帮助。只有最里面的循环受外部循环的影响。中间的循环不受外部的影响。这是我混淆的一点。边界是动态的,我不知道如何分析。你知道将0…1000中的所有数字相加的快速方法吗?是的,让我们假设我有一个数字序列,比如{1,2,3,4……,n},这个序列中所有数字的总和必须是(n*(n+1))/2,不是吗?你们认为外循环的复杂性是什么?中间循环的复杂性是什么?你知道外两个循环的复杂性是什么吗?这给了你一部分答案。内部循环也有最坏情况的复杂性;那是什么?你能得到的最大的
j
是什么?那么,内部循环的复杂性是什么?你是如何将其与之前的结果结合起来的?你删除了整个算法的常数项和低阶项了吗?在你的例子中,算法非常简单:你可以用一个简单的公式计算出精确的迭代次数,从而得到结果。唯一的低阶项是
(n+1)
中的
1
。当你去掉它时,你得到n的四次方。我们能谈谈这个算法的最佳、最差和平均情况吗?它有意义吗?@nevzatseferoglu:尝试区分这些情况没有多大意义,它们都是相同的,迭代次数只取决于
n
:最佳和最差之间没有区别,最坏和一般情况。在分析处理未知数据的算法时,这种区别是相关的,因为这些算法的行为取决于它们的特征,例如排序方法,其性能可能会随着数据集的实际分布而发生很大变化。@nevzatseferoglu:如果算法对可变数据有条件语句,复杂性更难分析,最佳、平均和最坏情况的结果可能会有很大不同。很好的例子是和。