平面最近点问题.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
平面最近点问题.doc

平面最近点问题 1.上机要求: 使用 Divide Conquer 解决问题。 思想: 将大问题划分为几个同样的小问题来解决平面上有≤ i ≤2n,有Pi.XPi+1.X 输入: n (整数, n0 且n10)(随机产生个不同点,其中 1=x,y=10 )输出 距离最近的两个点的坐标和距离。procedure QSort(var a: array of Integer; const lo0, hi0: Integer); var lo, hi, mid, t : Integer; begin lo := lo0; hi := hi0; Application.ProcessMessages; if (lo hi) then begin mid := (lo + hi) div 2; while (lo hi) do begin while ((lohi) and (Compare(a[lo], a[mid]) 0)) do inc(lo); while ((lohi) and (Compare(a[hi], a[mid]) 0)) do dec(hi); if (lo hi) then begin t := a[lo]; a[lo] := a[hi]; a[hi] := t; end; end; if (hi lo) then begin t := hi; hi := lo; lo := t; end; QSort(a, lo0, lo); if (lo = lo0) then t := lo+1 else t := lo; QSort(a, t, hi0); end; end; 2 CONQUERANDDIVE(分治模块) {函数NDP找出X[a..b]中的最近点对u,v(u,v指示点在PointSet中的下标),返回最近点对的距离; 数组Y将X中的点按照y坐标递增排序;X始终保持按照x坐标递增排序} function ConquerandDive(a,b:integer;var u,v:integer;var Y:array of integer):real; var Yl,Yr:array of integer; d1,d2,d3:real; i,j,t,ul,vl,ur,vr:integer; begin if b-a=1 then {如果X[a..b]中只有2个点,这两个点就是最近点对} begin result:=distance(PointSet[X[a]],PointSet[X[b]]); u:=X[a]; v:=X[b]; exit; end; if b-a=2 then {如果X[a..b]中只有3个点,就直接求出两两之间的距离,找到最近点对} begin d1:=distance(PointSet[X[a]],PointSet[X[a+1]]); d2:=distance(PointSet[X[a]],PointSet[X[a+2]]); d3:=distance(PointSet[X[a+1]],PointSet[X[a+2]]); if (d1=d2)and(d1=d3) then {d1最小} begin u:=X[a]; v:=X[a+1]; result:=d1; end else if (d2=d1)and(d2=d3) then {d2最小} begin u:=X[a]; v:=X[a+2]; result:=d2; end else {d3最小} begin u:=X[a+1]; v:=X[a+2]; result:=d3; end; exit; end; //对X[a..b]进行划分,划分为X[a..t]和X[t+1..b],由于我们是排好序的所以中线可以尽可能使其平均分配; t:=(a+b)div 2; SetLength(Yl,0); SetLength(Yr,0); {将Y分割成Yl和Yr,使得Yl里的点属于X[a..t],Yr里的点属于X[t+1..b],并且按照y坐标递增排序} for i:=0 to high(Y) do if PointSet[Y[i]].x=PointSet[X[t]].x then {说明点Y[i]属于X[a..

文档评论(0)

gshbzl + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档