整数范围重叠算法

时间:2017-08-07 13:31:36

标签: javascript algorithm logic

我有一个逻辑问题,似乎无法解决这个问题。 我正在使用一组折扣范围,用户可以更改添加或删除我需要验证的重叠值。

例如,我有一个最小和最大整数值数组[{min:0,max:33},{min:33,max:66},{min:66,max:100}]

我需要确定任何给定范围是否相互重叠,但允许范围仅重叠1。范围的数量也是可变的,因此每个数组可能有任意数量的集合。

例如:
[{min: 5, max: 50},{min: 51, max: 66},{min: 66, max: 100}]true  应评估为[{min: 0, max: 34},{min: 33, max: 66},{min: 66, max: 100}],因为重叠范围只有1。

[{min: 0, max: 33},{min: 32, max: 66},{min: 66, max: 100}] 要么 false应评估为var overlappedRanges = [{ min: 0, max: 33 }, { min: 33, max: 66 }, { min: 66, max: 100 }]; var nonOverlappedRanges = [{ min: 0, max: 32 }, { min: 33, max: 66 }, { min: 67, max: 100 }]; var checkForOverlap = function(arr) { var err = false; arr.forEach(function(e, i) { arr.forEach(function(ee, ii) { if (ee !== e) { if (e.min >= ee.min && e.min <= ee.max) { err = true; } if (e.max >= ee.min && e.max <= ee.max) { err = true; } } }); }); if (err) { return 'Overlap Found in ' + JSON.stringify(arr); } else { return 'NO Overlap Found in ' + JSON.stringify(arr); } } $('#overlapped').text(checkForOverlap(overlappedRanges)); $('#notOverlapped').text(checkForOverlap(nonOverlappedRanges)),因为范围重叠超过1。

以下工作可以找到重叠,但不允许重叠1.

&#13;
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="overlapped" style="color: red;"></span>
<br>
<span id="notOverlapped" style="color: green;"></span>
&#13;
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text"+ i, "populateDecor('" + id + "','" + name + "','" + details + "','" + servicesOffered + "', '" + imagePath + "');", true);
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:1)

您可以通过将每个范围相互比较来实现这一目标。

function checkRangeOverlap(ranges){
    var n = ranges.length // store length for performance gains

    for(var i=0;i<n;i++){
        for(var u=0;u<n;u++){
            if(i==u) // skip if comparing the same range
                continue

            var rangeA = ranges[i]
            var rangeB = ranges[u]

            if(rangeA.min < rangeB.max && rangeA.max > rangeB.min) // if the ranges intersect
                return false
        }
    }

    return true // no intersections found
}

答案 1 :(得分:1)

您可以通过基于最小值对数组进行排序,并将当前元素的最大值与下一个元素的min进行比较来实现此目的。

&#13;
&#13;
var kf =  [{min: 0, max: 34},{min: 33, max: 66},{min: 66, max: 100}];
var kt =  [{min: 0, max: 33},{min: 33, max: 66},{min: 66, max: 100}];



kf.sort(function(a, b) {
    return parseFloat(a.min) - parseFloat(b.min);
});

kt.sort(function(a, b) {
    return parseFloat(a.min) - parseFloat(b.min);
});

var isvalid = function(k){
    for (var i=0, l=k.length; i<l-1; i++) 
    { 
 if(k[i].max - k[i+1].min > 0)
 return false;
} 
return true;
}

console.log(isvalid(kf));

console.log(isvalid(kt));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

谢谢你们的帮助。非常感谢。

只是一个使用forEach循环的更新,就像你对循环有用的一样。

&#13;
&#13;
let rangeArr =  [{min: 0, max: 33},{min: 33, max: 66},{min: 66, max: 100}];

let checkRangeOverlap = (ranges) => {
	let err = false;
    ranges.forEach(function(a,ia){

        ranges.forEach(function(b,ib){
            if(a !== b){
                if(a.min < b.max && a.max > b.min){
					 err = true;
				}
                   
            }
        });
        
    });
	return err;
}

console.log(checkRangeOverlap(rangeArr), JSON.stringify(rangeArr));

rangeArr =  [{min: 0, max: 33},{min: 33, max: 67},{min: 66, max: 100}];

console.log(checkRangeOverlap(rangeArr), JSON.stringify(rangeArr));
&#13;
&#13;
&#13;