5.4 KiB
title | id | challengeType | videoUrl | localeTitle |
---|---|---|---|---|
Closest-pair problem | 5951a53863c8a34f02bf1bdc | 5 | Problema de par más cercano |
Description
Proporcione una función para encontrar los dos puntos más cercanos entre un conjunto de puntos dados en dos dimensiones, es decir, para resolver el problema del par de puntos más cercano en el caso plano.
La solución directa es un algoritmo O (n 2 ) (que podemos llamar algoritmo de fuerza bruta); El pseudocódigo (utilizando índices) podría ser simplemente:
bruteForceClosestPair de P (1), P (2), ... P (N) si N <2 entonces volver ∞ más minDistance ← | P (1) - P (2) | minPuntos ← {P (1), P (2)} foreach i ∈ [1, N-1] foreach j ∈ [i + 1, N] si | P (i) - P (j) | <minDistance entonces MinDistance ← | P (i) - P (j) | minPuntos ← {P (i), P (j)} terminara si endfor endfor volver minDistance, minPoints terminara si
Un mejor algoritmo se basa en el enfoque recursivo de divide y vencerás, como se explica también en el problema del par de puntos más cercanos de Wikipedia , que es O (n log n); Un pseudocódigo podría ser:
closestPair de (xP, yP) donde xP es P (1) ... P (N) ordenada por la coordenada x, y yP es P (1). P (N) ordenado por coordenada y (orden ascendente) si N ≤ 3 entonces devolver los puntos más cercanos de xP utilizando el algoritmo de fuerza bruta más xL ← puntos de xP de 1 a ⌈N / 2⌉ xR ← puntos de xP de ⌈N / 2⌉ + 1 a N xm ← xP (⌈N / 2⌉) x yL ← {p ∈ yP: p x ≤ xm} yR ← {p ∈ yP: p x > xm} (dL, pairL) ← closestPair de (xL, yL) (dR, pairR) ← closestPara de (xR, yR) (dmin, pairMin) ← (dR, pairR) si dL <dR entonces (dmin, pairMin) ← (dL, pairL) terminara si yS ← {p ∈ yP: | xm - p x | <dmin} nS ← número de puntos en yS (el más cercano, el par más cercano) ← (dmin, pairMin) para i de 1 a nS - 1 k ← i + 1 mientras que k ≤ nS y yS (k) y - yS (i) y <dmin si | yS (k) - yS (i) | <más cercano entonces (más cercano, par más cercano) ← (| yS (k) - yS (i) |, {yS (k), yS (i)}) terminara si k ← k + 1 al final endfor volver mas cercano, mas cercano par terminara siReferencias y lecturas adicionales: Par de problemas más cercano Par más cercano (McGill) Par más cercano (UCSB) Par más cercano (WUStL) Par más cercano (IUPUI)
Para la entrada, espere que el argumento sea una matriz de objetos (puntos) con los miembros x
e y
establecidos en números. Para la salida, devuelva un objeto que contenga los pares clave: valor para la distance
y el pair
(es decir, el par de dos puntos más cercanos).
Instructions
Tests
tests:
- text: <code>getClosestPair</code> es una función.
testString: 'assert(typeof getClosestPair === "function", "<code>getClosestPair</code> is a function.");'
- text: La distancia debe ser la siguiente.
testString: 'assert.equal(getClosestPair(points1).distance, answer1.distance, "Distance should be the following.");'
- text: Los puntos deben ser los siguientes.
testString: 'assert.deepEqual(JSON.parse(JSON.stringify(getClosestPair(points1))).pair, answer1.pair, "Points should be the following.");'
- text: La distancia debe ser la siguiente.
testString: 'assert.equal(getClosestPair(points2).distance, answer2.distance, "Distance should be the following.");'
- text: Los puntos deben ser los siguientes.
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