--- title: Closest-pair problem id: 5951a53863c8a34f02bf1bdc challengeType: 5 videoUrl: '' localeTitle: Problema de par más cercano --- ## Description
Tarea:

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 si
Referencias 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
```yml tests: - text: getClosestPair es una función. testString: 'assert(typeof getClosestPair === "function", "getClosestPair 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
```js 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
```js console.info('after the test'); ```
## Solution
```js // solution required ```