- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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..
您可能关注的文档
最近下载
- [宜昌]2024年湖北宜昌市直部分事业单位招聘随军家属12人笔试历年参考题库(频考点试卷)解题思路附.docx VIP
- 第二章能带的理论.ppt VIP
- CMK公式(设备能力指数EXCEL自动计算).xlsx VIP
- SYT 5735-2019- 烃源岩地球化学评价方法.pdf VIP
- 液压与气压传动 第2版 教学课件 作者 马振福 高职课件11.ppt VIP
- 大金模块机操作安装维护指导手册最新.pdf VIP
- 线路参数测试方案.docx VIP
- 肩袖损伤康复 ppt课件.pptx
- 2021爆炸性环境 爆炸预防和防护第1部分基本原则和方法.pdf VIP
- 液压与气压传动第2版试卷马振福主编高职课件12课件.ppt VIP
文档评论(0)