繁体   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