【问题标题】:What is the time complexity of traversing a 2d array遍历二维数组的时间复杂度是多少
【发布时间】:2015-05-07 12:15:57
【问题描述】:

遍历(行、列)一个二维数组的时间复杂度是多少?

bool check(int array [9][9])
{ 
    int num=0;
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) { 
            if (array [i][j] == 0) {        
                num++;
            }
        }
    }
    return num;
}

我认为loop 的每个都将取n 的平方根,因此嵌套循环完全将O(n) 用作遍历所有元素,其中我将n 定义为输入的总大小(在这种情况下array 中的 81 个元素)。对吗?

【问题讨论】:

  • 你的情况是什么n?代码显示大小数组9。实际上,如果您使用 NxN 数组,则复杂度为 O(N**2)。并且,请格式化您的代码
  • 好吧,如果n == N*N 其中N 是每个数组 的大小以及数组的数量,那么O(N**2) == O(n);但是,恕我直言,它定义的参数n (n == N*N) 很奇怪。
  • “复杂性”仅向您显示与输入大小增长速度相比,您的工作增长速度有多快。这意味着它看起来会有所不同,具体取决于您将其作为输入大小 - 例如,数组中的元素数或行/列数。就像以米或英尺为单位测量一件事会给出“不同”的结果。
  • @Ahmed 不要将您的问题更改为不同的问题。如果您有新问题,请提出新问题。
  • @AhmedIsmail 首先缩进所有行并计算大括号。据我所知,您的代码是错误的。

标签: c++ arrays algorithm for-loop time-complexity


【解决方案1】:

当您将n 定义为输入的总大小时,是的,您提出的算法的运行时间将是O(n):您正在对输入的每个元素执行一个操作,对于n总操作数。

这个问题引起的混乱是,按照惯例,多维数组不是按它们的总大小而是按它们的每个维度分别引用的。因此,与其将array 视为大小为n (81),不如将其视为大小为p x q (9 x 9) 的数组。这将为您提供O(pq) 的运行时间。或者,如果我们将其限制为具有r、O(r^2) 两个维度的方形数组。

所有内容都是正确的,这就是为什么在谈论时间复杂度时预先明确定义变量很重要的原因。否则,当您使用 n 表示 total 大小时,大多数人会认为 n 将是一个单一维度,您会引起很多混乱。

【讨论】:

  • 您的回答内容丰富,但我想再次检查您的逻辑。我的用例是一个对象,其中每个键都有一个不同长度的数组。例如:{ a: [1,2,3], b: [1], c: [1,2,3,4,5] }。我想对数组中的所有值求和(在此示例中为 22),因此我需要遍历每个键并遍历该键数组中的每个元素。你会考虑这个 O(n * m) 其中n 是键的数量,m 代表所有数组的长度吗?我被困在这种情况下,因为数组的长度不同。
【解决方案2】:

对于任何形式的算法

for (1..n) {
    for (1..m) { 
        doSomething();
    }
}

平均、最佳和最坏情况的时间复杂度为O(n x m)。在您的情况下,如果 n=m,它将变为 O(n^2)

【讨论】:

  • 但在我的情况下:两个嵌套循环用于遍历所有元素和 n:输入大小的数量将是 81 个数组 [9] [9] 元素,所以为什么不应该 O (n) ?
  • 这个答案是错误的。 n 和 m 都不是实际输入的大小(比如说N)。在这种情况下给定n,逻辑上遵循m = N/n,实际复杂度为O(n * (N/n)) = O(N)。
  • @Nit 逻辑上遵循 m = N/n。正确,这意味着N=m*n 所以你的答案O(N) 变成了O(m*n)。你的答案和我的一样。
  • @RaGe n * (N/n) = n * m = N。所有这些的复杂度仍然是O(N),即与原始输入大小成线性关系。
  • @RaGe Big-O 表示法总是对应于输入数据的大小,不管你如何注释它。复杂度为O(n)或O(N),不管你选择变量名是n还是N。
【解决方案3】:

时间复杂度为O (n*m),其中n是第一维数组的数量,m是每个内部数组的最大大小,即第二维。

【讨论】:

  • n : 输入大小为 81 个数组[9][9] 个元素
  • @AhmedIsmail:- 你的情况下的两个数组都被迭代了 9 次,即 n 和 m 都相等,所以它将是 O(n*n) = O(n^2 )
  • Rahul Tripathi 你能测量整个函数编辑后的复杂度吗?
  • 因此,如果输入大小是固定的,则时间复杂度将为 O(1),即。操作将执行多少次?
  • @AhmedIsmail 我觉得你不太理解大哦的想法。
【解决方案4】:

时间复杂度是O(N),也就是说它的时间复杂度是线性的。 让我们看一下时间复杂度的概念。当我们用 Big O 表示法定义任何时间复杂度时,我们的意思是N 与运行时间的关系图在最坏的执行情况下必须看起来如何。

对于给定的数据嵌套循环大小为 9*9 = 81。无论您在内部 for 循环中执行什么操作。循环不会执行超过 9*9 = 81 次。如果数组的大小为 [10][10],则循环将执行不超过 100 次。

如果你用输入或数据的数量绘制代码的执行时间图表,它将是线性的。

【讨论】:

    【解决方案5】:

    时间复杂度是由您的代码将在数据结构中查找元素以推断结果的次数得出的。它是一维、二维还是 n 维数组都没有关系。如果对一个 n 维数组访问一个元素不超过一次来推导解,则复杂度是线性 O(N),其中 N = N1 * N2 * ... *Nn

    让我们通过现实世界中的两个不同酒店的例子来理解这一点,每个酒店都有 N 个房间。您需要在酒店搜索您的朋友。 在第一种情况下,假设第一家酒店在单层(底层)有 100 间客房,在最坏的情况下您需要访问 100 间客房才能找到您的朋友,所以这里的复杂性是线性的,即 0(N)或 O(100)。 在第二种情况下,酒店有 4 层,每层有 25 间客房。在最坏的情况下,您必须访问 25*4=100 个房间(忽略楼层之间的访问时间/过程),因此复杂性又是线性的。

    【讨论】:

      【解决方案6】:

      一个二维数组arr[i][j] 也可以被一个循环遍历,其中循环将运行 (i × j) 次。

      考虑n = (i×j),那么遍历一个二维数组的时间复杂度是O(n)。

      感谢coder2design.com

      【讨论】:

      • 这是一个令人难以置信的误导性答案。
      • 哪一部分有误导性?
      • @JatinderPal 当你认为 n 是 i 乘以 j 时,复杂度将为 O(n)。你可以简单地说复杂度是 i * j
      • 复杂度为 O(i * j),如果 i = j,则为 O(i^2)。具有误导性,通常当有人说 O(n) 时,它表示线性时间,而当 i = j 时 O(i * j) 是二次的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多