检测重复元素的序列

时间:2012-11-27 21:03:29

标签: algorithm sequence repeat

我有一组随机数字可以说:

[10,11,12,14,15,16,17,18,19,20, 11 12 14 ,25,25,26,27,28,29]

我必须检测重复序列(实际上是错误)

长度大于特定数字(2)。

这有什么好的算法吗?

我现在拥有的东西:

int minLenght = 3;
int[] data = {1,2,3};

for(int i = 0; i < data.length; i++){
    for(int j = 0; j < data.length; j++){
        if ( data[i] == data[j]){
            int l = 0;
            int ii = i;
            int jj = j;
            while(data[ii] == data[jj]){
                ii++;
                jj++;
                l++;
            }
            if(l >= minLenght){
                print('['+i+'-'+ii+'] same as ['+j+'-'+jj+']');
            }
        }
    }
}

3 个答案:

答案 0 :(得分:4)

一种方法是在哈希表中存储长度为L(比特定长度大一个)的序列。

如果您发现某个序列已经在哈希表中,那么您已经找到了重复长度&gt; = L.

e.g。 Python代码

A=[10,11,12,14,15,16,17,18,19,20,11,12,14,25,25,26,27,28,29]
S=set()
L=2+1
for i in xrange(len(A)-L+1):
    key=tuple(A[i:i+L])
    if key in S:
        print i
    else:
        S.add(key)

这将打印出长度大于2的重复序列的位置。

答案 1 :(得分:0)

我不知道是否有一个特殊的算法,但我的提议是这样的:

loop1 over array[i]:
  loop2 over array[j] starting with i+1:
    dist=array[j]-array[i];
    if dist==specific_number:
      array_result.append(array[i] +""+""+array[j]) 

这将是我的简单逻辑,如果错了,请不要请求:(

答案 2 :(得分:0)

您可以使用正则表达式,但显示的列表格式不规则。我使用下面的Python并“规范化”列表格式,在应用正则表达式查找重复的数字/非数字序列之前将其转换为字符串:

>>> import re
>>> numbers = [10,11,12,14,15,16,17,18,19,20, 11, 12, 14,25,25,26,27,28,29]
>>> sep = ', '
>>> txt = sep + sep.join(str(x) for x in numbers) + sep
>>> txt
', 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 11, 12, 14, 25, 25, 26, 27, 28, 29, '
>>> re.search(r'\D((?:\d+\D+){2,}).*\1', txt).groups()
('11, 12, 14, ',)

我通常会尽量减少对正则表达式的使用,但这确实会检测到重复。