检查矩阵行是否在O(1)时间内充满1s

时间:2018-01-01 12:57:37

标签: c function matrix time-complexity

我有一个赋值,我需要在C函数中编写一个函数,它检查给定矩阵中是否有一行充满'1'。矩阵值可以只是'1'或'0'(布尔矩阵)。

例如:(大小3)

1 1 0  
1 1 1  
0 0 1  
  

返回1(true)

1 1 0  
1 0 1  
1 0 0  
  

返回0(错误)

现在,它非常简单,没有任何限制,但后来我被要求以O(1)的时间复杂度执行此操作,我不知道,从哪里开始。

如果有帮助:我们被要求在此之前编写2个函数:

  1. init(n, A)使用O(n^2)
  2. 中的'1'填充n尺寸矩阵A.
  3. flip(A, i ,j)将{i,j]的值从'0'变为'1'或'1'变为'{0} {/ 1}

3 个答案:

答案 0 :(得分:2)

要抓住的是先前完成了"会计工作"现在只需要在恒定时间内获取结果。

这里可能会采用不同的策略。在O(n^2)时间内用1s初始化矩阵后,现在每次翻转都可以跟踪:

  • 1s
  • 翻转(或等效0)

如果您选择跟踪1,那么每个矩阵需要额外的O(n)内存来存储它们。当您翻转1时,从 one-on-a-row 数组中减去1。当您翻转0时,您将1添加到您的行上*阵列。

如果您跟踪翻转,则按行执行,您需要再次O(n)个额外内存。同样,您有一个帮助器数组,您可以在其中存储每行的翻转次数。如果你翻转并且新的是0 - 添加一个,如果你翻转&新的是1 - 减去一个。

然后,在您的O(1) - 函数中,您只需检查行的相应数组位置的存储值。

答案 1 :(得分:0)

O(1)(恒定时间)是不可能的,除非矩阵的大小是固定的 然后,您只需对每一行使用一些if操作:

// Matrix has fixed size 2x2
if (matrix[0][0] && matrix[0][1]) return 1;
if (matrix[1][0] && matrix[1][1]) return 1;
return 0;

(您需要flip函数用于什么?)
否则:只需遍历矩阵:

<强>初始化:

void init(unsigned n, unsigned matrix[n][n]) {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      matrix[i][j] = 1;
    }
  }
}

选项1:

unsigned check(unsigned n, unsigned matrix[n][n]) {
  for (int i = 0; i < n; i++) {
    unsigned found = 1;

    for (int j = 0; j < n; j++) {
      if (!matrix[i][j]) {
        found = 0;
        break;
      }
    }

    if (found) {
      return 1;
    }
  }

  return 0;
}

选项2:

unsigned check(unsigned n, unsigned matrix[n][n]) {
  for (int i = 0; i < n; i++) {
    unsigned sum = 0;

    for (int j = 0; j < n; j++) {
      sum += matrix[i][j];
    }

    if (sum == 3) {
      return 1;
    }
  }

  return 0;
}

答案 2 :(得分:-2)

由于“大O”表示法想要给出时间(复杂性)的顺序,它只会查看顺序1,n,正方形,日志等。

通过n x n矩阵需要n 2 步骤(时间),O(n 2 )也是如此。 init会做类似的事情。

O(1)应该一步完成任务。翻转可以做到这一点,因为它转到元素一步翻转(索引数组)。

注意:完成初始化和翻转的算法(函数)非常简单,但我不想为你做功课,只是让你去。