我在这里关注算法:
http://cgm.cs.mcgill.ca/~godfried/teaching/dm-reading-assignments/Maximum-Gap-Problem.pdf
我不明白第2步和第3步:
将间隔[xmin,xmax]除以等于delta =(xmax-xmin)/(n-1)的(n-1)“桶”
- 醇>
对于每个剩余的(n-2)个数字,使用floor函数确定它落入哪个桶中。当且仅当(xi-xmin)/δ= k-1时,数xi属于第k个桶Bk。
让我们说 a = [13,4,4,2,9,17,18]
Minm:2 Maxm:18 n-1:6。 所以我的#桶将是6.并且delta =(18-2)/ 6 = 2.这是6个桶 每个都有2个元素。 (我可以拥有12个元素)
第2步.Que: 如果只有12个元素将是我的最大值18?
第3步。 对于元素18: 根据算法,它应该在math.floor((17-2)/ float(2))= 7 所以18应该在第8个块中,但我们只有(n-1)= 6个桶。
对我来说很神秘!
EDIT1: 抱歉 第3步:错误的数学: math.floor((17-2)/ float(2))= 5 仍然需要弄清楚最小值和最大值在哪里。
EDIT2: 根据Miljen Mikic的回答: 他是对的,我的问题是“我们用最大和最小的方式做什么” 在第6步:
在L中找到一对连续最小值和最大值(ximax,xjmin)之间的最大距离,其中j> 1。一世。
为什么j>一世?即下一个桶的最大值和当前桶的最小值。
答案 0 :(得分:2)
在您引用的算法中,您没有将最小值和最大值放在存储桶中。请注意步骤5之后的注释:
注意:由于有n-1个桶,只有n-2个数字..
如果您在某些存储分区中设置了最小值和最大值,那么您将拥有n
个数字,而不是n-2
。现在真正的问题是:如何处理最小值和最大值?实际上,算法的第6步应该稍微澄清一点。当您检查列表L时,您应该从x-min
开始并将其与x1-min
进行比较,然后您应该通过比较x(n-1)-max
和x-max
来结束,因为最大差距实际上可以包括最小值或最大值,就像你得到的那样在这个例子中:[1,7,3,2]。当然,这两个额外的比较仍然会给你线性时间复杂度。
请注意,您可以通过在桶中放置最小值和最大值来稍微更改算法(通过完全相同的公式!)然后您将拥有n
个数字和n
个桶。为什么?最小值总是在第一个桶中(参见公式),最大值需要放在先前不存在的n
桶中,因此如果我们应用此更改,我们会有一个额外的桶。这意味着在这种情况下,您不能总是应用Pigeonhole原理,但是它仍然认为一对连续元素之间的最大距离必须至少是桶的长度。怎么会?如果至少有一个桶包含两个元素,则必须有一些空桶,这很清楚。否则,所有桶只包含一个元素;这意味着第一个桶包含最小值,第二个桶包含一个值至少为x_min + δ
的元素,因此该元素与x_min
之间的差异至少为δ
,水桶的长度。为什么第二个桶中的元素必须至少为x_min + δ
?如果它小于那个,例如如果它是x_min + δ - k
,其中k > 0
,则它也属于第一个桶,因为[((x_min + δ - k) - x_min) / δ] = [(δ - k) / δ] = 0
,即不是我们假设的第二个桶!