合并未排序的集合

时间:2021-03-31 21:32:53

标签: algorithm array-merge

假设我有两个集合:

A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎]

B = [麦迪逊、约翰、弗兰克、伊莎贝尔、鲍勃]

算法应该产生以下结果:

MERGE = [麦迪逊、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、鲍勃]

(虽然Teresa和Bob换了也没关系)

换句话说,算法应该使用两个输入集合的现有顺序来创建合并的集合。理论上存在无限数量的可能元素,并且没有可以从中获取元素顺序的“主”列表。

对于我的用例,输入集合将相当小(通常少于 50 个项目),并且集合之间的大多数项目将相同,尽管不能保证。

这是一种已知类型的算法吗?我一直在寻找合并算法,但大多数都在谈论有序列表及其性能优化。

----- 编辑------

再举几个例子:

第一个附加示例: A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普] B = [约翰、玛丽、罗伯特、鲍勃、菲利普、尼古拉斯] 合并 = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯]

(因此算法应该推断出 Nicholas 应该位于 Philip 之后,因为在集合 B 中也是如此)

第二个附加示例: A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普] B = [贝蒂、约翰、鲍勃、菲利普、尼古拉斯、鲍里斯] 合并 = [贝蒂、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯、鲍里斯]

(所以算法应该推断出 Betty 应该位于 John 之前,而 Nicholas & Boris 应该位于 Philip 之后)

2 个答案:

答案 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']

这不是完美的解决方案,有更好的方法来优化它,但既然你说你的阵列相当小,它应该足够好。

相关问题