--- title: Closest-pair problem id: 5951a53863c8a34f02bf1bdc challengeType: 5 videoUrl: '' localeTitle: Проблема ближайшей пары --- ## Description
Задача:

Предоставить функцию для поиска ближайших двух точек среди множества заданных точек в двух измерениях, т. Е. Решить задачу Ближайшей пары точек в плоском случае.

Прямым решением является алгоритм O (n 2 ) (который мы можем назвать алгоритмом грубой силы); псевдокод (с использованием индексов) может быть простым:

 bruteForceClosestPair из P (1), P (2), ... P (N)
если N <2, то
  return ∞
еще
  minDistance ← | P (1) - P (2) |
  minPoints ← {P (1), P (2)}
  foreach i ∈ [1, N-1]
    foreach j ∈ [i + 1, N]
      если | P (i) - P (j) | <minDistance тогда
        minDistance ← | P (i) - P (j) |
        minPoints ← {P (i), P (j)}
      ENDIF
    ENDFOR
  ENDFOR
  return minDistance, minPoints
ENDIF

Лучший алгоритм основан на подходе рекурсивного разделения и покорения, как это объясняется также в самой близкой проблеме точек Википедии , которая является O (n log n); псевдокод может быть:

 ближайшая пара (xP, yP)
  где xP - P (1) .. P (N), отсортированная по координате x, и
  yP - P (1). P (N), отсортированный по координате y (по возрастанию)
если N ≤ 3, то
  возвращать ближайшие точки xP с использованием алгоритма грубой силы
еще
  xL ← точки xP от 1 до ⌈N / 2⌉
  xR ← точки xP от ⌈N / 2⌉ + 1 до N
  xm ← xP (⌈N / 2⌉) x
  yL ← {p ∈ yP: p x ≤ xm}
  yR ← {p ∈ yP: p x > xm}
  (dL, pairL) ← ближайшая пара (xL, yL)
  (dR, pairR) ← ближайшая пара (xR, yR)
  (dmin, pairMin) ← (dR, pairR)
  если dL <dR, тогда
    (dmin, pairMin) ← (dL, pairL)
  ENDIF
  yS ← {p ∈ yP: | xm - p x | <dmin}
  nS ← число точек в yS
  (ближайший, ближайший) ← (dmin, pairMin)
  для i от 1 до nS - 1
    k ← i + 1
    в то время как k ≤ nS и yS (k) y - yS (i) y <dmin
      если | yS (k) - yS (i) | <ближе
        (ближайший ближайший Pair) ← (| yS (k) - yS (i) |, {yS (k), yS (i)})
      ENDIF
      k ← k + 1
    ENDWHILE
  ENDFOR
  вернуться ближайший, ближайший
ENDIF
Ссылки и дальнейшие чтения: Самая близкая пара проблем точек Ближайшая пара (McGill) Ближайшая пара (UCSB) Ближайшая пара (WUStL) Ближайшая пара (IUPUI)

Для ввода предположим, что аргумент представляет собой массив объектов (точек) с элементами x и y установленными в числа. Для вывода возвращаем объект, содержащий пары ключ: значение для distance и pair (т. Е. Пару из двух ближайших точек).

## Instructions
## Tests
```yml tests: - text: getClosestPair - это функция. testString: 'assert(typeof getClosestPair === "function", "getClosestPair is a function.");' - text: Расстояние должно быть следующим. testString: 'assert.equal(getClosestPair(points1).distance, answer1.distance, "Distance should be the following.");' - text: Баллы должны быть следующими. testString: 'assert.deepEqual(JSON.parse(JSON.stringify(getClosestPair(points1))).pair, answer1.pair, "Points should be the following.");' - text: Расстояние должно быть следующим. testString: 'assert.equal(getClosestPair(points2).distance, answer2.distance, "Distance should be the following.");' - text: Баллы должны быть следующими. 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 ```