检测给定数字列表的子集中的重复元素

时间:2012-10-14 14:35:00

标签: algorithm

我有一组数字说:1 1 2 8 5 6 6 7 8 8 4 2 ...

我想检测上述数字的子数组(给定大小,例如k)中的重复元素...例如:考虑增加k = 3的子数组。

Sub array 1 :{1,1,2}
Sub array 2 :{1,2,8}
Sub array 3 :{2,8,5}
Sub array 4 :{8,5,6}
Sub array 5 :{5,6,6}
Sub array 6 :{6,6,7}
....

所以我的算法应该检测到子阵列1,5和6包含重复的内容。 我的方法:

1)将第1个k元素复制到临时数组(向量)

2)在C ++ STL中使用#include文件...使用unique()我将确定向量的大小是否有任何变化..

如何处理这个问题的任何其他线索....因为如果给定数字的列表很大,我的方法将消耗大量的时间和空间..

1 个答案:

答案 0 :(得分:0)

O(n)平均时间和O(k)空间解决方案可以构建基于散列的histogram,并迭代数组,同时为每个子列表中的元素维护#occurances。
在每次迭代中,将最外面的元素踢出(通过减少直方图中的相关入口)并添加一个新元素。
还保留一个numDupes变量,该变量计算当前候选人中添加/删除元素时当前拥有的多少,并保持不变。

伪代码(抱歉,如果我有1个错误或其他错误,但这是个主意):

numDupes = 0
histogram = new map<int,int>;
//first set:
for each i form 0 to k:
  if histogram.contains(arr[i]):
     histogram.put(arr[i],histogram.get(arr[i]) + 1)
     numDupes += 1
  else:
     histogram.put(arr[i],1)
//each iteration is for a new set
if (numDupes > 0) print 1 //first sub array has dupes
for each i from k to n:
   if (histogram.get(arr[i-k]) > 1) numDupes -= 1 //we just removed a dupe
   histogram.put(arr[i-k],histogram.get(arr[i-k] - 1)) //take off "eldest" element.
   if (histogram.contains(arr[i]) && histogram.get(arr[i]) > 0):
       histogram.put(arr[i],histogram,get(arr[i]) + 1))
       numDupes += 1 //we just added a dupe
   else:
       histogram.put(arr[i],1)
   if (numDupes > 0) print i-k+1 // the current sub array contains a dupe

最初的答案有一个小错误:当最后一个元素添加没有引起欺骗时,它无法捕获案例,但仍有一个(如示例中的子数组6)。
它可以通过维持一个额外的整数来计算,该整数计算找到的当前欺骗的数量,并在计数器大于0时打印子数组。(更新伪代码)。

另请注意:要获得O(k)空格,您的histogram需要在值为0时删除元素。