我正在寻找针对以下问题的优雅,高性能解决方案。
共有256个链接列表。
如何从256个原始链接列表中的所有对象创建单个升序有序列表?我不想暴力破解它,并且还有一些其他的想法,但这似乎是那些有标准的,最佳的解决方案的问题之一。
答案 0 :(得分:3)
您可以使用一个优先级队列来保存256个链接列表中每个列表的“最顶层”项目。这个“最顶层”项是计划插入结果列表的项。这样,您可以从优先级队列中取出最小的元素,将其插入到生成的队列中,然后将其下一个元素插入到优先级队列中:
# Preprocessing:
result = list.new()
queue = priority_queue.new()
foreach (list in lists):
queue.push(list.first())
# Main loop:
while (not queue.empty()):
node = queue.pop()
result.insert(node)
if (node.next() != null):
queue.push(node.next())
答案 1 :(得分:1)
如果各个列表已经排序,那么它就是merge algorithm的直接应用。简而言之:比较所有的头并选择最小的头,将其从列表中取出并推入输出列表。重复,直到所有源列表都为空。
编辑:Konrad使用优先级队列(heap)是一个更加优雅和可扩展的解决方案,但可能256个输入列表很少,简单的比较可能更快。
答案 2 :(得分:0)
将每个列表与其上方的列表128合并。 (产生128个清单)
然后将每个列表与其上方的列表64合并。 (产生64个清单)
然后将每个列表与其上方的列表32合并。 (产生32个清单)
然后将每个列表与其上方的列表16合并。 (产生16个清单)
然后将每个列表与其上方的列表8合并。 (产生8个清单)
然后将每个列表与其上方的列表4合并。 (产生4个清单)
然后将每个列表与其上方的列表2合并。 (产生2个清单)
然后将每个列表与其上方的列表1合并。 (产生1个清单)
(您可以使用上面的循环)。
答案 3 :(得分:0)
你没有说这些列表有多长,但我认为它们同时适合RAM。我要尝试的第一件事是将它们全部附加在一起,并调用我的环境的内置排序例程,我会看到它是否提供了可接受的性能。它易于实现,不需要很长时间来测试。如果这不能提供可接受的性能,我将使用Konrad Rudolph给出的优先级队列合并。