关闭

寻找最近点对

标签: 寻找最近点对面试
460人阅读 评论(1) 收藏 举报
分类:

寻找最近点对:给定平面上N个点的坐标,找出距离最近的两个点。

初看这个问题,会觉得没什么头绪,在面试的时候,怎么办?我们不妨先看看一维的情况:在一个包含N个数的数组中,如何快速找出N个数中两两差值的最小值?一维的情况相当于所有的点都在一条直线上。虽然是一个退化的情况,但还是能从中得到一些启发。

首先我们要分两种情况,如果所有的点都在x坐标,或者y坐标,相当于一维情况,否则相当于二维情况。

解法一:直接法(一维)

  数组中总共包含N个数,我们把它们两两之间的差值都求出来,那样就不难得出最小的差值了。这样一个直接的想法,时间复杂度为O(N2)。

double MinDifference(double arr[], int n)
{
	if (n < 2)
		return 0;
	double fMinDiff = fabs(arr[0] - arr[1]);
	for (int i = 0; i < n; ++i)
		for (int j = i + 1; j < n;++j)
		{
			double tmp = fabs(arr[i] - arr[j]);
			if (fMinDiff > tmp)
				fMinDiff = tmp;
		}
	return fMinDiff;
}


解法二:排序(一维

  如果数组有序,找出最小的差值就很容易了。时间复杂度为O(NlogN)。

double  MinDifference(double arr[], int n)
{
	if (n < 2)
		return 0;
	Sort(arr, arr + n);
	double fMinDiff = arr[1] - arr[0];
	for (int i = 2; i < n; ++i)
	{
		double tmp = arr[i] - arr[i - 1];
		if (fMinDiff > tmp)
			fMinDiff = tmp;
	}
	return fMinDiff;
}


解法三:分治法(二维)

  如果我们用数组的中间值k把数组分成Left、Right两部分,小于k的数为Left部分,其他的为Right部分,那么这个最小差值要么来自Left部分,要么来自Right部分,要么是Left中最大数和Right中最小数的差值。

  时间复杂度仍然是O(NlogN)。

二维的情况:

1
0
查看评论

《算法导论》实验五:最近点对算法(C++)

最近点对问题: 在n>=2个点的集合Q中寻找最近点对。 “最近”是指通常意义下的欧几里得距离:即点p1(x1,y1)和p2(x2,y2)之间的距离为:sqrt((x1-x2)2 +(y1-y2)2)。
  • to_Baidu
  • to_Baidu
  • 2015-12-15 14:59
  • 3294

数字之魅:寻找二维平面上的最近的点对

在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题。 初看这个题,可能感觉有点儿复杂。 方案一:蛮力法。数组中总共包含N个数,所以我们可以把平面内所有的点按X轴排序,然后依次算出后一个坐标与前面所有左边的距离,然后用Min和position来记录最近的距离和两个坐标。该方案...
  • gogoky
  • gogoky
  • 2016-07-12 16:42
  • 2562

编程之美之寻找最近点对

转载于  http://sxnuwhui.blog.163.com/blog/static/137068373201264104915935/?COLLCC=3097019025&COLLCC=3097019024& 在二维平面上的n个点中,如何快速的找出最近的一对点...
  • hysfwjr
  • hysfwjr
  • 2013-05-12 10:45
  • 2277

编程之美--O(n*log(n))--寻找最近点对

原创文章,转载请注明出处~~ http://www.cnblogs.com/justinzhang/  问题描述:给定平面上N个点的坐标,找出距离最近的两个点。         这是编程之美2.11的一道题...
  • lu1012123053
  • lu1012123053
  • 2013-08-07 23:58
  • 7284

找最近点对问题-分治算法的应用

     分治算法的基本思想是:    分(divide):递归求解子问题,即:分解+求解,将问题分解为k个方便求解的小问题。    为什么说是递归求解呢,这里可以看作将...
  • midgard
  • midgard
  • 2009-05-18 19:13
  • 14963

编程之美之寻找最近点对

分治的思想 首先,按照一个x进行分块,尽量保证左右差不多相等 然后求出最小,划分,在2m * m的块中至多有八个,直接解决
  • luckyu1
  • luckyu1
  • 2016-04-23 20:02
  • 139

寻找最近点对

显然,寻找最近点对最原始的算法是计算所有的点对的距离来找出最近点对。这种算法依赖n的值,n的值越大运行时间越长。为了提高时效,可应用分治算法解决。 算法每次递归调用的输入为点的自集P和数组Y。P中的所有点按其Y坐标单调递增的顺序排列,其编号序列存入数组Y。X坐标同样排列存入。 1.划分 找出一条垂直...
  • Akahieveman
  • Akahieveman
  • 2016-08-11 23:03
  • 496

[转][编程之美]2.11 寻找最近点对

问题: 给定平面上N个点的坐标,找出距离最近的两个点。 数学描述:设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。 分析与解答: 解法一:蛮力法 ...
  • fycy2010
  • fycy2010
  • 2015-07-18 19:27
  • 453

寻找最近点对

题目:平面中有若干个点,寻找距离最近的两个点。 分析: 方法1:两两点比较,寻找最近的两个点对,复杂度O(N^2),优点代码简单不容易出错 方法2:观察两两比较的方法,发现有很多无用的比较,对于每一个点只要计算到它最近的点的距离就可以了,枚举所有的点,最后得出距离最近的一对点,但对于一个给定的...
  • bertzhang
  • bertzhang
  • 2012-02-15 12:50
  • 5352

编程之美2.11——寻找最近点对(POJ 3714)

问题: 给定平面上N个点的坐标,找出距离最近的两个点。 解法: 我们先对N个点的x坐标进行排序,排序我们使用最坏复杂度O(n*logn)的快速排序方法,在排序的过程中minDifferent会递归计算出左右两边的最小距离,再用其中的较小值minum得到以中位数点附近的带状区域[p[me...
  • linyunzju
  • linyunzju
  • 2012-07-05 00:13
  • 4122
    个人资料
    • 访问:102637次
    • 积分:1947
    • 等级:
    • 排名:千里之外
    • 原创:93篇
    • 转载:43篇
    • 译文:0篇
    • 评论:8条
    最新评论