这是一个家庭作业问题,但是我错过了讲师解释解决方案的讲座,我仍然无法弄清楚......
如果在区间[0,1]中给出n个实数(即x1,x2,x3,...,xn),则表明存在一种算法,该算法在最坏情况下线性时间运行,给出了一个排列这些n个数字使得相邻数字的差值之和小于2.给出的提示是“桶”。
答案 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