![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 11:13
|
![Аватар для Alexandroppolus](https://javascript.ru/forum/image.php?u=49879&dateline=1530205757) |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
valya2021,
каковы приоритеты? первым шагом напрашивается сортировка по нижней границе, но тогда в самый верхний ордер попадут отрезки 2 и 4. Это допустимо?
правильно я понимаю, что надо как можно меньше ордеров?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 11:17
|
Новичок на форуме
|
|
Регистрация: 15.10.2021
Сообщений: 5
|
|
нужно разместить как можно больше отрезков на одной прямой (Y)
если отрезки пересекаться нужно следующий переместить на низ (Y+1)
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 11:19
|
Новичок на форуме
|
|
Регистрация: 15.10.2021
Сообщений: 5
|
|
вот код. Но не все кейсы покрывает(
let order = 0
data.map((item, index) => {
if (index > 0 && data[index - 1].x2 >= item.x1) {
order += 1
} else {
order = 0
}
}
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 11:25
|
![Аватар для Alexandroppolus](https://javascript.ru/forum/image.php?u=49879&dateline=1530205757) |
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
навскидку тут всё просто: сортируем отрезки по левому краю. Далее держим приоритетную очередь ордеров (на вершине - тот ордер, у которого левее других правый край последнего отрезка). Обходим отсортированный массив, берем из него очередной отрезок. Если у этого отрезка левый край вписывается в ордер из вершины очереди, то добавляем в этот ордер, просеиваем ордер вниз. Если не вписывается, создаем новый ордер, добавляем в него отрезок, ордер добавляем в очередь. Время работы O(N ln(N)).
Осталось закодить)
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 11:29
|
Новичок на форуме
|
|
Регистрация: 15.10.2021
Сообщений: 5
|
|
вот у мене и проблема это все закодить(
забыл сказать, сортировка возможна только по x1
Последний раз редактировалось valya2021, 15.10.2021 в 11:33.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 12:03
|
![Аватар для рони](https://javascript.ru/forum/image.php?u=7416&dateline=1372796129) |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,134
|
|
valya2021,
<pre>
<script>
const data = [{
x1: 1,
x2: 4,
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
}
];
let arr = Object.keys(data);
let order = 1;
while (arr.length) {
let min = data[arr[0]].x1;
for (let i = 0; i < arr.length;) {
let k = arr[i];
let {
x1,
x2
} = data[k];
if (x1 >= min) {
data[k].order = order;
min = x2;
arr.splice(i, 1);
} else i++
}
order++;
}
document.write(JSON.stringify(data, "", 1))
</script></pre>
Последний раз редактировалось рони, 15.10.2021 в 12:06.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 13:27
|
![Аватар для voraa](https://javascript.ru/forum/image.php?u=69123&dateline=1640150450) |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,754
|
|
<pre>
<script>
const data = [{
x1: 1,
x2: 4,
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
}
];
let orders = [];
data.forEach ( (x, i) => {
let no = orders.findIndex (o => o.every (ot => data[ot].x1>=x.x2 || data[ot].x2 <= x.x1) );
if (no>=0)
orders[no].push(i);
else
no = orders.push([i]) - 1;
x.order = no;
} )
document.write(JSON.stringify(data, "", 1))
</script>
</pre>
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 13:50
|
Новичок на форуме
|
|
Регистрация: 15.10.2021
Сообщений: 5
|
|
всем спасибо!!!
Все работает
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.10.2021, 15:31
|
![Аватар для voraa](https://javascript.ru/forum/image.php?u=69123&dateline=1640150450) |
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,754
|
|
Не....
Ни фига не работает.
<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
}
];
let orders = []
data.forEach ((x, i) => {
let no = orders.findIndex (o => o.every (ot => data[ot].x1>=x.x2 || data[ot].x2 <= x.x1) );
if (no>=0)
orders[no].push(i);
else
no = orders.push([i]) - 1;
x.order = no;
}
)
document.write(JSON.stringify(data, "", 1))
</script>
</pre>
Есть условие
Сообщение от valya2021
|
нужно разместить как можно больше отрезков на одной прямой
|
Можно назначить order = 0 (у Рони 1) трем отрезкам 0, 2 и 5
А отрезку 1 - order = 1.
А наши алгоритмы размещают максимум 2 отрезка на прямой.
|
|
|
|