【问题标题】:Time complexity of one dimensional and two dimensional arrays一维和二维数组的时间复杂度
【发布时间】:2016-07-18 20:39:36
【问题描述】:

以从用户那里获取大小为 n 的一维数组为例,我们知道它的时间复杂度是 O(n)。

for(i=0;i<n;i=i+1)
     {
         scanf("%d",&a[i]);
     }

现在如果数组是二维的,时间复杂度是O(n^2)

for(i=0;i<n;i=i+1)
{
   for(j=0;j<n;j=j+1)
   {
       scanf("%d",&a[i][j]);
   }
}

但是即使是二维数组也以与一维数组相同的方式保存。本质上只是尺寸的增加,为什么会有区别?

【问题讨论】:

  • 内循环运行n次,内循环的内容会执行n次,因此内循环的内容会执行n*n = n to the power of 2次.
  • 您正在为另一个数组(n 元素)的每个元素处理一个数组(n 元素)的所有元素。 n * n = n ^ 2.
  • 内存中的内存不一定总是相同的,并且根据具体情况,它们可能具有非常不同的访问成本
  • @owacoder 我理解,但是由于一维和二维数组以相同的方式存储元素,所以二维数组可以被认为是一个大尺寸的一维数组。无论如何,我理解哈里斯的观点。谢谢

标签: c arrays multidimensional-array time time-complexity


【解决方案1】:

时间复杂度的差异是因为您存储的元素数量。

对于线性一维数组,您以线性方式存储 n 元素,并且它也以线性方式存储。所以时间复杂度是O(n)

对于二维数组,假设您要存储m 元素,这些元素实际上仅以线性方式存储在内存中。但是,您使用的是分为行(和列)的元素。现在例如,每行和每列的大小是n,那么您正在阅读n*n 元素,这只不过是m 元素(m == n*n)。所以复杂度是O(m)O(n^2)

【讨论】:

    【解决方案2】:

    某种感知问题,因为如果你有 n 个元素,无论哪种方式都是 O(n),但如果你基于数组维度之一进行测量,除非它是,否则你不会是 n^2一个方阵(我看到你的是)......所以最好把它想象成 O(h*w) 或者只是 0(n) 反正......

    【讨论】:

      猜你喜欢
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多