簡體   English   中英

它是更大的線性時間復雜度嗎?

[英]Is it linear Time Complexity of Bigger?

誰能告訴我以下代碼的最差時間復雜度是多少? 它是線性的還是更大的?

void fun(int[] nums){
{
  int min = min(nums);
  int max = max(nums);
  for(int i= min; i<=max;i++){
    print(i); //constant complexity for print
  }
}
int min(int[] nums);//return min in nums in linear time
int max(int[] nums);//return max in nums in linear time

其中 0 <= nums.length <= 10^4 和 -10^9 <= nums[i] <= 10^9

我可以說這段代碼的時間復雜度是O(Max(nums[i]) - Min(nums[i]))我可以說這是線性時間復雜度嗎?

由於復雜性相對於數據的R = max - min范圍是線性的,因此我將其稱為偽線性復雜性。 O(N + R)。

這在此 Wikipedia 條目中有詳細說明:偽多項式時間

正如這篇文章的介紹所提到的:

在計算復雜性理論中,如果數值算法的運行時間是輸入數值的多項式(輸入中存在的最大 integer),則數值算法在偽多項式時間內運行,但不一定在輸入的長度(數字表示它所需的位數),這是多項式時間算法的情況。

通常,在分析給定算法的復雜性時,我們不會對特定目標語言的固有范圍限制做出任何具體假設,當然,除非問題中特別提到了這一點。

如果數字范圍是恆定的(即-10^9 <= nums[i] <= 10^9 ),那么

for(int i= min; i<=max;i++){
  print(i); //constant complexity for print
}

O(1)中,即常量,因為您知道,它最多迭代2 * 10^9數字,無論nums[]數組中有多少個數字。 因此它不依賴於輸入數組的大小。

考慮以下輸入 arrays

nums = [-10^9, 10^9];  //size 2
nums = [-10^9, -10^9 + 1, -10^9 + 2, ..., 10^9 - 2, 10^9 - 1, 10^9]  //size 2 * 10^9 + 1 

minmax將分別具有相同的值-10^910^9 因此,您的循環將迭代從-10^910^9的所有數字。 即使原始數組中有 10^100000 個數字, for循環也最多會從-10^9迭代到10^9

你說min()max()O(n)中,因此你的整體算法也將在O(n)中。 但是,如果您考慮到數組的給定最大長度(10 ^ 4)比您的數字限制小很多,您甚至可以忽略調用minmax

至於你的評論

例如。 數組 =[1,200,2,6,4,100]。 在這種情況下,我們可以在線性時間內找到最小值和最大值(O(n),其中 n 是數組的長度)。 現在,我的 for 循環復雜度是 O(200) 或 O(n^3),這遠遠超過數組的長度。 我還能說它的線性復雜度嗎

數組的大小和數組中的值完全相互獨立。 因此,您不能用n來表達for循環的復雜性(如上所述)。 如果你真的想考慮數字的范圍,你必須以某種方式表達它O(n + r)其中n是數組的大小, r是數字的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM