分治法和蠻力法MATLAB求最近點對

2021-09-24 05:39:20 字數 2276 閱讀 1370

主程式 main.m

%%

clear;clc

n = 20;

% 隨機生成20個點

a=rand(n,2)*10;

% 將20個點按橫座標公升序排列

a = sortrows(a,1);

% 蠻力法求隨機點的最近點對

[mindist,x1,x2] = bcloest(a,1,n);

[mindist1,y1,y2] = cloest(a,1,n);

% 使用紅色的點標記隨機點

x=a(:,1);

y=a(:,2);

for i = 1:n

plot(x,y,'r.'); hold on

text(a(i,1),a(i,2),num2str(i));hold on

end%使用綠色十字標記分治法的最近點對

plot(y1(1),y1(2),'g+');hold on

plot(y2(1),y2(2),'g+');hold on

% 使用藍色的十字標記最近點對

plot(x1(1),x1(2),'b*');hold on

plot(x2(1),x2(2),'b*');hold on

分治求最近點對 cloest.m

function [d,x1,x2] = cloest(s,low,high)

p=;if(high - low == 1)

[d,x1,x2] = deal(pdist2(s(low,:),s(high,:)),s(low,:),s(high,:));

elseif(high - low == 2)

d1 = pdist2(s(low,:),s(low + 1,:));

d2 = pdist2(s(low + 1,:),s(high,:));

d3 = pdist2(s(low,:),s(high,:));

if((d1 < d2) && (d1 < d3))

[d,x1,x2] = deal(d1,s(low,:),s(low + 1,:));

elseif(d2 < d3)

[d,x1,x2] = deal(d2,s(low+1,:),s(high,:));

else

[d,x1,x2] = deal(d3,s(low,:),s(high,:));

endelse

mid = floor((low+high)/2);

[d1,x11,x12] = cloest(s,low,mid);

[d2,x21,x22] = cloest(s,mid+1,high);

if(d1 <= d2)

[d,x1,x2] = deal(d1,x11,x12);

else

[d,x1,x2] = deal(d2,x21,x22);

endindex = 0;

for i = mid:-1:low

if(s(mid,1) - s(i,1) >= d)

break;

endindex = index + 1;

p(index,:) = s(i,:);

endfor i = mid+1:high

if(s(i,1) - s(mid,1) >= d)

break;

endindex = index + 1;

p(index,:) = s(i,:);

endsortrows(p,2);

for i = 1:index

for j = i+1:index

if(p(j,2) - p(i,2) >= d)

break;

else

d3 = pdist2(p(i,:),p(j,:));

if(d3 < d)

[d,x1,x2] = deal(d3,p(i,:),p(j,:));

endend

endend

end

蠻力法求最近點對 bcloest.m

function [d,x1,x2] = bcloest(a,low,high)

min = 100;

for i = low:high

for j = i + 1:high

d1 = pdist2(a(i,:),a(j,:));

if( d1 < min)

[d,x1,x2] = deal(d1,a(i,:),a(j,:));

min = d1;

endend

endend

分治法 蠻力法 金塊問題

乙個老闆有 n 塊金塊,他要把最重的一塊獎勵給最優秀的員工,最輕的一塊獎勵給次優秀的員工。假設有一台比較重量的儀器,希望用最少的比較次數找出最重和最輕的金塊。題意就是在一堆亂序元素中找到兩個最值元素 最大值 最小值 本題解法思路有兩種 分治法 蠻力法 分治演算法實現上,又可以分兩種思路 遞迴 非遞迴...

最大子段和問題 蠻力法 分治法 動態規劃法

蠻力法 int maxsum1 int a,int n return maxsum 分治法 int maxsum2 int left,int right,int a sum 0 right max 0 求右邊的最大值 for i center 1 i right i sum right max le...

C 用蠻力法與分治法解決最近對問題

設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,最近對問題就是找出集合s中距離最近的點對。嚴格地講,最接近點對可能多於一對,簡單起見,只找出其中的一對即可。簡單起見,只考慮二維的情況並假設所討論的點以標準笛卡爾座標形式給出。因此,兩個點pi xi,yi 和pj ...