[英]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
min
和max
將分別具有相同的值-10^9
和10^9
。 因此,您的循環將迭代從-10^9
到10^9
的所有數字。 即使原始數組中有 10^100000 個數字, for
循環也最多會從-10^9
迭代到10^9
。
你說min()
和max()
在O(n)中,因此你的整體算法也將在O(n)中。 但是,如果您考慮到數組的給定最大長度(10 ^ 4)比您的數字限制小很多,您甚至可以忽略調用min
和max
至於你的評論
例如。 數組 =[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.