分治法求最小点对距离

来源:互联网 发布:百度同声传译软件 编辑:程序博客网 时间:2024/05/29 02:48

 问题阐述:对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点。


方法、步骤:1、预处理:根据输入点集S中的x轴进行排序,使用速度比较快的快速排序,然后将排序好的x坐标放到数组中,对应的y也放到对应的数组中。快速排序算法如下:quick x[0...n-1],y[0…n],left,right)if low<rlow←left  r←right  x←x[l],y←y[1];while l<r  while low<r && x<=x[r]  //从r开始找比x小的数字r-- if low<r  //找到后就调换位置x [low]←x[r] y[low] ←y[r]  low++ while low<r && x> array[low]  //从l的位置开始找比x大的数字low++if low<r  //找到就交换位置 x [r]←x[low] y[r] ←y[low]  r--  x[low]←x;    y[low]←y; quick(x,y,left,l-1) // 递归调用 quick(x,y,l+1,right)    2、按照排好序的x坐标,从中间划分成两个点数量差不多的区域,然后左区域继续划分成两个点数量差不多的区域,直到区域内点数量小于等于3个算法代码如下;dispart(x[0…n],y[0…n],low,high)   if high-low+1<=3  //如果区域内点的数量小于等于3个就计算点之间的距离      return   count(a,b,low,high)//返回区域内最短距离else //如果大于三个点  mid=(low+high)/2  //取中间的下标继续分割区域  m1←dispart(x,y,low,mid)  m2←disport(x,y,mid+1,high) //返回区域内最短距离  mindistance=min(m1,m2)  //取左右两个区域的最短距离  return merge(x,y,low,mid,high,mindistance)  //合并区域,并考虑是否有跨区域的最短距离,返回此整个区域的最短距离。3、合并两个区域时,判断是否含有跨区域的最小距离算法如下:merge(x[0…n],y[0…n],low,mid,high,min)  edge1←x[mid]-min   edge2←x[mid]+min //取距离中轴长度为min的边界  for(i←mid;i>=low;i++) //确定下边界所在的位置,下标      if x[i]<=edge1         l←i  break  if i<low  l←low   for(i←mid+1;i<=high;i++) //确定下边界所在的位置,下标      if x[i]>=edge2         h←i  break  if i>high h←high    quick(y,x,mid+1,high)  //对右区域内的点进行y的快速排序 for(i←l;i<=mid;i++)  //以左区域的每一个点的坐标,找到上、下、右边距离点长度为min的区域边界,在这个区域内的点与此点计算距离  hl←y[i]-min  hh←y[i]+min  wide←x[i]+min  for(j←mid+1;j<=h;j++)    if y[j]>=hl && y[j]<=hh && x[j]<=wide  //如果在这个小区域内计算距离     m←count;     if  m<min //如果小于最短距离        min←m; return min;4、穷举法直接两两计算距离,再与当前最小的距离作比较即可算法如下:for(i←0;i<n;i++) for(j←i+1;j<n;j++)   m←count;   //count函数计算两点距离   if m<min     min←m


0 0
原创粉丝点击