检查矩阵中重复行的高效算法

时间:2013-10-17 23:37:47

标签: algorithm matrix time-complexity

给定矩阵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.

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

2 个答案:

答案 0 :(得分:6)

你的方法有效,但你的复杂性是错误的。

首先,测试元素是否在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

答案 1 :(得分:0)

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

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

这没有更好的Big-O复杂性,但它几乎肯定具有更小的常量并且占用更少的空间。