algorithm - 间隔相交并找到最小间隔
问题描述
我有一组重叠的间隔 (a,b) 与 <= b => 让我们称之为“A”间隔
和另一组具有 <= b => 的非重叠间隔 (a,b) 让我们称之为“B”间隔
我需要一个“快速”算法来确定 A 中的间隔是多少,其中最小 b 完全在 B 中的任何间隔内。
例如,A =
[1-2]
[1-5]
[1-10]
[1-200]
[15-20]
[16-18]
[18-18]
[210-220]
[218-219]
和 B =
[2-9]
[11-29]
[200-255]
在这种情况下,区间 [15-20]、[16-18]、[18-18]、[210-220] 和 [218-219] 都在 B 区间内。其中,[16-18] 或 [18-18] 的“b”最低,因此这两个间隔中的任何一个都可以。
另外,我对算法的最坏情况感兴趣。也就是说,概率数据结构并不那么有趣。
我一直在研究区间树,但不清楚如何以有效的方式做到这一点。
内存不是问题。
编辑:忘了说:区间是从 0 到 P 的整数。也就是说,[0,P] 是最大的区间。此外,P 通常不是一个“大”数。它可能是 1000。这可能很方便,因为 O(P) 中的算法可能仍然可行。
EDIT2:有了最后一个注释,如果我们为每个数字 [0..P] 存储一个“a”数字堆,则可能使用 O(max(P,log(N)) 算法。需要堆来获取O(1) 中的最大数字。在上面的示例中,每个数字将具有:
0 - {}
1 - {}
2 - {1}
3 - {}
4 - {}
5 - {1}
6 - {}
.
.
.
10 - {1}
18 - {18, 16} -> in a heap, so getting the max is O(1)
20 - {15}
200 - {1}
219 - {218}
220 - {210}
搜索以 B 间隔遍历“允许”的数字。在上面的例子中,通过 2,3,4,5,6,7,8,9,11-29,200-255。这是 O(P)。然后,对于 B 中的每个数字,将堆的最大值与相应区间的“a”进行比较(例如,在“8”中,区间为“2-9”)。由于最大值是在 O(1) 中获得的,因此遍历所有 P 个数是 O(P)。
要添加/修改 B 区间,我们必须遍历所有 P 数字并更新关联的区间,O(P) 也是如此。
要添加/修改 A 间隔,我们必须在堆中添加/修改它,O(log(N)) 也是如此。
如果有人知道更好的算法,请告诉我:)
谢谢
解决方案
推荐阅读
- laravel - Laravel 响应下载在路由中间件和前缀中不起作用
- c# - 在分配“常规”(映射)属性值之后分配 [NotMapped] 属性值
- javascript - Paperjs弹跳动画
- angular - 使用条件的Angular 5绑定模型
- github - GitHub Actions 和 Jenkins 等其他 CI 工具有什么区别?
- javascript - 如何将矩形变成圆形
- c# - 当我运行我的 selenium C# 测试用例时,它失败了,当我调试它时,它通过了,问题是什么?
- wordpress - WAMP 服务器不处理索引文件(而是显示目录列表)
- python - TypeError: 'ParseExample' Op 的输入'serialized' 的 float32 类型与预期的字符串类型不匹配
- java - 升级到 gradle 插件 3.2.1 和 SDK 28 失败