【发布时间】:2021-03-31 21:32:53
【问题描述】:
假设我有两个集合:
A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎]
B = [麦迪逊、约翰、弗兰克、伊莎贝尔、鲍勃]
算法应该产生以下结果:
合并 = [麦迪逊、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、鲍勃]
(虽然特蕾莎和鲍勃互换也可以)
换句话说,算法应该使用两个输入集合的现有排序来创建一个合并集合。理论上存在无限数量的可能元素,并且没有可以从中获取元素顺序的“主”列表。
对于我的用例,输入集合将相当小(通常少于 50 个项目),并且集合之间的大多数项目将相同,但这不能保证。
这是一种已知类型的算法吗?我一直在寻找合并算法,但大多数都在谈论有序列表及其性能优化。
----- 编辑 ------
还有几个例子:
第一个附加示例: A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普] B = [约翰、玛丽、罗伯特、鲍勃、菲利普、尼古拉斯] 合并 = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯]
(因此算法应该推断出 Nicholas 应该位于 Philip 之后,因为在集合 B 中也是如此)
第二个附加示例: A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普] B = [贝蒂、约翰、鲍勃、菲利普、尼古拉斯、鲍里斯] 合并 = [贝蒂、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯、鲍里斯]
(因此算法应该推断出 Betty 应该位于 John 之前,Nicholas & Boris 位于 Philip 之后)
【问题讨论】:
-
B.zip(A).flatten.uniq.compact会为您解决问题吗?我从您的示例中推断出您想要每个元素的第一个元素,然后是第二个元素,等等,因此是 zip。否则,(B + A).uniq. -
简单地展平不是解决方案,尽管我完全明白你为什么建议这样做。示例集合可能有点过于简单,抱歉!
-
关于混淆示例中的正确顺序:这不是问题,因为集合之间的大多数项目将是相同的(集合实际上是彼此的小突变)。如果对正确排序有歧义,那么任何输出都适合我的用例。
标签: algorithm array-merge