给定n个双数和双窗

时间:2016-12-09 08:17:18

标签: algorithm c++11

此问题可能与某些现有密度问题类似。 想象一个输入文件,当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]

1 个答案:

答案 0 :(得分:0)

您可以通过隐式构建相应的数学函数来解决此问题:

P = the set of points
f(x) = amount({p | x in [p, p + L]})

我们可以通过以下方式模拟此功能:

  • 对点数列表进行排序,如果尚未排序
  • 从左到右遍历。如果遇到某个点,则将计数器递增1,如果遇到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起点。