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

128 lines
4.9 KiB
Markdown
Raw Normal View History

---
title: Closest-pair problem
id: 5951a53863c8a34f02bf1bdc
challengeType: 5
videoUrl: ''
localeTitle: 最近对的问题
---
## Description
<section id="description">任务: <p>提供一个函数来在二维中找到一组给定点中最接近的两个点,即求解平面情况下的<a href="https://en.wikipedia.org/wiki/Closest pair of points problem" title="wp最近点的问题">最近点对问题</a></p><p>直接的解决方案是On <sup>2</sup> )算法(我们可以称之为强力算法);伪代码(使用索引)可以简单地: </p><pre> bruteForceClosestPair of P1P2... PN
如果N &lt;2那么
返回∞
其他
minDistance←| P1 - P2|
minPoints←{P1P2}
foreachi∈[1N-1]
foreachj∈[i + 1N]
if | Pi - Pj| &lt;minDistance然后
minDistance←| Pi - Pj|
minPoints←{PiPj}
万一
ENDFOR
ENDFOR
return minDistanceminPoints
万一
</pre><p>一个更好的算法是基于递归分而治之的方法,正如<a href="https://en.wikipedia.org/wiki/Closest pair of points problem#Planar_case" title="wp最近点的问题#Planar_case">维基百科最近的一对点问题</a>所解释的那样即On log n;伪代码可以是: </p><pre>最近的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⌉ <sub>x</sub>
基←{P∈YPP <sub>X≤XM}</sub>
yR←{p∈yPp <sub>x</sub> &gt; xm}
dLpairL←nearestPairxLyL
dRpairR←nearestRairxRyR
dminpairMindRpairR
如果dL &lt;dR则
dminpairMindLpairL
万一
yS←{p∈yP| xm - p <sub>x</sub> | &lt;dmin}
nS←yS中的点数
最近最近的公里dminpairMin
我从1到nS - 1
k←i + 1
而k≤nS和ySk <sub>y</sub> -ySi <sub>y</sub> &lt;dmin
if | ySk - ySi| &lt;最接近的
(最近,最近的公里)←(| ySk - ySi|{ySkySi}
万一
k←k + 1
ENDWHILE
ENDFOR
返回最近,最近的
万一
</pre>参考和进一步阅读: <a href="https://en.wikipedia.org/wiki/Closest pair of points problem" title="wp最近点的问题">最近的一对点问题</a> <a href="http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html" title="链接http//www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html">最近的一对(麦吉尔)</a> <a href="http://www.cs.ucsb.edu/~suri/cs235/ClosestPair.pdf" title="链接http//www.cs.ucsb.edu/~suri/cs235/ClosestPair.pdf">最近的一对UCSB</a> <a href="http://classes.cec.wustl.edu/~cse241/handouts/closestpair.pdf" title="链接http//classes.cec.wustl.edu/~cse241/handouts/closestpair.pdf">最近的一对WUStL</a> <a href="http://www.cs.iupui.edu/~xkzou/teaching/CS580/Divide-and-conquer-closestPair.ppt" title="链接http//www.cs.iupui.edu/~xkzou/teaching/CS580/Divide-and-conquer-closestPair.ppt">最近的一对IUPUI</a> <p>对于输入,期望参数是一个对象(点)数组,其中<code>x</code><code>y</code>成员设置为数字。对于输出,返回一个包含键的对象: <code>distance</code><code>pair</code>值对(即两对最近点的对)。 </p></section>
## Instructions
<section id="instructions">
</section>
## Tests
<section id='tests'>
```yml
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.");'
```
</section>
## Challenge Seed
<section id='challengeSeed'>
<div id='js-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;
}
```
</div>
### After Test
<div id='js-teardown'>
```js
console.info('after the test');
```
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
```
</section>