给定矩阵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.
我能做得比这更好吗?或者,上述方法有任何缺陷吗?
答案 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复杂性,但它几乎肯定具有更小的常量并且占用更少的空间。