動態規律查找(二)

優化了之前的代碼,使查詢更快

a = [1,2,4, 11,12,14, 21,22,24, 31,32,34, 41,27,37,47,67, 1,2,4, 11,12,14, 21,22,24, 31,32,34, 41,27,37,47,67]
data = []
for i in range(1,len(a)):
    data.append( a[i]-a[i-1] )

datalen = len(a)
i = 0

def check(data, i, winlen):
    for j in range(winlen):
        if data[i+j] != data[i+j+winlen]:
            return i
    return check(data, i+winlen, winlen)

while i<datalen:
    for winlen in range( 1, (datalen-i)//2 ):
        if data[i] == data[i+winlen]:
            end = check(data, i, winlen)
            
            if i != end:
                print(i, end, winlen)
                i = end + winlen - 1
                break
    i += 1

輸出結果:

0 9 3
13 14 1
17 26 3
30 31 1

0 是起點 9是終點,3是片段長度,表示 1,2,4,  11,12,14,   21,22,24,  31,32,34 這串數字是按規律排序的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章