以最少的比较将列表列表合并为单个列表

Posted

技术标签:

【中文标题】以最少的比较将列表列表合并为单个列表【英文标题】:Merging a list of lists into a single list with minimal comparisons 【发布时间】:2014-12-16 03:17:16 【问题描述】:

我正在尝试将列表列表合并到一个主排序列表中。 (它是 C# 中的字符串列表列表,但类型在这里并不真正相关)

这里有类似的问题 How to merge a list of lists with same type of items to a single list of items? 但我的要求不同。

我所做的每一个比较都将基于用户输入,所以我不能像其他问题那样做任何一次性的 LINQ 事情。对于每次比较,我都必须询问用户哪个项目“更好”。

我最初的想法是有效地复制 'mergesort' 的 'merge' 部分,并对每次合并中从第二个列表中弹出的每个新术语重复使用二进制搜索。

但是,我仍然不知道合并列表的最有效顺序是什么。我应该将最小与最小合并,并以这种方式逐步增加大小吗?还是有一个指定的大列表将小列表合并到一次会更好? 我不确定如何去证明这两种方式。

如何在执行最少数量的面向用户的比较的同时合并这些任意大小的列表?

【问题讨论】:

有趣的问题,但可能与 CodeReview 或 Programmers 更相关? 请详细说明,以明确您要做什么。原始列表是否已经排序? “二分查找”是什么意思?您是说您要使用插入排序,并使用二分查找来查找插入点?但是为什么不对原始列表进行排序,然后进行适当的合并排序?最后请注意如果你使用用户作为实际的比较器,你需要弄清楚你将如何检测和处理不一致的用户输入。期望用户将满足任何重要大小的所有排序比较的传递要求是非常乐观的数据。 【参考方案1】:

鉴于这些列表都没有排序,并且您对列表中的数据没有任何预先存在的知识,因此您无法比 O(nlogn) 比较做得更好。这里 n 是 size(list 1) + size(list 2) +...size(list final)。

您可以简单地遍历列表列表并构造一个包含 n 个元素的主列表。然后,您可以使用快速排序或合并排序对主列表进行排序。排序的时间复杂度为 O(nlogn)。主列表有额外的 O(n) 内存。

所以你会询问用户关于 nlogn 的时间。您可以通过缓存先前比较的结​​果并且不再向用户询问相同的比较,从而最大限度地减少询问用户比较的次数。

【讨论】:

以上是关于以最少的比较将列表列表合并为单个列表的主要内容,如果未能解决你的问题,请参考以下文章

将熊猫移动窗口与列表进行比较,找出错误最少的窗口。

将列表中的 n 个 DF 合并到单个 DataFrame - Scala

如何比较另一个列表中的单个项目?

如何在python中把两个列表的各项分别合并为列表

如何将单个元素与集合或列表中的任何元素进行比较[重复]

如何比较单个列表和一系列列表?