【问题标题】:Maximum gap in unsorted array未排序数组中的最大间隙
【发布时间】:2015-04-12 19:25:01
【问题描述】:

我从这里开始关注算法:

http://cgm.cs.mcgill.ca/~godfried/teaching/dm-reading-assignments/Maximum-Gap-Problem.pdf

我不明白第 2 步和第 3 步:

  1. 将区间 [xmin,xmax] 分成相等大小 delta= (xmax–xmin)/(n-1) 的 (n−1) 个“桶”

  2. 对于每个剩余的 (n-2) 个数字,使用 floor 函数确定它落在哪个桶中。数 xi 属于第 k 个桶 Bk 当且仅当(xi-xmin)/δ=k-1。

让我们说 a = [13, 4, 7, 2, 9, 17, 18]

最小值:2 最大值:18 n-1:6。 所以我的桶数将是 6。而 delta = (18-2)/6 = 2。即 6 个桶 每个元素都有 2 个元素。 (我总共可以拥有 12 个元素)

第 2 步。问: 如果只有 12 个元素,我的最大 18 个元素在哪里?

第 3 步。 对于元素 18: 根据算法,它应该在 math.floor((17-2)/float(2)) = 7 所以 18 应该在第 8 个块中,但我们只有 (n-1) = 6 个桶。

对我来说是个谜!

编辑1: 对不起 第 3 步:错误的数学: math.floor((17-2)/float(2)) = 5 仍然需要弄清楚最小值和最大值在哪里。

编辑2: 根据 Miljen Mikic 的回答: 他是对的,我的问题是“我们用最大值和最小值做什么” 在第 6 步中:

在L中求一对连续的最小值和最大值之间的最大距离(ximax,xjmin),其中j>i。

j > i 怎么来的?即下一个桶的最大值和当前桶的最小值。

【问题讨论】:

  • 您可以询问哪些桶可能包含定义最大间隙的数字之一,质疑计算桶壁的所有这些差异的智慧,是否有必要在任何给定桶中插入许多数字首先,什么会构成比较次数的严格上限 - 这些都与分配点无关。
  • 您将 floor 函数应用于 δ,在此不需要它:δ 是 8/3(接近 2.67),而不是 2。在建议中,min 和 max 不要进入任何存储桶.

标签: algorithm sorting


【解决方案1】:

在您引用的算法中,您没有将最小值和最大值放在桶中。注意第5步后的注释:

注意:因为有 n-1 个桶并且只有 n-2 个数字..

如果您将最小值和最大值放在某些存储桶中,那么您将拥有 n 数字,而不是 n-2。现在真正的问题是:如何处理最小值和最大值?实际上,算法的第 6 步应该更清楚一点。当你检查列表 L 时,你应该从x-min 开始并与x1-min 进行比较,最后你应该比较x(n-1)-maxx-max,因为最大差距实际上可以包括最小值或最大值,就像你得到的例如在此示例中:[1,7,3,2]。当然,这两个额外的比较仍然会给你线性时间复杂度。

请注意,您也可以通过将最小值和最大值放入桶中来稍微更改算法(通过完全相同的公式!),然后您将拥有 n 数字和 n 桶。为什么?最小值总是放在第一个桶中(参见公式),最大值需要放在 n-th 桶中,以前不存在,所以如果我们应用这个更改,我们会有一个额外的桶。这意味着在这种情况下,您不能总是应用鸽洞原理,但是它仍然认为一对连续元素之间的最大距离必须至少是桶的长度。怎么来的?如果至少一个桶包含两个元素,那么一定有一些空桶,这很清楚。否则,所有桶都只包含一个元素;这意味着第一个桶包含最小值,第二个桶包含一个值至少为x_min + δ的元素,所以这个元素与x_min的差至少是桶的长度δ。为什么第二个桶中的元素必须至少是x_min + δ?如果它小于那个,例如如果是x_min + δ - k,其中k > 0,那么它也属于第一个桶,因为[((x_min + δ - k) - x_min) / δ] = [(δ - k) / δ] = 0,即不是我们假设的第二个!

【讨论】:

  • 您对“如何处理最小值和最大值”是正确的。但是在您的回答中,您的意思是第 6 步而不是第 5 步?
  • 似乎如果我添加数字,它可以很好地找到它们之间的距离(例如 [5,2,20,17,3]) Delta:4.0 Buckets:{2:[],6:[] , 10: [], 14: [], 18: [], 20: []} 桶:{2: [5, 2, 3], 6: [], 10: [], 14: [17], 18: [20], 20: []} L : [(2, 5), (17, 17), (20, 20)] 最大距离:12
  • 但你的例子不好:Delta: 2.0 Buckets: {1: [], 3: [], 5: [], 7: []} Buckets: {1: [1, 2 ], 3: [3], 5: [], 7: [7]} L : [(1, 2), (3, 3), (7, 7)] 4
  • @codemuncher 是的,我的意思是第 6 步。我需要回答的第二部分现在已大大扩展和清除,希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-10-29
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多