matlab - 几个区间范围的快速交集?
问题描述
我有几个变量,所有这些都是数字范围:(行中的间隔)
a = [ 1 4; 5 9; 11 15; 20 30];
b = [ 2 6; 12 14; 19 22];
c = [ 15 22; 24 29; 33 35];
d = [ 0 3; 15 17; 23 26];
(我的真实数据集中的值不是整数,但为了清楚起见,在这里表示)。
我想找到至少 3 个变量相交的区间。在上面的例子中,[20 22] 和 [24 26] 就是两种这样的情况。
解决此问题的一种方法是将我的值分箱并将这些分箱添加在一起,但由于我的值是连续的,这会产生“边缘效应”,而且我会首先浪费时间来分箱这些值。(以我想要的分辨率对我的数据集进行分箱会产生数百 GB 的数据)。
另一种不涉及分箱的方法是在所有可能的变量组合之间使用成对的交集(我们称之为 X),然后是 X 与所有其他变量 O(n^3) 的交集。
您对此有何看法?是否有具有解决此问题的工具的算法/库?
我正在考虑使用某种几何方法来解决这个问题:基本上,如果我认为我的区间是一维空间中的段,那么我想要的输出将是三个段(来自三个变量)相交的点。我不确定这在算法上是否有效。建议?
解决方案
O(N lg N) 方法:
将每个区间 (t_A, t_B) 转换为一对标记端点 ('begin', t_A), ('end', t_B)
按时间对所有端点进行排序,这是最昂贵的步骤
进行一次遍历,跟踪嵌套深度(如果标签是“开始”则增加,如果标签是“结束”则减少)。这需要线性时间。
- 当深度从 2 变为 3 时,就是输出间隔的开始。
- 当它从 3 变为 2 时,它是一个区间的结束。
推荐阅读
- c# - 是否可以在使用标准 e.graphics.drawstring 方法时使用端口和 IP 地址打印到打印机?
- google-apps-script - 获取 BigQuery 以读取驱动器文件夹中的所有 CSV 文件(相同架构)
- spring-boot - 在 Hibernate 中如何忽略选择中的关联表
- php - 不知道为什么我的程序不工作?(将 API 数据存储到 mySQL)
- python - 如何根据列表中的特定字符集从列表中的字符串中删除第一个和最后一个字符。(Python)
- postgresql - 如何在 postgresql 中保持现有字段完整的同时更新 jsonb 列
- javascript - 如何使用 nodejs / express 在同一端点中使用 GET 和 POST 方法
- azure-sdk-python - 如何获取详细的 VM 大小信息
- algorithm - 为什么 BFS 的复杂度是 O(V+E) 而不是 O(E)?
- vscode-extensions - 在 VSC 集成终端中无法识别 Python