小编典典

算法:如何在矩阵中找到一个全为1,时间复杂度为O(n)的列?

algorithm

我有一个看起来像这样的矩阵:

| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 1 | 1 |

我应该找到这个矩阵是否有一个用所有1填充的列。在这个矩阵上是第4列。据说时间复杂度是O(n),内存是O(1)。

该矩阵表示一组(人)上的二进制关系。n是集合的大小,因此矩阵的大小为n * n

我可以看到2种可能的解决方案:

  • 以第一列为例,如果它为零,则跳到下一列,依此类推。但是这种算法的最坏情况是O(n 2);
  • 下一个,如果我将所有列的总和超过我可以在O(n)中给出的答案。但这并不是说在任务条件下我们已经计算了总和。如果我要计算它们,复杂度也将是O(n 2);

还有其他解决方案吗?


阅读 368

收藏
2020-07-28

共1个答案

小编典典

让我对您要做什么进行一个非常疯狂的猜测。提及的提示:

  1. 数组代表与人的关系
  2. 您正在寻找全1的资料栏
  3. 您正在尝试找到一种O(n)算法

好吧,您不能那样做,O(n)我可以证明那仅仅是O(n^2)

但我的 野生 猜测是,你做一个经典的
名人身份的问题
,那你 误解 的问题。

名人是其他所有人都认识但不认识的人。

我是名人鉴定问题,您正在尝试寻找类似的东西:

Find the number i where
a[i][x] = 1 for all x            -> every one knows the celebrity
a[x][i] = 0 for all x != i       -> the celebrity doesn't know anyone else

实际上,有了对您要查找的内容的额外限制,就可以找到O(n)解决方案。

2020-07-28