【问题标题】:Efficient algorithm to check duplicate rows in a matrix检查矩阵中重复行的有效算法
【发布时间】:2013-10-17 23:37:46
【问题描述】:

给定一个整数矩阵 M。检查矩阵中的两行是否相同。给出最佳方法。

Example:
[{1, 2, 3},
 {3, 4, 5},
 {1, 2, 3}]

在上面的矩阵中,第 1 行和第 3 行是相同的。

可能的解决方案:

Given a matrix, we can convert each row in a string (example using to_string()
method of C++ and concatenating each element in a row to a string). We do this
for every row of the matrix, and insert it in a table that is something like
(map<string, int> in C++). And hence, duplicate row can be checked in O(mn) time
for an mxn matrix.

我能做得比这更好吗?或者,上述方法有什么缺陷?

【问题讨论】:

  • 我不认为你能比 O(mn) 做得更好,因为在最坏的情况下,每个元素都需要被读取。
  • 这将是最佳的,因为@Matt 说过。只是一个警告,你需要在连接元素时放置一些分隔符。否则{1, 23}{12, 3} 将被视为相同。
  • @justhalf:感谢您指出这一点。

标签: algorithm matrix time-complexity


【解决方案1】:

您的方法有效,但您对它的复杂性有误。

首先,测试一个元素是否在std::map 中具有复杂性O(log(n) * f),其中n 是地图中的元素数量,f 是比较任意两个元素所需时间的上限在地图中插入/搜索。

在您的情况下,每个字符串都有一个长度 m,因此比较地图中的任何两个元素都会花费 O(m)

所以你的方法的总复杂度是:

O(n * log(n) * m) 用于在地图中插入 n 字符串。

但是,您可以使用哈希表而不是映射将其加速到预期的O(n * m),这是渐近最优的(因为您必须读取所有数据)。原因是哈希表的插入操作平均复杂度为O(1),并且每个输入字符串的哈希函数只计算一次。

C++ 中,您可以使用unordered_set

【讨论】:

    【解决方案2】:

    根据矩阵的大小,将所有内容转换为字符串似乎非常浪费时间和空间。

    为什么不为每一行计算一个可能的唯一哈希。例如,您可以计算所有条目的按位或,然后将该哈希与行的索引一起保存在多映射中。当您遍历每一行时,您计算它的哈希值,然后检查该哈希值是否已经存在。如果是,请将您的行与具有相同哈希的其他行进行比较,以查看它们是否相等。

    这并没有更好的 Big-O 复杂度,但几乎可以肯定它具有更小的常数并使用更少的空间。

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 2016-04-23
      • 2013-03-15
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      相关资源
      最近更新 更多