我最近想到了这个问题,我想到了一个本能的"贪婪的解决方案,但我不能证明它的最优性。
您将获得 N 整数, V 1 , V 2 , ..., V N 和 K 集( K < N )
您需要找到一种将整数划分为集合的方法,以便最大化同一集合中任意两个元素之间的最小差异。
例如,当整数为1,5,6,8,8并且你有2组时,分割整数的最佳方法是
{1,6,8}
{5,8}
所以最小差异在6到8之间,即2。
这种安排不是唯一的,例如
{1,5,8}
{6,8}
同样给出最小差值2。
我在想,如果我可以使用贪心算法来解决这个问题。
我先排序,然后把所有 V 1 , V 1 + K ,< em> V 1 + 2K ...在一起,然后所有 V 2 , V 2 + K , V 2 + 2K ...在一起等等。
是否有证据证明此解决方案的最优性,或者这样做无效的反例?
感谢。
答案 0 :(得分:2)
是的,这是最佳的。我们将展示如果使用您的过程出现差异D,那么对于任何数字排列,同一组中的一对数字最多相差D。
为了证明这一点,请考虑将已排序的数字逐一添加到K集中。让我们调用排序的数字x [i]。假设我们将x [n]添加到其中一个集合中。该集合中的最大值是x [n-k],对于某些D,x [n] -x [n-k] = D.
现在,集合x [nk],x [n-k + 1],...,x [n]是一组k + 1个数字,所有这些数字彼此相差至多D(对于x [n] -x [nk] = D)。
根据鸽子洞原则,无论你如何排列,这些k + 1个数中的两个必须落在同一个集合中,因此最大最小距离必须至多为D.
这证明如果您的过程中出现距离D,则可达到的最大最小距离最多为D.
设D_min是使用您的过程在同一组中两个数字之间的最小差异。然后我们已经证明可达到的最大最小距离是&lt; = D_min,但也是D_min <=最大最小距离(因为D_min是最小距离),这表明D_min 是最大最小距离