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

时间:2017-07-14 16:01:06

标签: c++ data-structures time-complexity

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

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),不应该这样吗?

1 个答案:

答案 0 :(得分:1)

以下两个示例具有相同的复杂度,即使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)复杂性。

总复杂度=所有循环的复杂性=&gt; O(InputData * 1)

请注意,两个函数的“完成时间”是不同的(因为n更大,硬件速度等等)。但是“ Computation Complexity ”是相同的:无论哪个循环是内循环,还是常数有多大(在这种情况下为n)。

修改:

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

答案是否定的,并不复杂。这很简单但只需要时间。 (n在我的例子中是处理某些事情的时候,但是这个过程没有复杂性,只是重复了一段时间。)