假设我有两个集合:
A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎]
B = [麦迪逊、约翰、弗兰克、伊莎贝尔、鲍勃]
算法应该产生以下结果:
MERGE = [麦迪逊、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、鲍勃]
(虽然Teresa和Bob换了也没关系)
换句话说,算法应该使用两个输入集合的现有顺序来创建合并的集合。理论上存在无限数量的可能元素,并且没有可以从中获取元素顺序的“主”列表。
对于我的用例,输入集合将相当小(通常少于 50 个项目),并且集合之间的大多数项目将相同,尽管不能保证。
这是一种已知类型的算法吗?我一直在寻找合并算法,但大多数都在谈论有序列表及其性能优化。
----- 编辑------
再举几个例子:
第一个附加示例: A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普] B = [约翰、玛丽、罗伯特、鲍勃、菲利普、尼古拉斯] 合并 = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯]
(因此算法应该推断出 Nicholas 应该位于 Philip 之后,因为在集合 B 中也是如此)
第二个附加示例: A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普] B = [贝蒂、约翰、鲍勃、菲利普、尼古拉斯、鲍里斯] 合并 = [贝蒂、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯、鲍里斯]
(所以算法应该推断出 Betty 应该位于 John 之前,而 Nicholas & Boris 应该位于 Philip 之后)
答案 0 :(得分:2)
这是拓扑排序的一种变体,如果 x < y
出现在任一列表中的 x
之前,则关系为 y
。
只要有可能,这个算法就会生成合并列表:
您可以通过为列表中剩余元素的每个列表保留一个集合,或者为每个列表构建一个映射,将元素映射到它们在列表。
答案 1 :(得分:0)
如果我正确理解您的问题,您希望合并两个数组,同时保护它们的顺序并删除连续的重复项。
为了做到这一点,我们可以简单地循环更大的数组,并且在每个循环中我们可以控制列表长度、连续重复等...
代码:
A = ["John", "Mary", "Frank", "Isabel", "Teresa"]
B = ["Madison", "John", "Frank", "Isabel", "Bob"]
# Determine the bigger array length.
loop_count = len(A)
if len(B) > len(A):
loop_count = len(B)
# Loop the arrays and append to merged array if not out of index,
# or not consecutive duplicate.
merged = []
for i in range(0, loop_count):
if i < len(A):
if len(merged) == 0 or merged[-1] != A[i]:
merged.append(A[i])
if i < len(B):
if len(merged) == 0 or merged[-1] != B[i]:
merged.append(B[i])
print(merged)
输出:['John', 'Madison', 'Mary', 'John', 'Frank', 'Isabel', 'Teresa', 'Bob']
这不是完美的解决方案,有更好的方法来优化它,但既然你说你的阵列相当小,它应该足够好。