--- title: Closest-pair problem id: 5951a53863c8a34f02bf1bdc challengeType: 5 videoUrl: '' localeTitle: Problema de par mais próximo --- ## Description
Tarefa:

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 se
Referê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
```yml tests: - text: getClosestPair é uma função. testString: 'assert(typeof getClosestPair === "function", "getClosestPair 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
```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 ```