在一串数字中发现模式

时间:2016-12-26 20:47:00

标签: python algorithm

我有一个个人项目,我想在其中找出某些Pisano序列中找到的模式。每个序列(ex Pisano(3):0,1,1,2,0,2,2,1,0,1,1,2,0,2,2,1,0,1,1,2,0) ,2,2,1,0,...)有一个我想要提取的重复模式。在此示例中,模式将为(0,1,1,2,0,2,2,1)。

到目前为止,我已经开发出一种工作正常的算法,除非在模式中找到第一个序列号。

def hasPattern(seq):
    pBuffer = []
    predict = ''
    i = 0
    check = True
    iSeq = 0
    passThrough = 0
    while (check == True) and passThrough <10:
        val = seq[iSeq]

        if predict == val: #how to resolve the duplicates pattern values? (1, 1, 3, 1, 1, 3)
        if iSeq == len(seq)-1:
            check = False                
        if i < len(pBuffer)-1:
            i += 1
        else:
            i = 0
        else:
        i = 0
        iSeq = -1
        passThrough += 1
        pBuffer.append(val)

        predict = pBuffer[i]

        iSeq += 1

        if iSeq == len(seq)-1:
        check = False       

    return {'pattern': pBuffer, 'size': len(pBuffer)}

我的问题是:我应该如何构建一个算法来检查任何数字序列中的重复模式(不仅仅是Pisano序列)?

2 个答案:

答案 0 :(得分:2)

p = [0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1]

for b in range(2, len(p)/2):
    iterar = True
    for i in range(0,lp-b, b):
        if p[i:i+b]!=p[i+b:i+b+b]:
            iterar = False
            break

    if iterar:
        print "Solution %s: %s" %(b, p[:b])
        break

答案 1 :(得分:2)

您可以在序列中搜索0的第二个出现,后跟1:

def findPattern(seq):
   for i in range(2, len(seq)-1):
       if seq[i] == 0 and seq[i+1] == 1:
          return {'pattern': seq[:i], 'size': i}
   return {'pattern': [], 'size': -1}  # not found

这适用于Pisano系列因为mod(a + b,n)= mod(mod(a,n)+ mod(b,n),n),这意味着您可以通过Pisano系列计算每个数字将两个先前的数字相加,然后找到模数n,而不必计算Fibonacci系列模数中的数字。这意味着一旦原始的两个数字(0和1)重复,则重复该序列。此外,对于系列中的任何两个数字,只能有一个可能的先前数字,因此您不会获得像ABCDEFGEFGEFG等的序列