如果我们假设你的两个列表都是有序的,并且它们每个都只缺少整个集合中的一些元素,那么我可以看到一个应该在大多数情况下都能工作的算法.
>在A中取下一个索引.
>逐步寻找比赛:
>如果匹配:
>从B的开头删除所有内容,包括B中的匹配,并添加到C
>如果没有匹配:
>将索引A添加到C.
>重复
>如果B中还有任何内容,请将其添加到C.
这是算法的python代码:
a1 = ['Second', 'Third', 'Fourth']
b1 = ['First', 'Second', 'Third']
a2 = ['First', 'Third', 'Fourth']
b2 = ['First', 'Second', 'Third']
a3 = ['First', 'Third', 'Fourth']
b3 = ['First', 'Second', 'Fourth']
def merge(a, b):
c = []
b_oldindex = 0
for a_index in range(len(a)):
match = False
for b_index in range(b_oldindex, len(b)):
if a[a_index] == b[b_index]:
c.extend(b[b_oldindex:b_index+1])
b_oldindex = b_index + 1
match = True
break
if not match:
c.append(a[a_index])
if b_oldindex < len(b):
c.extend(b[b_oldindex:])
return c
print(merge(a1,b1))
print(merge(a2,b2))
print(merge(a3,b3))
print(merge(b1,a1))
print(merge(b2,a2))
print(merge(b3,a3))
其中产生以下输出:
['First', 'Second', 'Third', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
['First', 'Third', 'Second', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
在所有测试用例中,唯一未能产生正确顺序的是merge(a3,b3).
完全解决问题可能涉及实现正确的合并算法(如合并排序中所使用的),这需要能够评估元素应该处于的顺序.您可以在Rosetta代码中看到python implementation of merge sort.
更新:
鉴于这实际上是对一组书中的分期付款进行排序,您可以通过考虑其他信息来避免在第三组数据中描述的情况.即,按照版权或出版日期的相反顺序使用列表上的合并功能.
例如,在您的情况下:
a3 = ['First', 'Third', 'Fourth'] # Second novel
b3 = ['First', 'Second', 'Fourth'] # Third novel
a3的书将在b3的书之前出版.如果您可以收集这种元数据,那么您可以避免此问题.
版权日期在同一本书的不同版本之间不会有所不同,但发布日期可能会有所不同.因此,我会在发布日期之前查看版权日期.