码迷,mamicode.com
首页 > 其他好文 > 详细

寻找最近点对

时间:2015-04-23 09:45:28      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:归并排序   算法   优化   

解法一:

     数组中总共包含N个数,把它们的两两差值求出来,就可以得到最小值对。时间复杂度为O(N2).N2值N的平方

代码如下:
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(N*log2N)的算法进行排序(快速排序,堆排序,归并排序)。排序完成后,求最小差值只需要O(N)的时间,总时间为O(N*log2N)。
伪代码如下:
double  MinDifference(double arr[], int n)
{
if (n < 2)
return 0;
//sort array arr[]
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将数组分成左右两部分,小于K的位left部分,大于k的为right部分,那么这个最小值要么来自left部分,要么来自right部分。要么来自于left的最大值和right的最小值的差值。总时间为O(N*log2N)。


解法三:
    二维的情况:
技术分享技术分享技术分享技术分享技术分享技术分享技术分享

寻找最近点对

标签:归并排序   算法   优化   

原文地址:http://blog.csdn.net/wangfengfan1/article/details/45200993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!