【问题标题】:find intervals not in tree查找不在树中的区间
【发布时间】:2012-09-12 13:28:18
【问题描述】:

我有一堆可能重叠的(日期)间隔。间隔来自不同的来源。我想“展平”这个“时间线”,然后找到没有间隔的所有间隔。

如果你看:http://www.dgp.toronto.edu/people/JamesStewart/378notes/22intervals/ 到“一个更复杂的例子”部分。因此,我想找到没有作曲家在世的区间。

我该怎么做?你将如何在 PHP 中实现这样的事情? PHP是否也有一些简单的建树功能?

谢谢!

编辑 我的输入是一些数组(2、3 或 4),每个数组都包含开始和停止日期,如下所示:

 $myarray1[0]['start']['date'] = 'somedate'
 $myarray1[0]['stop']['date'] = 'somedate'
 $myarray1[1]['start']['date'] = 'somedate'
 $myarray1[1]['stop']['date'] = 'somedate'
 $myarray1[2]['start']['date'] = 'somedate'
 $myarray1[2]['stop']['date'] = 'somedate'

myarray2、myarray3 等也是如此

【问题讨论】:

  • 顺便说一句:Franz Shubert 的生日是错误的。应该是 1797,而不是 1779。
  • 可以看下面stackoverflow.com/q/748516/1088243了解算法。您不需要构建一棵树,而只需要一个哈希,它用较小的整数对较小的日期进行哈希处理。

标签: algorithm interval-tree


【解决方案1】:

基本算法

为每个作曲家创建两个对象。一个是带有作曲家姓名和出生年份的出生对象。另一个是死亡对象,同样带有作曲家的名字和死亡年份。

现在将这些对象排序在一起。

保留一个int,初始化为0 for num_composers_alive

遍历对象的有序列表。每次遇到出生对象时,增加num_composers_alive。每次遇到死亡对象,减一num_composers_alive

在递增或递减时,每次遇到死亡和递减时,检查num_composers_alive 是否变为 0。如果是,则您刚刚进入了一个没有作曲家活着的时期。输出该数字或将其存储在某处。每次您遇到出生和增量时,检查num_composers_alive 现在是否为 1。如果是,您刚刚结束了一个没有作曲家在世的时期。输出该数字或将其存储在某处。

实施

这将取决于您的输入和输出的形式。我不相信 PHP 有树的原生概念,但我可能错了。尝试实施上述方法,如果遇到困难,请打开一个单独的问题。

说实话,我不确定为什么需要树来解决上述问题,但也许是为了别的。

【讨论】:

  • 我也不确定我是否需要树,但更线性时间的方法也变得非常混乱(而且效率相当低)。你还有什么建议?
  • 这不是乱七八糟的。排序步骤通常需要 N log N,这对于基于树的事物是相同的。
【解决方案2】:

一个简单的算法步骤

  1. 定义一个将日期对象转换为整数(反之亦然)的函数。这是您可能需要优化翻译以使所有数字尽可能小的地方。过去的日期必须比未来的日期小

  2. 初始化数字数组。将所有位设置为0。确保数组的大小与最大的日期数匹配(从第 1 步开始)。

  3. 遍历日期范围

  4. 1s 标记数组中的日期范围。 使用转换为数字的日期(第 1 步)作为数组中的索引。

  5. 将所有带有0s 的索引转换回日期间隔。

运行时复杂度 O(N)。空间复杂度 O(N)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多