此问题可能与某些现有密度问题类似。 想象一个输入文件,当n是无符号长整数时,有n个条目。 读取文件并找到密度最大的窗口的最有效方法是什么。如果有多个窗口具有最高相等密度,则必须将所有窗口打印为输出。 例如输入文件:
1.02,1.03,5.00,1.30,-1.10,1.00,1.01,1.04,1.05,1.06,2.00,2.10,5.00,5.00,5.00,5.01,5.01,8.00,8.01,8,01,1000.00,1000.00 ,1000.00,1000.01,1000.01,1000.02,1000.07
如果窗口= 0.00,则密度最大为5.00,密度为4: [5.00,5.00,5.00,5.00]
如果窗口= 0.05,则会有5个密度最大的窗口:
[5.00, 5.00, 5.00, 5.00, 5.01, 5.01]
[1.00, 1.01, 1.02, 1.03, 1.04, 1.05]
[1.01, 1.02, 1.03, 1.04, 1.05, 1.06]
[1.02, 1.03, 1.04, 1.05, 1.06, 1.07]
[1000.00, 1000.00, 1000.00, 1000.01, 1000.01, 1000.02]
答案 0 :(得分:0)
您可以通过隐式构建相应的数学函数来解决此问题:
P = the set of points
f(x) = amount({p | x in [p, p + L]})
我们可以通过以下方式模拟此功能:
p + L
,则将指针递减1.存储计数器最大化的间隔的位置作为伪代码:
list p = sort(list(P))
queue q
int count = 0
range max = (-1, -1, 0)
while !p.empty:
if q.empty || q.peek() > p[0]:
count++
if max.count < count
max = (p[0], -1, count)
q.push(p[0] + L)
p.remove(0)
elif q.peek() < p[0]:
count--
if max.end == -1:
max.end = q.peek()
q.pop()
count--
else:
q.pop()
p.remove(0)
此算法的基本思想是为f
构建直方图并搜索最高部分。 q
存储由[p, p + L]
定义的区间的终点,p
起点。