我有一个数字流,它们不是作为输入均匀分布的,我需要使用上面的数字找到一个数字序列,该序列会为第一个序列返回尽可能多的数字,但要均匀分布。
stream = [1,4,9,11,12,17,18,25,30,33,34,41,44,49,57,65,73,81,89,90,97,100]
我需要找到一个序列,其中包含尽可能多的均匀分隔的数字
例如,我知道我可以找到:
1,9,17,25,33,41,49,57,65,75,81,89,97
全部用8分隔。
一般如何解决此问题?
答案 0 :(得分:0)
def find_seq(lst):
running = []
done = []
so_far = []
for element in sorted(lst):
still_running = []
for run in running:
d, m = divmod(element - run[0], run[2])
if m == 0:
if d == run[1]:
run[1] += 1
still_running.append(run)
else:
done.append(run)
else:
still_running.append(run)
running = still_running + [[previous, 2, element - previous] for previous in so_far]
so_far.append(element)
return max(done + running, key=lambda run: run[1])
start, length, step = find_seq([1,4,9,11,12,17,18,25,30,33,34,41,44,49,57,65,73,81,89,90,97,100])
对于每对元素,我们假设它们开始一个序列(假设长度为2)。对于任何新元素,我们检查它是否适合我们正在跟踪的序列(或更多);如果可以,但是跳过了一个值,则序列结束;否则,我们将增加序列的长度。所有序列将在输入末尾完成。然后,查看哪个序列运行时间最长就很容易了。