algorithm - 合并未排序的集合
问题描述
假设我有两个集合:
A = [约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎]
B = [麦迪逊、约翰、弗兰克、伊莎贝尔、鲍勃]
该算法应产生以下结果:
合并 = [麦迪逊、约翰、玛丽、弗兰克、伊莎贝尔、特蕾莎、鲍勃]
(虽然特蕾莎和鲍勃互换也可以)
换句话说,算法应该使用两个输入集合的现有排序来创建一个合并集合。理论上存在无限数量的可能元素,并且没有可以从中获取元素顺序的“主”列表。
对于我的用例,输入集合将相当小(通常少于 50 个项目),并且集合之间的大多数项目将相同,尽管不能保证。
这是一种已知类型的算法吗?我一直在寻找合并算法,但大多数都在谈论有序列表及其性能优化。
- - - 编辑 - - -
再举几个例子:
第一个附加示例:A = [John, Mary, Frank, Isabel, Teresa, Robert, Bob, Anna, Tessa, Philip] B = [John, Mary, Robert, Bob, Philip, Nicholas] MERGE = [John, Mary, Frank 、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯]
(因此算法应该推断 Nicholas 应该位于 Philip 之后,因为在集合 B 中也是如此)
第二个附加示例:A = [约翰,玛丽,弗兰克,伊莎贝尔,特蕾莎,罗伯特,鲍勃,安娜,泰莎,菲利普] B = [贝蒂,约翰,鲍勃,菲利普,尼古拉斯,鲍里斯] MERGE = [贝蒂,约翰,玛丽、弗兰克、伊莎贝尔、特蕾莎、罗伯特、鲍勃、安娜、泰莎、菲利普、尼古拉斯、鲍里斯]
(因此算法应该推断出 Betty 应该位于 John 之前,Nicholas & Boris 位于 Philip 之后)
解决方案
这是拓扑排序的一种变体,关系x < y
ifx
出现y
在任一列表之前。
只要有可能,此算法就会生成合并列表:
- 如果两个列表的头相同,则将该头添加到结果中,并将其从两个列表中删除。
- 如果任一列表的头部不在另一个列表中,则将其添加到结果中,并将其从所在的列表中删除。
- 否则,没有结果可以保留两个列表中元素的顺序。
您可以通过为列表中剩余元素的每个列表保留一个集合,或者为每个列表构建一个映射,将元素映射到列表中的索引,从而提高效率——即 O(n) 时间。
推荐阅读
- django - Django SlugField "This field is required" error
- scala - 什么会导致阶段在 Spark 中重新尝试
- html - 使用纯 CSS 从左侧滑动导航栏
- uncrustify - uncrustify:函数定义参数在单独的行上缩进
- spring - 使用 @ControllerAdvice 作为另一个项目的依赖项
- sas - SAS Macro in macro - 如何改变流程?
- postgresql - PostgreSQL 插入太多引用的表
- android - 如何在android的Activity中访问BaseActivity ToolBar
- ios - Xcode10.1(10B61) 在 iOS9.0.2 上运行应用程序时出现 `dyld_shared_cache_extract_dylibs failed` 错误
- json - 将对象反序列化为 DataTable