在系列范围中找到最频繁重复的整数

时间:2014-03-22 22:54:34

标签: algorithm time-complexity radix-sort

我已经做了这个练习,在那里我无法弄清楚我错过了什么。它实际上与现有问题非常相似,但不一样,解决方案可能不一样。 现有问题:Finding the most frequent number from a set of ranges -

问题:


在[0,n d ]范围内给出n个范围[a i ,b i ],其中d为一个常数正整数。 a i ,b i 也是整数,0< = a i < = b i < ; = n d 每个i(i = 1,...,n)。

编写算法以查找出现在最大量范围内的整数z [a i ,b i ]。复杂性必须是线性的(作​​为n,d的函数)。


在我看来,这是一个经典的计数/基数排序问题:使用k = n作为基数,排序的复杂度变为O(d * n)。问题是,下一步该怎么做?我有点卡在这上面了。在相关问题中,假设范围只能是一定的大小,而在我的问题中没有这样的假设,理论上可以有[0,n d ]的范围以及介于两者之间的任何事情。

随机示例:

Input: [1, 3], [5, 10], [5, 11], [6, 17], [8, 9], [9, 21], [11, 15], [12, 12]
Output: 9

1 个答案:

答案 0 :(得分:2)

排序是一个好主意(基数排序似乎是要走的路),但我不会对间隔进行排序。相反,我会使用扫描线样式方法。想象一下从0到n ^ d的数字线上绘制的区间。现在我们从左到右“扫”。

有趣的是我们当前位置相交的间隔数可以改变的情况,是我们间隔的起点/终点。请注意,我们也可以选择其中一个起点或终点作为解决方案。

所以我们只考虑这些点并从左到右扫描:

events = start points UNION end points
sort events (rank start points before end points in case of a tie)
count = 0
max = 0
for each event x in sorted order
    if x is start point
        count++
    if x is end point
        count--
    if count > max
        max = count
        result = x