freeCodeCamp/curriculum/challenges/chinese/08-coding-interview-prep/rosetta-code/closest-pair-problem.chines...

4.9 KiB
Raw Blame History

title id challengeType videoUrl localeTitle
Closest-pair problem 5951a53863c8a34f02bf1bdc 5 最近对的问题

Description

任务:

提供一个函数来在二维中找到一组给定点中最接近的两个点,即求解平面情况下的最近点对问题

直接的解决方案是On 2 )算法(我们可以称之为强力算法);伪代码(使用索引)可以简单地:

 bruteForceClosestPair of P1P2... PN
如果N <2那么
  返回∞
其他
  minDistance←| P1 -  P2|
  minPoints←{P1P2}
  foreachi∈[1N-1]
    foreachj∈[i + 1N]
      if | Pi -  Pj| <minDistance然后
        minDistance←| Pi -  Pj|
        minPoints←{PiPj}
      万一
    ENDFOR
  ENDFOR
  return minDistanceminPoints
万一

一个更好的算法是基于递归分而治之的方法,正如维基百科最近的一对点问题所解释的那样即On log n;伪代码可以是:

最近的xPyP
  其中xP是P1.. PN按x坐标排序和
  yP是P1.. PN按y坐标排序升序
如果N≤3那么
  使用强力算法返回xP的最近点
其他
  xL←xP点从1到⌈N/2⌉
  xR←xP点从⌈N/2⌉+ 1到N.
  xm←xP⌈N/2⌉ x
  基←{P∈YPP X≤XM}
  yR←{p∈yPp x > xm}
  dLpairL←nearestPairxLyL
  dRpairR←nearestRairxRyR
  dminpairMindRpairR
  如果dL <dR则
    dminpairMindLpairL
  万一
  yS←{p∈yP| xm  -  p x | <dmin}
  nS←yS中的点数
  最近最近的公里dminpairMin
  我从1到nS  -  1
    k←i + 1
    而k≤nS和ySk y -ySi y <dmin
      if | ySk -  ySi| <最接近的
        (最近,最近的公里)←(| ySk -  ySi|{ySkySi}
      万一
      k←k + 1
    ENDWHILE
  ENDFOR
  返回最近,最近的
万一
参考和进一步阅读: 最近的一对点问题 最近的一对(麦吉尔) 最近的一对UCSB 最近的一对WUStL 最近的一对IUPUI

对于输入,期望参数是一个对象(点)数组,其中xy成员设置为数字。对于输出,返回一个包含键的对象: distancepair值对(即两对最近点的对)。

Instructions

Tests

tests:
  - text: <code>getClosestPair</code>是一个函数。
    testString: 'assert(typeof getClosestPair === "function", "<code>getClosestPair</code> 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

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