【问题标题】:Merging overlapping intervals based on a max count for number of guests根据客人数量的最大计数合并重叠间隔
【发布时间】:2019-05-18 07:33:52
【问题描述】:

我想制作一个程序来计算有多少客人同时在场。所有客人都有到达和离开时间。我已经计算了最多客人数,它可以给我一次,当它达到最大值时。我想要的是出现最大客人数的所有时间间隔

我尝试过使用重叠方法,但效果不佳,可能是因为它比较了列表中太多或太少的值。我有两个列表,到达和退出,我在控制台应用程序上写入值时添加值。

我尝试将来自 time 和 time2 的时间添加到一个列表中并对其进行排序,但它为某些测试输入添加了太多值。

int max = 1; int count = 1; 
int i = 1; int j = 0; 
long time = arrival[0]; long time2= dep[0];

        while (i < n1 && j < n1) // n1 is the length of the input integer
        {
            if (arrival[i] < dep[j])
            {
                count++;

                if (count >= max)
                {
                    max = count;  
                    time = arrival[i];  
                    time2= dep[j];                 
                }   

        // possible location of console.writeline(time1 + time2)     
        // somewhere here I would add time and time2 to a new list

             i++;              
            }

            else
            {
                count--;
                j++;
            }
        } Console.WriteLine(max); Console.WriteLine(time1 + " " + time2);

假设我的输入是 5 位客人,间隔:(12,30)、(18,25)、(25,40)、(13,15) 和 (32,36) 想要的结果是

2 // 当时最多客人

13 15 // 每个间隔换行

18 30

32 36

但我无法让它工作,它只显示 32-36。如果我将 console.writeline 放在可能的位置,它会给我:13-15、18-25、25-30、32-36。对于具有更多重复项的其他测试输入(例如 0 到 5 在列表中多次出现),它给了我太多的间隔。

【问题讨论】:

  • 请指定时间间隔范围以及您有多少客人。
  • 您有一种称为电话中继线问题的问题,即根据呼叫的峰值数量确定公司所需的中继线数量。多年前,贝尔实验室的计算机科学家致力于解决方案。解决方案是首先为正在使用的时间段创建一个包含 5 分钟时间段的表格。然后通过将呼叫开始的时间段和每 5 分钟的时间段加 1 来处理每个呼叫,直到被呼叫结束。那么调用的峰值数就是表中最高的数。
  • n 个小于 1000000 的客人,时间间隔在 0 秒到 3000000 之间。每个时间间隔都有自己的范围,但可以与其他客人相同。没有设定范围,可以停留 1 秒或 10 秒等。
  • 这将受益于定义一个函数而不是编写控制台代码。输入可以是到达/离开对和特定时间的列表。查看该函数并查看它的输入和输出将更容易理解问题。即使该函数是空的,它也可以让您更轻松地查看正在发生的事情以及您期望返回的内容。
  • @jdweng 你的评论还指什么?

标签: c# algorithm merge intervals overlap


【解决方案1】:

制作数组或结构列表,其中包含所有客人的到达和离开时间以及表示活动类型的+1/-1 标志(+1 表示到达)。

按时间字段排序列表。在平局到达事件的情况下,如果您想以零间隔(一个进入,另一个同时退出)注册两位客人,否则先离开 - 似乎是您的情况。

制作Count = 0MaxCount

浏览列表,将标志字段添加到Count

每个事件后Count的值表示房间中的任务数。

Guests  (12,30), (18,25), (25,40), (13,15) and (32,36)
Events     12;1   13;1   15;-1   18;1   25;-1   25;1  30;-1  32;1   36;-1   40;-1
Count  0      1      2       1      2       1      2      1     2       1       0  
                     ^       x      ^       x      ^      x     ^       x
Max intervals (^-x) 

Count 达到MaxCount - 开始新的输出间隔,当它变为MaxCount - 1 - 完成该间隔并将其添加到OutList

Count 超过MaxCount - 清除OutList,使MaxCount - Count 开始新的输出间隔

最后输出MaxCountOutList的间隔

【讨论】:

  • 我不得不说我喜欢这种方法!我们如何获得请求的输出 (2 13-15 18-30 32-36)?
  • @miloszlakomy ​​我添加了更多描述
  • 很好,我认为算法现在已经完成了。 ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多