最長の算術累進部分列の問題は次のとおりです。整数 A の配列が与えられた場合、その中の最長の等差数列を見つけるアルゴリズムを考案します。言い換えると、A[i1]、A[i2]、…、A[ik] が等差数列を形成し、k が最大になるようなシーケンス i1 < i2 < … < ik を見つけます。次のコードは、O(n^2) 時間と空間で問題を解決します。( http://www.geeksforgeeks.org/length-of-the-longest-arithmatic-progression-in-a-sorted-array/から変更。)
#!/usr/bin/env python
import sys
def arithmetic(arr):
n = len(arr)
if (n<=2):
return n
llap = 2
L = [[0]*n for i in xrange(n)]
for i in xrange(n):
L[i][n-1] = 2
for j in xrange(n-2,0,-1):
i = j-1
k = j+1
while (i >=0 and k <= n-1):
if (arr[i] + arr[k] < 2*arr[j]):
k = k + 1
elif (arr[i] + arr[k] > 2*arr[j]):
L[i][j] = 2
i -= 1
else:
L[i][j] = L[j][k] + 1
llap = max(llap, L[i][j])
i = i - 1
k = j + 1
while (i >=0):
L[i][j] = 2
i -= 1
return llap
arr = [1,4,5,7,8,10]
print arithmetic(arr)
これは を出力します4
。
ただし、最大 1 つの値が欠落している等差数列を見つけられるようにしたいと考えています。したがって、arr = [1,4,5,8,10,13] の場合、値が 1 つ欠落している長さ 5 の進行があることを報告したいと思います。
これは効率的に行うことができますか?