什么是一个很好的排序算法,用于将元素放入容器并尽可能保持容器?

时间:2012-10-03 01:43:50

标签: algorithm sorting extjs4 buckets

所以我实际上会在ExtJS4中使用它来做一些动态表单布局生成,但我认为我可以简化问题,以便在不丢失任何内容的情况下进行讨论:

假设我有一个整数列表,我想放在两个容器中。当我完成后,我希望两个容器“尽可能”,在这种情况下,每个容器内的整数总和就像我们可以得到的那样彼此接近。在这种情况下,每个容器中有多少个整数结束并不重要,只是它们的总和很接近。

以下是可能的输入和理想输出的示例:

Integers: [1,7,13,3,6,8]
Container A: [13,6] (sum 19) 
Container B: [1,7,3,8] (sum 19)

一种天真的方法可能是迭代整数列表一次,并将每个整数放在当前具有较小总和的容器中:

Integers: [1,7,13,3,6,8]
Container A: [1,13,8] (sum 22)
Container B: [7,3,6] (sum 16)

你们建议采用什么算法/方法来解决这个问题?我想有很多潜在的。如果您发现在代码示例中更容易思考,我将在javascript中实现最终产品。

谢谢!


修改

我喜欢到目前为止提出的两种方法(感谢cheeken和sumudu fernando),这两种方法都提供了很好的方法来快速实现接近(或完全)理想答案的方法。对于一组足够小的整数,我想你可以强制计算并明确地说特定答案是最好的(或者最好的并列)。做这样的事情的任何建议?换句话说,这种方法可以保证一个理想的答案,代价是可能很慢(或者对于大型问题集是完全不可行的)。

1 个答案:

答案 0 :(得分:1)

  1. 计算所有元素的总和。
  2. 计算总和的一半s
  3. Knapsack problem应用于构成目标总和s的数字。
  4. 将解决方案放入一个容器中,将剩余的元素放入另一个容器中。