Как найти уникальные пары четырехъядерного дерева?

#javascript #arrays #performance #data-structures #quadtree

#javascript #массивы #Производительность #структуры данных #quadtree

Вопрос:

Я использую структуру данных четырехъядерного дерева для поиска близлежащих объектов на 2D плоскости. Я уже реализовал рабочее четырехъядерное дерево, которое возвращает массив для каждого объекта, включая всех его соседей. Проблема в том, что мне нужна каждая уникальная пара объектов из этой группы списков.

Допустим, у меня есть следующие точки [a, b, c, d] в массиве. И это:

a находится рядом с b,

b находится рядом с c,

c находится рядом с d,

Поэтому,

a НЕ находится рядом с c или d,

b НЕ находится рядом с d,

c НЕ находится рядом с a,

d НЕ находится рядом с a или b,

Поэтому, перебирая каждый объект и запрашивая его соседей, я получу следующий массив, где каждый элемент является собственным массивом, где первый элемент является рассматриваемым объектом, а каждый другой элемент — его соседями:

 [
  [a, b],       // a is only near b
  [b, a, c],    // So b is near c and also a
  [c, b, d],    // So c is near b and also d
  [d, c]        // d is only near c
]
  

Я хочу массив, содержащий только уникальные пары соседних объектов (например, наличие обоих [a, b] и [b, a] неприемлемо), и поэтому в этом случае решение было бы:

 [
  [a, b],
  [b, c],
  [c, d]
]
  

Как я могу достичь этого результата?

Также мы были бы очень признательны, если бы код был максимально оптимизирован. Большое вам спасибо!

Комментарии:

1. Покажите минимальный рабочий пример, в котором вам нужна помощь.

2. @DominiqueFortin Я не совсем уверен, что вы имеете в виду. Я не могу действительно показать codepen, поскольку само quadtree слишком сложно реализовать. Я просто прошу функцию для фильтрации массива из [[a, b], [b, a, c], [c, b, d], [d, c]] в [[a, b], [b, c], [c, d]].

3. Вы должны обратиться к Stackoverflow за помощью по чему-то конкретному, что вы создали, а не просить кого-то что-то закодировать для вас.

4. @DominiqueFortin Я уверен, что решение моей проблемы на самом деле довольно простая функция Array.filter или что-то в этом роде, но я не могу понять, как это сделать. Я закодировал это четырехъядерное дерево и объекты, но все это часть гораздо большей программы, которая не поместится в примере codepen, даже если вы не хотите давать мне какой-либо код, вы могли бы, по крайней мере, указать мне направление. Так что это конкретно, я просто задаю вопрос, как это делают все остальные. Я посмотрю, смогу ли я сделать небольшой пример кода…

5. Нет, это не просто. Возможно, используя reduce, но я не уверен.

Ответ №1:

Я больше думал об этих строках

 let unsortedArray = [
  ['a', 'b'],
  ['b', 'a', 'c'],
  ['c', 'b', 'd'],
  ['d', 'c']
];

function solver(arr) {
  let marked = {};
  let result = [];
  
  arr.forEach((arcs) => {
    let first;
    arcs.forEach((vertex, i) =>{
      if (i === 0 ) {
        first = vertex;
      } else {
        let forward = first vertex, backward = vertex first;

        if (!marked.hasOwnProperty(forward) amp;amp; !marked.hasOwnProperty(backward)) {
          result.push([first, vertex]);
        }
        marked[forward] = 0;
        marked[backward] = 0;
      }
    });
  });
  
  return resu<
}

console.log(solver(unsortedArray));  

Ответ №2:

Я решил сортировку, но это довольно дорого с точки зрения вычислений, если кто-нибудь знает, как сократить этот код, я был бы очень признателен!

 let unsortedArray = [
  ['a', 'b'],
  ['b', 'a', 'c'],
  ['c', 'b', 'd'],
  ['d', 'c']
];

function solver(arr) {
  // Detach first elements
  let groups = [];
  for (let i = 0; i < arr.length; i  ) {
    let body = arr[i].shift();
    groups[i] = {body, others: arr[i]};
  }
  // Get all pairs
  let pairs = [];
  for (let i = 0; i < groups.length; i  ) {
    for (let j = 0; j < groups[i].others.length; j  ) {
      let pair = [groups[i].body, groups[i].others[j]];
      pairs.push(pair);
    }
  }
  // Filter non unique pairs
  for (let i = 0; i < pairs.length; i  ) {
    for (let j = i   1; j < pairs.length; j  ) {
      if (pairs[i] == pairs[j] || (pairs[i][0] == pairs[j][1] amp;amp; pairs[i][1] == pairs[j][0])) {
        pairs.splice(j, 1);
      }
    }
  }
  return pairs;
}

let sortedArray = solver(unsortedArray);
console.log(sortedArray);