我有一个个人项目,我想在其中找出某些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序列)?
答案 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等的序列