给出数字置换的算法,使得相邻差的总和小于2

时间:2012-04-12 13:16:38

标签: algorithm

这是一个家庭作业问题,但是我错过了讲师解释解决方案的讲座,我仍然无法弄清楚......

如果在区间[0,1]中给出n个实数(即x1,x2,x3,...,xn),则表明存在一种算法,该算法在最坏情况下线性时间运行,给出了一个排列这些n个数字使得相邻数字的差值之和小于2.给出的提示是“桶”。

3 个答案:

答案 0 :(得分:2)

嗯,你可以走这条路。将[0, 1]拆分为k个细分受众群:[0, 1/k)[1/k, 2/k),...,[(k-1)/k, 1]

您现在浏览列表并首先将所有适合第一段的数字放入新列表,而不是放入第二段等等。这可以在一次通过中完成,因此O(n)。< / p>

考虑现在需要的金额是多少。同一段内数字的差异最多为1/k,这种差异的数量为n-(k-1)。剩下的(n-1)差异在相邻桶的数字之间(完全是清楚的,为什么?)不超过1。总和受(n-k+1)/k + (k-1)/k约束。如果k足够小,你可以做得足够小。


更多详情:

让我们将我们的差异描绘成两种颜色:来自同一部分的数字之间的差异被涂成蓝色,不同部分的数字之间的差异被涂成红色。由于订购,我们首先只有第一段(可能是0)中的数字,而不是第二段中的数字,依此类推。因此,我们首先得到一些蓝色差异,而不是红色差异,而不是几个蓝色差异,而不是红色差异等。

让我们看看红色差异的数量是多少。显然不会有k-1个红色差异,对吗?因为每个红色差异从一个段跳到更高的段。其余的差异是蓝色的。

现在,每个蓝色差异不超过1/k,因为minuend和subtrahend来自同一个分段。而所有的红色差异(即他们的总和!)都不超过1.(暂时跳过其余部分,因为这是一个功课问题。)


校正:
所有红色差异的总和不超过2-2 / k。这是为什么?好的,我们等着瞧。第一个红色差异可能是从某个段A的开头到某个其他段B的末尾的最坏情况。第二种情况是最糟糕的情况,从B开头到其他某个细分受众群C的结尾。因此,在差异的总和中,除了第一个和最后一个之外的每个部分最多计算两次。

答案 1 :(得分:0)

尝试以n个等长间隔分割间隔。现在以任意顺序将数字放在它们所属的区间中,并证明这可以解决您的问题。

答案 2 :(得分:-1)

您是否了解过铲斗的种类? http://en.wikipedia.org/wiki/Bucket_sort

另请查看已排序数组的行为: {0,.5,.75,1}:差异总和为1。

将其与未排序数组的行为进行比较: {.75,.5,0,1}:差值之和为1.75