Привет эксперты!
Вопрос: имеется массив пересекающихся интервалов:
var ranges = [{<br/>
"from": 0,<br/>
"to": 100<br/>
}, {<br/>
"from": 50,<br/>
"to": 200<br/>
}, {<br/>
"from": 0,<br/>
"to": 100<br/>
}, {<br/>
"from": 70,<br/>
"to": 200<br/>
}, {<br/>
"from": 90,<br/>
"to": 300<br/>
}];
Мне необходимо сконвертировать его в массив не пересекающихся интервалов, т. е.:
var nonOverlapping = splitRanges(ranges);<br/>
<br/>
/*<br/>
nonOverlapping = [{<br/>
"from": 0,<br/>
"to": 49<br/>
}, {<br/>
"from": 50,<br/>
"to": 69<br/>
}, {<br/>
"from": 70,<br/>
"to": 89<br/>
}, {<br/>
"from": 90,<br/>
"to": 100<br/>
}, {<br/>
"from": 101,<br/>
"to": 200<br/>
}, {<br/>
"from": 201,<br/>
"to": 300<br/>
}]<br/>
*/
У меня есть функция которая выполняет это, но использует она так называемый «naive approach» (крайне неэффективное решение):
function splitRanges(ranges) {<br/>
var repeat, length, i, j;<br/>
var rangeA, rangeB, intersection;<br/>
do {<br/>
repeat = false;<br/>
length = ranges.length;<br/>
for (i = 0; i < length; i++) {<br/>
rangeA = ranges[i];<br/>
for (j = i + 1; j < length; j++) {<br/>
rangeB = ranges[j];<br/>
if (isIntersectingRanges(rangeA, rangeB)) {<br/>
repeat = true;<br/>
ranges.splice(i, 1);<br/>
intersection = splitRange(rangeA, rangeB);<br/>
while (intersection.length) {<br/>
ranges.push(intersection.shift());<br/>
}<br/>
}<br/>
if (repeat) break;<br/>
}<br/>
if (repeat) break;<br/>
}<br/>
} while (repeat);<br/>
}
Мог бы кто — нибудь помочь мне переписать это так чтобы решение было оптимальным с точки зрения быстродействия?