主程式 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 ...