если прям нужно получить максимум отрезков не одной из ордеров, то можно так:
<pre> <script> const data = [ { x1: 1, x2: 4, order: 0 }, { // Добавил этот x1: 5, x2: 11, order: 0 }, { x1: 7, x2: 10, order: 0 }, { x1: 5, x2: 8, order: 0 }, { x1: 10, x2: 13, order: 0 }, { x1: 8, x2: 11, order: 0 }, { x1: 8, x2: 11, order: 0 } ]; function updateOrders(data) { if (!data || !data.length) { return; } const arr = data.slice().sort((a, b) => a.x2 - b.x2); let order = 1; while (arr.length) { let lastX2 = -Infinity; let p = 0; for (let i = 0; i < arr.length; ++i) { const item = arr[p] = arr[i]; if (item.x1 >= lastX2) { lastX2 = item.x2; item.order = order; } else { p++; } } arr.length = p; order++; } } updateOrders(data); document.write(JSON.stringify(data, "", 2)) </script> </pre> но тут уже асимптотика в худшем случае будет O(N^2). сортируем по х2, далее обходим массив и заполняем первый ордер (заполненные выкидываются из отсортированного массива). Если массив не опустел, повторяем. Худший случай - когда будет N ордеров, по одному в каждом: каждый раз, добавив первый поинт в ордер, придется бесполезно обойти все другие оставшиеся поинты. |
Часовой пояс GMT +3, время: 03:10. |