消除二进制矩阵中的重复项。能否及时完成O(n ^ 2)

时间:2011-06-13 18:21:53

标签: algorithm

输入     [0 1 0 0 1,     1 0 1 1 0,     0 1 0 0 1,     1 1 1 0 0]

预期产出     [0 1 0 0 1,     1 0 1 1 0,     1 1 1 0 0]

我能想到的解决方案是:

  1. 对于每一行,将它们转换为十进制(或使用一些校验和方法),取O(n)
  2. 这实质上将矩阵转换为一维数组。
  3. 现在使用哈希表,扫描所有元素
  4. 跟踪重复项并仅报告此数组中的唯一元素。
  5. 其他解决方案可包括使用TRIE(或类似结构)。但那仍然需要O(n ^ 2)

    有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

你可以通过计算每一行的散列,BucketSorting散列(有史以来设置的最快整数排序),然后从排序行中删除重复项(在每行中,将当前行与上一行进行比较),在线性时间内完成,如果匹配,则删除当前的。)

编辑:因为每个人都被贬低了,显然是由一个不明白迭代N项的人是线性的而不管他们如何安排,我会详细说明。

Big-O计算没有考虑集合在内存中的排列方式,除非存储机制不允许有效的常量检索时间。无论有多少维度,数组都被认为是有效的不变量。因此,我们应该考虑将整个5x5矩阵作为线性运算,因为它基本上与给定25个对象的一维数组一样。

解决这个问题:

  • 散列所有元素,一次取五个,是线性的,因为我们需要读取每个元素一次才能将它们添加到该行的散列(这可以简单到将每个元素乘以10 ^ x或2 ^ x并添加到正在运行的总数中。

  • BucketSort算法在X * M时间内执行X元素的一维数组,具有最大数量级M.在这种情况下,X是整个操作的总N的平方根,并且最坏情况下的最大数量级M也是N的平方根,我们的BucketSort将在O(X * M)〜= O(N)最坏情况下执行。

  • 迭代排序的哈希是线性的,按照我们总N的平方根的顺序。

因此,在N个矩阵上执行的该算法的总复杂度大致为O(2N + sqrt(N)),其被认为是O(N)。

答案 1 :(得分:0)

为什么不将二进制值存储在整数内(就像你的位域一样),然后使用快速或合并排序对整数进行排序。然后遍历排序列表检查重复项。重复值将始终彼此相邻,因为它已排序。这将采用O(n log n + n),其中n是矩阵中的行数。但是每个操作都会非常快,因为它将由一个整数的比较,交换和相等检查组成,这在现代硬件上非常快。