对位于另一个单独范围内的范围求和的算法

时间:2018-06-21 08:46:01

标签: javascript algorithm sum range

我有两组范围,一组是任意长度的单个范围(A),另一组是一组范围(B),其中某些范围或部分范围可能位于或不位于单个范围(A)内。

我需要计算(B)范围内的全部或部分范围之和,该范围在单个范围(A)内。

我正在使用Javascript。

示例:

A = [20,40]<br>
B = [14,22],[24,27],[31,35],[38,56]<br>
Result = 2+3+4+2 = 11<br>

A = [120,356]<br>
B = [234,567]<br>
Result = 122<br>

我需要一个可以返回结果总和的算法/函数。

我使用了以前在此处发布的一种出色的范围合并算法,希望能对此问题提供类似的优雅解决方案。

(如果有误会,请致以歉意。 我一直在研究函数,但是我在编码环境中的数学不好,所以我的解决方案是使用非数学代码(将其张贴在这里真是令人尴尬!)。我希望能在这里得到一些帮助,以创建一个基于数学的紧凑型解决方案)

2 个答案:

答案 0 :(得分:1)

这是我使用的ES5兼容版本,供有兴趣的人使用:

function getDelta(range, values) {
    return values.reduce(function(s,pair){
        return s + Math.max(0, Math.min(pair[1], range[1]) - Math.max(pair[0], range[0]));
    },0);
}

但是,只有在需要IE向后兼容的情况下,我才使用它。我的工作环境与时俱进!

答案 1 :(得分:-1)

您可以获取子范围的差值,并在给定范围内调整开始和结束值。

function getDelta([start, end], values) {
    return values
        .filter(([l, r]) => r >= start &&  l <= end)
        .reduce((s, [l, r]) => s + Math.min(r, end) - Math.max(l, start), 0);
}

console.log(getDelta([20, 40], [[10, 11], [14, 22], [24, 27], [31, 35], [38, 56], [400, 500]]));
console.log(getDelta([120, 356], [[10, 11], [234, 567], [400, 500]]));

根据 ChatterOne 在评论中的建议,您可以将Math.max与零一起使用以防止出现负值。

function getDelta([start, end], values) {
    return values
        .reduce((s, [l, r]) => s + Math.max(0, Math.min(r, end) - Math.max(l, start)), 0);
}

console.log(getDelta([20, 40], [[10, 11], [14, 22], [24, 27], [31, 35], [38, 56], [400, 500]]));
console.log(getDelta([120, 356], [[10, 11], [234, 567], [400, 500]]));