【问题标题】:Merge sets of overlapping time periods into new one将一组重叠的时间段合并为一个新的时间段
【发布时间】:2017-07-14 18:20:30
【问题描述】:

在 node.js 中,将多组给定时间段合并为一组表示重叠时间段的好且有效的方法是什么?期间提供为开始日期和结束日期。

4 sets of time intervals (days):

 (-------------------------)         (---------)                (---)
                       (------------------------)           (-------)
                 (--------)            (-------)                (----)
       (---------------------)     (---------)     (---)      (-----------)

New set representing overlaps:

                       (--)            (-----)                  (---)

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 我将时间段表示为一个数组,每个项目都有一个特定的日期:["20170714", "20170715"],然后一次与两个数组相交(参见here)。合并所有集合后,您必须找到一种将数组转换为实际时间跨度的方法。
  • @JuanStiza Lodash intersect 不是我们需要的
  • @Bergi 你是对的!
  • 似乎还有一个附加条件,即每个集合中必须有重叠。如果您提供示例输入和输出以及您尝试过的内容,将会有很大帮助。就目前而言,这是一个关于通用算法的问题,它并不特定于任何特定的语言或库。

标签: javascript node.js date momentjs


【解决方案1】:

将所有开始和结束时间戳合并到一个列表中(存储时间戳以及它是开始还是结束) - 如果您有很多集合,可以天真地或使用 more efficient algorithm

  (-------------------------)         (---------)                (---)
                        (------------------------)           (-------)
                  (--------)            (-------)                (----)
        (---------------------)     (---------)     (---)      (-----------)

  (     (         (     (  )) )     ( ( (     ))))  (   )    ( (((   )))   )

然后使用简单的随时间递增/递减扫描:

0 -                                              ----   ------             ---
1 (------                     -------           -)  (---)    (--      -----)
2       (----------         --)     (--         )              (-    -)
3                 (------  -)         (--     --)                (   )
4                       (--)            (-----)                  (---)

并收集计数最大的那些区间。

                        ^^^^^           ^^^^^^^                  ^^^^^

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2015-05-10
    • 2013-06-10
    • 2022-11-08
    相关资源
    最近更新 更多