繁体   English   中英

了解两个嵌套while循环的时间复杂度

[英]Understanding time complexity of two nested while loop

以下代码块来自一个函数,该函数查找达到用户给定数量所需的最小硬币数量。 这里使用两个队列“和”和“成本”。

while(Sums.front()<=TargetSum){
    int tempSum = Sums.front(); 
    Sums.pop();
    int tempCost = Costs.front(); 
    Costs.pop();

    for(int i=0;i<TypesOfCoins;i++)
    {
        Sums.push(coins[i]+tempSum);
        Costs.push(tempCost+1);
        if(Sums.back()==TargetSum)
        {
            cout<<"Sums:"; DisplayQueue(Sums);
            cout<<"Cost:"; DisplayQueue(Costs);
            return Costs.back();
        }
    }
}

据我所知,对于嵌套循环,复杂度是最内层循环迭代的次数,因此该循环的时间复杂度应为O(n ^ 2),不是吗?

即使n不同,以下两个示例也具有相同的复杂度 它们的复杂度或Big-O为O(InputData * 1),即O(InputData):

int n = 10;
FuncA(int InputData)
{
    for(int i = 0; i < n; i++) // n is outer loop. 
    {
        for(int j = 0; j < InputData; j++) 
        {
            // .. do stuff
        }
    }
}

要么

int n = 100000000;
FuncB(int InputData)
{
    for(int i = 0; i < InputData; i++)
    {
        for(int j = 0; j < n; j++) // n is inner loop
        {
            // .. do stuff
        }
    }
}

n是一个常数,这意味着任何依赖n循环都具有O(1)复杂度。

InputData不是常数,这意味着任何依赖InputData循环都具有O(InputData)复杂度。

总复杂度=所有循环的复杂度=> O(InputData * 1)

请注意,两个功能的“ 完成时间 ”是不同的(因为n较大,所以硬件速度等等。) 但是“ 计算复杂性 ”是相同的:无论哪个循环是内部循环,还是常数有多大(在这种情况下, n都一样)。

编辑:

一个好主意:如果您有问题并且知道如何解决,但这只需要10年的时间。 那会复杂吗?

答案是否定的,并不复杂。 这很简单,但是只需要时间。 (在我的示例中, n是处理某件事的时间,但是该过程没有复杂性,只是重复执行了固定的时间)。

暂无
暂无

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

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