我在寻找一个优雅的、高性能的解决方案,下面的问题。

有256联的名单。

  • 每一列表中包含相同类型的目标,除其他外拥有一个整体数字,用于定义的排列顺序。
  • 所有数字在所有清单是唯一的
  • 每个人名单是排在上升顺序通过这些号码

你会如何建立一个单一的上升令列表中的所有对象,从256原有联系的名单?我不喜欢暴力,并有一些其他想法,但这似乎是一个这些问题有一个标准,最佳的解决方案。

有帮助吗?

解决方案

你可以使用一个优先排队持有的"最顶端"的项目的每个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())

其他提示

如果个人名单已经排序,然后这是一个直接应用的 合并的算法.在短:比较所有国家元首和挑选最小的,把它拿出来的其列并推到你的输出清单。重复,直到所有来源清单是空的。

编辑:康拉德的使用的一个优先事项队列(a )是一个更为优雅和可扩展的解决方案,但也许256输入名单是如此之少的一个简单的比较可以更快。

只是合并每个名单清单128上。(导致128名单)
然后,合并每个名单列出64段。(导致64列出)
然后,合并每个名单的名单32段。(导致32名单)
然后,合并每个名单列表16。(导致16名单)
然后,合并每个名单列表8上。(导致8名单)
然后,合并每个名单列表4所述。(导致在4列出)
然后,合并每个名单的名单2上。(导致在2列出)
然后,合并每个列表中的列表1所述。(导致1列表)
(你可能会使用一个循环用于上文)。

你没说怎么长的这些名单,但是我承担他们所有适合在内存在相同的时间。第一件事我会尝试为附加他们都在一起,并呼吁我的环境内种例行程序,并且我会看到如果这给了可接受的性能。它很容易实现,也不会需要很长时间来进行测试。如果没有得到可接受的性能,我会去的优先排队合并由康拉德*鲁道夫。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top