将列表列表合并到单个列表中,并进行最少的比较

时间:2014-10-21 01:25:54

标签: c# merge comparison

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

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

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

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

但是,我仍然不知道合并列表的最有效顺序是什么。我应该合并最小和最小,并逐步建立尺寸?或者有一个指定的大名单,小名单合并成一次会更好吗? 我不知道如何证明这一点。

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

1 个答案:

答案 0 :(得分:1)

鉴于这些列表都没有排序,并且您没有关于列表中数据的任何预先存在的知识,您不能比O(nlogn)比较更好地做到这一点。这里n是大小(列表1)+大小(列表2)+ ...大小(列表最终)。

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

因此,您会询问用户有关nlogn次的信息。您可以通过缓存先前比较的结​​果并且不再向用户询问相同的比较来最小化您向用户询问比较的次数。