【发布时间】:2014-03-09 10:20:33
【问题描述】:
如果我有以下数组,每个元素代表整数范围对:
var a = [[0, 47], [50, 51], [53, 53], [55, 55], [58, 97], [101, 101], [103, 1114111]];
var b = [[48, 57], [97, 102]];
我正在使用this code 计算交集:
var output = [];
for (var i = 0; i < a.length; ++i) {
for (var j = 0; j < b.length; ++j) {
var intersection = [
Math.max(a[i][0], b[j][0]),
Math.min(a[i][1], b[j][1]), ];
if (intersection[0] <= intersection[1]) {
output.push(intersection)
}
}
}
console.log(JSON.stringify(output));
[ [ 50, 51 ], [ 53, 53 ], [ 55, 55 ], [ 97, 97 ], [ 101, 101 ] ]
我还需要计算差异(所有值 0..1114111,除了上面相交的范围)。
这样做的有效方法是什么?
【问题讨论】:
-
你试过那个代码了吗?发生了什么/问题出在哪里?您期待什么结果?
-
@Xotic750 它是 O(n^2),其中 O(n log n) 是可能的。
-
你需要明确你需要的算法应该做什么。请不要包含解决不同问题的代码?这很混乱
-
@Alix 不,您不能在 O (n log n) 中进行交叉交叉,因为输出可能大于此值。目前尚不清楚您所说的“差异”是什么意思。你的意思是all-to-all在这里吗?我在问 bc “我怎样才能找到不拦截任何数组的所有范围?”听起来完全不同,与您的代码示例完全无关
-
@Alix:“所有值 0..1114111 除了上面相交的范围”是微不足道的,只需遍历间隔列表
(l_1, r_1), (l_2, r_2), ...并输出(r_1, l_2), (r_2, l_3), ...。你会问这个让我很困惑。您遇到的问题真的不同吗?
标签: javascript algorithm set set-intersection set-difference