输入 [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]
我能想到的解决方案是:
其他解决方案可包括使用TRIE(或类似结构)。但那仍然需要O(n ^ 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是矩阵中的行数。但是每个操作都会非常快,因为它将由一个整数的比较,交换和相等检查组成,这在现代硬件上非常快。