我已经提交了有关两个序列的LCS问题的代码草案。我尝试贪婪时犯了严重错误,现在我已经实现了我相信针对此问题的稳定贪婪算法。尽管我有两个问题,但是这是在线课程的这一部分,当我提交它时,它说序列[1,2,3]和[3,2,1]的正确输出是1,我相信为什么?因此,我转到了正确的版本并进行了测试,它可以正常工作,即输出为0,并针对正确的版本对其进行了许多良好的测试案例的测试,它可以正常工作。现在,我有三个问题: 为什么[1,2,3]和[3,2,1]应该输出1而不是0?如果我的代码无效,请帮我做一些无效的测试用例? 谢谢! 我的代码:
./program.x > output.txt
现在,我在这里拿这个,有人建议实施一个不错的方案:Python: Length of longest common subsequence of lists
但是在对def lcs2(a, b):
lst, tag= [], False
if len(set(a).intersection(set(b))) != 0: tag = True
if len(a) <= len(b): x = a; y = b
else: x = b; y = a
for i in y:
if i in x:
lst.append(x.index(i))
x[x.index(i)] = None
else:
y[i] = None
cnt = 0
for i in range(1 ,len(lst)):
if lst[i] > lst[i-1]: cnt += 1
if cnt == 0 and not tag: return 0
return cnt + 1
进行测试时,它只是对我失败,给出了正确的答案2而不是一个。
答案 0 :(得分:0)
lcs2([1, 2, 3], [3, 2, 1])
正确返回1
,因为[1]
,[2]
和[3]
都是两次运行中都存在的长度为1的序列的所有示例。 / p>
您的算法存在一些问题,似乎缺少某些情况。例如,它仅寻找y
中x
某个元素的第一次出现,但不会回溯以找到更长的序列。
此外,目前还不清楚为什么使用tag
,因为它的唯一功能似乎是检测这两个集合的交集是否为空(在这种情况下,结果仅为0,算法应该得出1或否则)。
一些与您的算法不太匹配的运行示例:print(lcs2([1, 2, 3], [1, 3, 2, 3]))
(答案为2,但应该为3)–这是因为缺少回溯; print(lcs2([], [1]))
失败,并出现IndexError,因为您尝试使用y[i] = None
访问空列表的元素。
由于https://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Code_for_the_dynamic_programming_solution的解决方案很好,因此无需在此重复。
通常,不要试图通过考虑随机示例来破坏代码来证明自己的代码,而应尝试考虑具有所有类型的变体并针对该集合进行测试的示例集合。另外,请尝试完全了解您自己的算法,以便找出缺陷并可能对其进行优化。