簡體   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