我有一个数字序列,例如:170, 205, 225, 190, 260, 130, 225, 160
,我必须将它们分成具有固定数量元素的集合,以便集合元素之间的最大差异是最小化。
我保证如果需要将元素拆分为K
元素集,则元素的全局数量等于Z * K
。
对于K = 4
的示例,可以通过以下方式进行最佳拆分:(1) : 130 160 170 190
(最大差异等于60)(2) : 205 225 225 260
(最大差异等于55)
因此,这种情况下的全局最大差等于60。
现在,问题是:我是否假设可以简单地将排序为初始数据,并从头开始将其拆分为偶数部分?如果这是正确的,我怎么证明呢?如果不是,我应该使用哪种方法来解决此问题?
最佳答案
假设您的数字量始终可以精确地除以K(因此不能以4为一组的13个数字),这是正确的。
通过排序,很显然,您会获得彼此最接近的最相似的数字。问题是,如果移动数字以使最差值放在更接近的值集中,那么最大差值是否变小?
答案是不。排序后,数字左边的唯一值等于或小于,向左移动的数字将被较低的值包围。在造成最大差异的两个数字中,至少有一个会变得更差,这意味着您的最大距离会变长。右边的数字越大,其作用方式相同。
Sorted:
[lowest, low, low, x] distance1 = x-lowest
[y, high, high, highest] distance2 = highest-y
Swapped:
[lowest, low, low, y] distance3 = y-lowest
[x, high, high, highest] distance4 = highest-x
由于x distance1和distance4> distance2,意味着情况变得更糟。
如果您在此处放置更高的值,则其工作方式相同。
不管数字有多少,将另一个数字放在该位置将使它们更富裕。
另一种选择是将整个子集向左移动一个空格:
[lowest, low, low, y]
[high, high, highest, x]
但这实际上是与交换相同的结果。
这就是它与2套设备一起工作的方式。
三套:
[lowest, low, low, x]
[lowM, lowM, highM, highM]
[highM, y, high, highest]
交换x和y与之前相同。即使x非常相似或什至等于左下方的高点(如果中间的低点和高点实际上相等),y仍高于x,从而使差值最小化得更大,并且x远离最高点。
向前移动一堆数字:
[lowest, low, lowM, lowM]
[highM, highM, highM, y]
[x, highM, high, highest];
也许最大的区别是在highM和highM之间,并且该距离现在已删除。但是由于只能通过在该位置放置一个更低的值来将其从最高位置移开,所以您总是使它变得更糟。最高距离highest-highM现在是最高x,并且x
相反,它仍然可以正常工作。如果有下一组,highM可以用更高的数字替换为接近最高的数字,但这会使highM与更高的数字交换,从而导致更大的差异。
因此,是的,对数据进行排序然后将其分成相等的部分,总会给您带来最小的最大差异,因为更改排序后的集合总是会产生较差的结果。
注意:如果数字不能被K整除,它将变得更加复杂,您必须找出最差的数字,并查看是否可以将其最高或最低数字移至下一个或上一个数字,而又不会使另一个数字更糟区别。删除了只能用低数字交换低数字的规则,因为可以用无数字交换数字,因此证明这一点是一个全新的水平。