freeCodeCamp/curriculum/challenges/chinese/10-coding-interview-prep/rosetta-code/closest-pair-problem.md

3.9 KiB
Raw Blame History

id title challengeType videoUrl
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值对(即两对最近点的对)。

--hints--

getClosestPair是一个函数。

assert(typeof getClosestPair === 'function');

距离应如下。

assert.equal(getClosestPair(points1).distance, answer1.distance);

要点应如下。

assert.deepEqual(
  JSON.parse(JSON.stringify(getClosestPair(points1))).pair,
  answer1.pair
);

距离应如下。

assert.equal(getClosestPair(points2).distance, answer2.distance);

要点应如下。

assert.deepEqual(
  JSON.parse(JSON.stringify(getClosestPair(points2))).pair,
  answer2.pair
);

--solutions--