给定一个任意实数的排序数组A [1 ... n] 对于每个i∈[1 ... n-1]; A [i + 1] - A [i]是A的第i个间隙。
a)计算A的n-1个间隙的平均间隙。 - 尝试1:在O(n)时间内,迭代A并将每个间隙添加到“GapSum”。 GapSum / n-1 =平均差距
b)根据平均定律,必须有一些i∈[1 ... n-1],使得A的第i个间隙不超过A的平均间隙。任何这样的第i个间隙被称为短暂的差距。找出A的短暂差距 - 尝试1 :明显的O(n) - 检查每个差距,返回最小。 是否有一个渐近更快的分界并征服算法来找到A的短暂差距?
我有点担心我怎么能更快地做到这一点?是否有我可能忽略的平均属性。任何方向都会有所帮助。
- edit-- Nico评论说,平均差距可以在恒定时间内计算。 这会算作恒定的时间: 我必须能够在恒定时间内计算平均间隙的唯一想法是在计算之前准备辅助阵列,其中它在B [i]中存储间隙的总和。然后计算平均间隙将是B [n-1] / n-1
答案 0 :(得分:3)
鉴于A
已排序,具有恒定时间查找且您知道n
,您可以通过获取第一个和最后一个元素之间的差异来计算恒定时间内的平均间隙大小除以n
。
一个。迭代A
并返回小于或等于平均值的第一个间隙。无需找到最小的差距。不过,您的运行时间仍然在O(n)
。
湾你能做得更好吗?考虑做一些类似于binary search的事情:计算数组两半的平均间隙大小。平均值较低的那个必须包含至少一个短间隙,因此您只能搜索那一半。递归地在那一半做同样的事情,你可能最终得到O(log n)
算法!