Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.10.2021, 10:49
Новичок на форуме
Отправить личное сообщение для valya2021 Посмотреть профиль Найти все сообщения от valya2021
 
Регистрация: 15.10.2021
Сообщений: 5

Проставить правильно order
У меня есть массив объектов https://codesandbox.io/s/js-playgrou...=/src/index.js

нужно проставить каждому order так, чтобы отрезки не пересекались
пример на картинке


https://prnt.sc/1w8175p
Ответить с цитированием
  #2 (permalink)  
Старый 15.10.2021, 11:13
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

valya2021,
каковы приоритеты? первым шагом напрашивается сортировка по нижней границе, но тогда в самый верхний ордер попадут отрезки 2 и 4. Это допустимо?
правильно я понимаю, что надо как можно меньше ордеров?
Ответить с цитированием
  #3 (permalink)  
Старый 15.10.2021, 11:17
Новичок на форуме
Отправить личное сообщение для valya2021 Посмотреть профиль Найти все сообщения от valya2021
 
Регистрация: 15.10.2021
Сообщений: 5

нужно разместить как можно больше отрезков на одной прямой (Y)
если отрезки пересекаться нужно следующий переместить на низ (Y+1)
Ответить с цитированием
  #4 (permalink)  
Старый 15.10.2021, 11:19
Новичок на форуме
Отправить личное сообщение для valya2021 Посмотреть профиль Найти все сообщения от valya2021
 
Регистрация: 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
    }
}
Ответить с цитированием
  #5 (permalink)  
Старый 15.10.2021, 11:25
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

навскидку тут всё просто: сортируем отрезки по левому краю. Далее держим приоритетную очередь ордеров (на вершине - тот ордер, у которого левее других правый край последнего отрезка). Обходим отсортированный массив, берем из него очередной отрезок. Если у этого отрезка левый край вписывается в ордер из вершины очереди, то добавляем в этот ордер, просеиваем ордер вниз. Если не вписывается, создаем новый ордер, добавляем в него отрезок, ордер добавляем в очередь. Время работы O(N ln(N)).
Осталось закодить)
Ответить с цитированием
  #6 (permalink)  
Старый 15.10.2021, 11:29
Новичок на форуме
Отправить личное сообщение для valya2021 Посмотреть профиль Найти все сообщения от valya2021
 
Регистрация: 15.10.2021
Сообщений: 5

вот у мене и проблема это все закодить(
забыл сказать, сортировка возможна только по x1

Последний раз редактировалось valya2021, 15.10.2021 в 11:33.
Ответить с цитированием
  #7 (permalink)  
Старый 15.10.2021, 12:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

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.
Ответить с цитированием
  #8 (permalink)  
Старый 15.10.2021, 13:27
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

<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>
Ответить с цитированием
  #9 (permalink)  
Старый 15.10.2021, 13:50
Новичок на форуме
Отправить личное сообщение для valya2021 Посмотреть профиль Найти все сообщения от valya2021
 
Регистрация: 15.10.2021
Сообщений: 5

всем спасибо!!!
Все работает
Ответить с цитированием
  #10 (permalink)  
Старый 15.10.2021, 15:31
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,704

Не....
Ни фига не работает.
<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 отрезка на прямой.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Error: ER_BAD_FIELD_ERROR: Unknown column 'priсe' in 'order clause' riaron Node.JS 1 16.09.2020 23:27
Как правильно прочитать запрос? gsdev99 Node.JS 3 30.06.2019 04:15
Сортировка массива с объектами на javascript sergiu920 Элементы интерфейса 2 07.12.2018 09:47
как правильно обращаться к свойствам объект внутри самого объекта ? mitiya Общие вопросы Javascript 12 25.04.2015 21:18
Adobe Acrobat Reader 9 Pro cheap order online Rodivazzio Элементы интерфейса 0 04.07.2009 02:55