【问题标题】:Understanding time complexity of two nested while loop理解两个嵌套while循环的时间复杂度
【发布时间】:2017-07-14 16:01:06
【问题描述】:

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

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”是什么?总和大小()? TypesOfCoins?
  • 我将“TypesOfCoins”视为“n”。
  • 因为TypesOfCoins(内循环范围)是一个常数(不依赖于正在处理的任何输入),所以复杂度不是n^2。代码的复杂性不是它迭代了多少次。
  • @KyleKhalaf 不会是 O(1) 复杂度吗?我仍在学习它,但这对我来说很有意义。
  • @Annabelle 或 OP,如果一个循环迭代 相同的次数 无论输入数据是什么(意味着循环范围不依赖于输入),那么这个复杂度循环是 O(1) (这 ~= 不会被考虑在内)。我将为您提供一个直接的示例作为答案,因为我想我知道您想要理解的内容。

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


【解决方案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) 复杂度。

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

请注意,两个函数的“完成时间”是不同的(因为n 更大,硬件速度……等等)。但是“计算复杂度”是一样的:无论哪个循环是内循环,也不管常数有多大(在这种情况下是n)。

编辑:

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

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

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多