Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 将值平均分组_Algorithm_Sorting - Fatal编程技术网

Algorithm 将值平均分组

Algorithm 将值平均分组,algorithm,sorting,Algorithm,Sorting,让我尽力解释一下情况 假设我有3个值 1, 2, 3 我告诉一个算法把这些值分成x列。让我们假设x=2进行澄清 该算法确定值组最好按以下方式放入两列 1st column 2nd column --------------------------- 1 3 2 每列都有一个偶数(总计,而不是文字)值 现在让我们假设我有以下值 7, 8, 3, 1, 4 我告诉算法我想把值分成3列。算法现在告诉我以下是最合适的 1st column 2nd column

让我尽力解释一下情况

假设我有3个值

1, 2, 3
我告诉一个算法把这些值分成x列。让我们假设x=2进行澄清

该算法确定值组最好按以下方式放入两列

1st column    2nd column
---------------------------
1             3
2
每列都有一个偶数(总计,而不是文字)值

现在让我们假设我有以下值

7, 8, 3, 1, 4
我告诉算法我想把值分成3列。算法现在告诉我以下是最合适的

1st column    2nd column    3rd column
8             7             3
              1             4
请注意,这些列甚至都不安静,但它已经尽可能接近了。只要列表尽可能接近,稍微过一点和稍微过一点就可以了


有人有什么建议吗?知道做这件事的好方法吗?

如果你想要完全相同的值,那么对于列数x=2,这是一个经典的方法,它是NP完全的,但有伪多项式解

如果有更多的列(即x>2),它将变成强NP完全

对于x>3,我怀疑它仍然是强NP完全的

由于x分区问题可以简化为您的问题,因此它将与上述问题一样困难


您可能需要一些启发式方法来帮助您。

我会这样做:

  • 加上所有的值,我们称之为s
  • 将S除以列数,我们称之为M
  • 使用背包算法(例如,在背包上快速搜索),找到一组总和为M或尽可能接近M的值
  • 取这组值的和,从S中减去,我们称之为T
  • 将T除以列数减1
  • 然后重复算法

不久前我回答了一个类似的问题

我能想到一个贪婪的次优解

  • 按降序对数字进行排序。(数字越小,惊喜就越少,所以以后再处理)
  • 决定你将拥有的电视机数量。对此不太确定
  • 逐个检查集合元素,并将它们放入总和最低的子集(如果总和相等,则循环)
  • 但这永远不会给你最佳的解决方案

    对于你的情况,8 7 4 3 1将是命令。你会(幸运地)得到与你提到的相同的结果

    8=8

    71=8

    4 3=7


    这并不总是为您提供最佳解决方案

    这是一个很好的启发式解决方案,可以避免使用任何调优参数,并且非常容易编程。在迭代较小的元素子集上使用背包会带来风险,我们会将许多较大的元素保留到最后,而且实现起来似乎很痛苦。这似乎更加稳健。