分治法求最小点对距离
来源:互联网 发布:百度同声传译软件 编辑:程序博客网 时间: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
- 分治法求最小点对距离
- 分治法求最小点对
- hdu 1007 分治法求最小点之间的距离(使用分治法模板)
- 分治法求最小点对(hdu1007)
- 分治法求平面上的最小点对
- hdu-1007-Quoit Design-求最小点距离、分治思想
- HDU1007_分治_找最小距离点对
- 【解题报告】 POJ 3714 Raid -- 点对最小距离 + 分治法
- POJ--3714[Raid] 分治发求最小点对
- hud 1007 Quoit Design(分治求最小点对)
- 分治法求最近点对问题
- 分治法求最近点对
- 分治法求最近点对问题
- hdu1007分治法求最近点对
- 分治法求最近点对
- 分治法求最近点对
- 分治法求最接近点对问题
- 分治法求最近点对
- MFC避免窗口闪烁的方法(OnEraseBkgnd) .
- 证书介绍及openssl生成证书和吊销列表
- php GD库画图 验证码
- 一篇很全面的freemarker教程
- Scrapy定向爬虫教程(四)——数据存入MongoDB
- 分治法求最小点对距离
- MongoDB——Aggregates(c#实现支持数组字段)
- ffmpeg.c函数结构简单分析(画图)
- GC roots
- 配置apt源
- 网络编程(17)—— 使用recv检查输入缓存是否有数据
- 跨平台Caffe及I/O模型与并行方案(三)
- HTML练习css--制作开心餐厅介绍页面
- TankWar 单机(JAVA版)版本2.2 超级炮弹