【问题标题】:Complexity in case of 2 while loops nested inside 1 while loop2个while循环嵌套在1个while循环中的复杂性
【发布时间】:2015-09-19 15:55:47
【问题描述】:

这是我的代码。我想知道如何计算这个非常具体的代码部分的时间复杂度。根据规则,我们需要计算第一个内部 2 while 循环,然后将它们相加,然后将它们与外部循环相乘,但我无法弄清楚如何计算它们然后得出答案。

 int start=first,end=last;
int mid= (first+last)/2;
int temp;
while(start<=end)
{
    while(a[start]<a[mid])
    {
        start=start+1;
    }
    while(a[end]>a[mid])
    {
        end=end-1;
    }
    if(start<=end)
    {
        temp=a[start];
        a[start]=a[end];
        a[end]=temp;
        start++;
        end--;
    }
}

【问题讨论】:

  • 那么到目前为止你有什么?
  • @Kenneyi 只知道以 o(n) 表示的外部循环 ..无法理解内部 while 循环。如果您能帮助我,将不胜感激。
  • 归结为计数。一些提示:说n = end - first,第一个内部循环迭代n/2 次,在最坏的情况下。第二个循环基本相同,又是n/2 次。所以外部循环的主体归结为n/2 + n/2 = n
  • @Kenney 所以外循环的主体现在是 n。并且外循环本身是o(n),所以乘法不应该是o(n ^ 2)。如果我错了,请随时纠正我的概念
  • 如果外循环是for ( i = 0; i &lt; n; i ++),那么是的,但复杂性在于内循环修改了startend这一事实。尝试想象正在发生的事情:start 仅递增,向end 移动,end 递减,向start 移动。因此它们之间的差异变小了。您可能想要添加一些调试语句,并使用一个小的输入集运行它,以查看它的运行情况并感受它,如果有帮助的话。

标签: algorithm time-complexity


【解决方案1】:

这是O(end - start)

按照规则,我们需要先计算内部 2 个 while 循环,然后将它们相加,然后将它们与外部循环相乘

没有这样的规则。您需要考虑执行的操作总数。有时你会做你描述的事情,但没有这样的一般规则。

想想每个元素的访问频率:O(1) 次。内部循环将startend 移向彼此。外部循环不会重置内部循环,它们会从上次迭代的地方继续。既然你做了O(1) 操作O(end - start) 次,那就是O(end - start)

【讨论】:

  • 我得到了 o(end-start) 但你能解释一下其余的是 o(1) 操作吗?非常感谢。 while(a[mid]
  • 自从你碰到:o(n) = n * o(1)。请参阅Big O notationComplexity Theory - 这不是没有理由地称为复杂性理论... :-)
  • @icantcode while(a[mid]&lt;a[end])整个执行,在执行您发布的所有内容的过程中,将是O(n)。有时它会停止,但外部的 while 会在下一次迭代中从它停止的地方继续它。另一个循环也是如此。 O(n) + O(n) = O(n).
猜你喜欢
  • 2022-10-12
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多