[英]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.