5.2 KiB
title | id | challengeType | videoUrl | localeTitle |
---|---|---|---|---|
Closest-pair problem | 5951a53863c8a34f02bf1bdc | 5 | Problema de par mais próximo |
Description
Forneça uma função para encontrar os dois pontos mais próximos entre um conjunto de pontos dados em duas dimensões, ou seja, para resolver o problema do par de pontos mais Próximo no caso planar.
A solução direta é um algoritmo O (n 2 ) (que podemos chamar de algoritmo de força bruta); o pseudo-código (usando índices) poderia ser simplesmente:
bruteForceClosestPair de P (1), P (2), ... P (N) se N <2 então retorno ∞ outro minDistância ← | P (1) - P (2) | minPoints ← {P (1), P (2)} foreach i ∈ [1, N-1] foreach j ∈ [i + 1, N] if | P (i) - P (j) | <minDistance então minDistância ← | P (i) - P (j) | minPoints ← {P (i), P (j)} fim se endfor endfor return minDistance, minPoints fim se
Um algoritmo melhor é baseado na abordagem recursiva divide & conquer, como explicado também no par de pontos mais próximo da Wikipedia , que é O (n log n); um pseudo-código poderia ser:
paradeiro de (xP, yP) onde xP é P (1). P (N) ordenada por coordenada xe yP é P (1) .. P (N) classificado por coordenada y (ordem crescente) se N ≤ 3 então Retorna os pontos mais próximos do xP usando o algoritmo de força bruta outro xL ← pontos de xP de 1 a ⌈N / 2⌉ xR ← pontos de xP de ⌈N / 2⌉ + 1 a N xm ← xP (⌈N / 2⌉) x yL ← {p yp: p x ≤ xm} y r ← {p yp: p x > xm} (dL, parL) ← mais próximoPara de (xL, yL) (dR, pairR) ← mais proximoPara (xR, yR) (dmin, parMin) ← (dR, pairR) se d <dR então (dmin, parMin) ← (dL, parL) fim se yS ← {p yp: | xm - p x | <dmin} nS ← número de pontos em yS (mais próximo, mais próximo) ← (dmin, pairMin) para i de 1 a ns - 1 k ← i + 1 enquanto k ≤ nS e yS (k) y - yS (i) y <dmin if | yS (k) - yS (i) | <mais próximo então (mais próximo, mais próximo) ← (| yS (k) - yS (i) |, {yS (k), yS (i)}) fim se k ← k + 1 ao final endfor voltar mais próximo, mais próximo fim seReferências e outras leituras: Problema de par de pontos mais próximo Par mais próximo (McGill) Par mais próximo (UCSB) Par mais próximo (WUStL) Par mais próximo (IUPUI)
Para a entrada, esperar o argumento a ser uma matriz de pontos (objectos) com x
e y
membros do conjunto de números. Para a saída, retorne um objeto contendo os pares chave: valor para distance
e pair
(isto é, o par de dois pontos mais próximos).
Instructions
Tests
tests:
- text: <code>getClosestPair</code> é uma função.
testString: 'assert(typeof getClosestPair === "function", "<code>getClosestPair</code> is a function.");'
- text: Distância deve ser o seguinte.
testString: 'assert.equal(getClosestPair(points1).distance, answer1.distance, "Distance should be the following.");'
- text: Pontos devem ser os seguintes.
testString: 'assert.deepEqual(JSON.parse(JSON.stringify(getClosestPair(points1))).pair, answer1.pair, "Points should be the following.");'
- text: Distância deve ser o seguinte.
testString: 'assert.equal(getClosestPair(points2).distance, answer2.distance, "Distance should be the following.");'
- text: Pontos devem ser os seguintes.
testString: 'assert.deepEqual(JSON.parse(JSON.stringify(getClosestPair(points2))).pair, answer2.pair, "Points should be the following.");'
Challenge Seed
const Point = function (x, y) {
this.x = x;
this.y = y;
};
Point.prototype.getX = function () {
return this.x;
};
Point.prototype.getY = function () {
return this.y;
};
function getClosestPair (pointsArr) {
// Good luck!
return true;
}
After Test
console.info('after the test');
Solution
// solution required