Python数组中索引的最长递增子序列
该算法最初是在计算序列中索引相应增加的最长递增数字列表时实现的,因此给定Python数组中索引的最长递增子序列,python,Python,该算法最初是在计算序列中索引相应增加的最长递增数字列表时实现的,因此给定 seq = [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15] 它会回来的 [0, 2, 6, 9, 11, 15] 实现看起来像 def subseq(seq, keyfn=lambda value: value): if not seq: return seq tail = [] prev = [] for i in rang
seq = [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
它会回来的
[0, 2, 6, 9, 11, 15]
实现看起来像
def subseq(seq, keyfn=lambda value: value):
if not seq: return seq
tail = []
prev = []
for i in range(len(seq)):
for k in range(len(tail)-1, -1, -1):
if keyfn(seq[tail[k]]) < keyfn(seq[i]):
if len(tail) == k+1:
tail.append(i)
elif keyfn(seq[tail[k+1]]) > keyfn(seq[i]):
tail[k+1] = i
prev.append(tail[k])
break
else:
tail.append(i)
prev.append(None)
i = tail[-1]
subseq = [seq[i]]
while prev[i] is not None:
i = prev[i]
subseq.append(seq[i])
subseq.reverse()
return subseq
该算法执行线性扫描,而应执行对分二进制搜索。
重构它以执行二进制搜索的最佳方法是什么?回答:
这是一个完全随机测试的结果,例如,它们在时间上似乎几乎完全正确我认为没有一种方法可以用二进制搜索比线性搜索更有效地实现这一点。原因是二进制搜索在排序列表上工作,因为您可以比较相邻元素。我不清楚这是否适用于这里。你怎么能把没有排序的东西一分为二呢?也许我误解了这个问题。首先对序列进行排序/使用对分来保持列表的排序。现在您可以应用二进制搜索。此外,您的输出不是最长的递增子序列-我不确定该输出代表什么。@loretoparisi输出中没有一个数字是连续的。我认为你所描述的是序列中最长的递增数字列表,序列中的索引也相应递增。另外,您的示例代码失败,因为tail未定义。
bisect = "longest_subsequence([1,2,3,4,5,6,7,2,2,2,2,2,5,1,7,8])"
_subseq = "subseq([1,2,3,4,5,6,7,2,2,2,2,2,5,1,7,8])"
from timeit import timeit
print(timeit(bisect, globals=globals(), number=10000)) # 0.2994734
print(timeit(_subseq, globals=globals(), number=10000)) # 0.32428109999999993