算法分析中的几个经典例子.docx

上传人:b****5 文档编号:6514348 上传时间:2023-01-07 格式:DOCX 页数:13 大小:33.56KB
下载 相关 举报
算法分析中的几个经典例子.docx_第1页
第1页 / 共13页
算法分析中的几个经典例子.docx_第2页
第2页 / 共13页
算法分析中的几个经典例子.docx_第3页
第3页 / 共13页
算法分析中的几个经典例子.docx_第4页
第4页 / 共13页
算法分析中的几个经典例子.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

算法分析中的几个经典例子.docx

《算法分析中的几个经典例子.docx》由会员分享,可在线阅读,更多相关《算法分析中的几个经典例子.docx(13页珍藏版)》请在冰豆网上搜索。

算法分析中的几个经典例子.docx

算法分析中的几个经典例子

*分析过程:

由于主管道是东西走向,那么通过主轴线的y坐标可唯一确定其位置。

由带权中位数问题可知,其中位数即为管道最优解。

用一个线性时间选择找中位数算法,即可在O(n)时间内解此问题。

这里采用RandomizedSelect算法。

油井数可能为奇数或者偶数

奇数则取其中位数

偶数则取两个中位数中的任意一个

*/

#include

#include

#include

#defineLEN100

usingnamespacestd;

intRandom(intp,intr){//随机化

returnrand()*(r-p)/32767+p;

}

voidSwap(int&a,int&b){

inttemp=a;

a=b;

b=temp;

}

intPartition(inty[LEN],intp,intr){

inti=p,j=r+1;

intx=y[p];

while(true){

while(y[++i]

while(y[--j]>x);

if(i>=j)break;

Swap(y[i],y[j]);

}

y[p]=y[j];

y[j]=x;

returnj;

}

intRandomizedPartition(inty[LEN],intp,intr){

inti=Random(p,r);

Swap(y[i],y[p]);

returnPartition(y,p,r);

}

intRandomizedSelect(inty[LEN],intp,intr,intk){

if(p==r)returny[p];

inti=RandomizedPartition(y,p,r);

intj=i-p+1;

if(k<=j)returnRandomizedSelect(y,p,i,k);

elsereturnRandomizedSelect(y,i+1,r,k-j);

}

voidmain(){

intn;//油井数

intsum=0;//管道长度总和

inty[LEN];//油井y坐标

intdy;//油井y坐标中位数

freopen("input.txt","r",stdin);//打开一个输入流,读取input.txt文件

freopen("output.txt","w",stdout);//打开一个输出流,写output.txt文件

scanf("%d",&n);//读取油井数

for(inti=0;i

scanf("%d",&y[i]);//x坐标在此题中无用,而y坐标在x坐标之后写入。

因此两次写入一样的数组y[LEN]

scanf("%d",&y[i]);

}

dy=RandomizedSelect(y,0,n-1,(n+1)/2);//中位数求取

for(i=0;i

sum+=abs(y[i]-dy);//计算管道和

printf("%d\n",sum);

fclose(stdin);//关闭输入流

fclose(stdout);//关闭输出流

}

 

 

窗体底端

窗体顶端

窗体底端

邮局选址的分治算法,C++语言

2008-11-2513:

28

提问者:

哆啦没做梦|悬赏分:

200|浏览次数:

1080次

一道我们算法课上留的作业题,大概内容是:

某市有n个小区(坐标给出),每个小区的住户数不相同(带权)。

现有一邮局将建在某小区内,要求到各个用户的距离之和最短,用分治法解答。

请高手帮下忙,很急,在线等。

请注解详细点,采用后积分倾囊相赠!

问题补充:

必须用分治法的,因为是分治法那章留的题。

分治是在小区坐标的地方,把横纵坐标分开来计算,好像是利用中位点求解的。

拜托了!

2008-11-2514:

43

最佳答案

代码如下:

#include

#include

#include

#include

usingnamespacestd;

constintMAXN=10000;

typedefstruct{intidx,l;}Rst;

intn,x[MAXN],y[MAXN],num[MAXN];

Rstf(ints,inte)

//分治求解,参数s,e为小区编号,函数求出从s到e编号的小区中,哪一个到所有小区的加权距离和最短,并返回距离和与小区编号

{

inti;

if(s==e)//如果区间里面只有一个小区,显然返回该小区

{

Rstrst={s,0};

for(i=0;i

returnrst;

}

else//否则,分别找出左半和右半区间中的最佳小区,谁更优,就返回谁

{

Rsta=f(s,(s+e)/2),b=f((s+e+1)/2,e);

returna.l

a:

b;

}

}

intmain()

{

inti,j,k;

cout<<"请输入小区数量:

";

cin>>n;

cout<<"请分别输入"<

for(i=0;i

{

cout<<"第"<

";

cin>>x[i]>>y[i]>>num[i];

}

Rstrst=f(0,n-1);//0到n-1为所有小区编号,则返回值就是最终结果

cout<<"到各个用户的距离之和最短的小区编号:

"<

"<

return0;

}

 

//最后说两句,算法时间复杂度O(n^2),其实就跟枚举没有区别..

//这个题目布置的不好根本体现不出分治算法的优势

赞同

4

向TA求助

回答者:

deitytoday|五级

擅长领域:

C/C++程序设计

参加的活动:

暂时没有参加的活动

提问者对于答案的评价:

非常感谢,主函数有一点小问题,刚刚改了下已经能运行了。

分给你了!

相关内容

∙2008-10-7大家帮帮忙,用递归算法的分治策略求一个数组的众数,用c语言编写,告诉...1

∙2007-9-19邮局把信件自动分检使用的是哪种计算机技术?

A机器翻译B自然语言理解C...3

∙2009-6-10学校超市选址,c语言采用数据结构编写1

∙2009-5-31C语言数据结构超市选址

∙2011-5-21求用FLOYD算法解此矩阵,并附带floyd的c语言程序,矩阵中M_A_X表两点不...2

更多关于邮局选址问题代码?

的问题>>

查看同主题问题:

算法c++c++语言邮局选址

等待您来回答

∙0回答大三的线性代数课件

∙2回答请问谁有建筑结构基础与识图,中国建筑工业出版社的第二版的课件ppt,...

∙0回答高一英语必修一unit3Discoveringusefulstructures3(人教版)

∙0回答人教版六年级数学目标检测第三单元检测

∙2回答我昨天才发现我老公我婚外情的,我只找到他最近特别爱找茬,昨天无意...

∙0回答100高分跪求2011年11月的证券从业资格考试基础知识,证券交易,基金,投...

∙1回答那里有优秀的ppt化学课件呢

∙1回答人教版高一地理必修一1

更多等待您来回答的问题>>

其他回答共2条

2008-11-2513:

37rupxup|三级

为什么用分支法呢?

别的行不行?

赞同

0

2008-11-2514:

55高金山|十四级

邮局选址问题

􀂐问题描述:

在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。

用x坐标表示东西向,用y坐标表示南北向。

各居民点的位置可以由坐标(x,y)表示。

街区中任意2点(x1,y1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y1-y2|度量。

居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。

􀂐编程任务:

给定n个居民点的位置,编程计算n个居民点到邮局的距离总和的最小值。

􀂐数据输入:

由文件input.txt提供输入数据。

文件的第1行是居民点数n,1≤n≤10000。

接下来n行是居民点的位置,每行2个整数x和y,-10000≤x,y≤10000。

􀂐结果输出:

程序运行结束时,将计算结果输出到文件output.txt中。

文件的第1行中的数是n个居民点到邮局的距离总和的最小值。

输入文件示例

5

12

22

13

3-2

33

输出文件示例

10

解法:

//-ByCQ.Xiao@SCAU

//-Nov.9th2007

#include"iostream"

usingnamespacestd;

structinfo{

unsigneddis;//最小值

unsignedr;//标号r之前(包括r)的村庄为一个辖区

};

//--DefinitionforGlobal-Variable

unsignedvillage=0,postoffice=0;//numberofvillage&postoffice

unsigned*xCoordinate=NULL;//xcoordinateofeachvillage

unsigned**center=NULL,**dis=NULL;//pointforCenter(l,r)&Dis(l,r)

info**totalDis=NULL;//pointforTotalDis(t,k)

//--FunctionDeclare

voidinput();

voidcalculateCenter();

voidcalculateDis();

voidcalculateTotalDis();

voidoutput(unsignedt,unsignedk);

voidsetFree();

intmain(){

input();

calculateCenter();

calculateDis();

calculateTotalDis();

output(0,postoffice);

setFree();

return0;

}

voidinput(){

//---Input

cin>>village>>postoffice;

xCoordinate=newunsigned[village];

for(unsignedi=0;i

cin>>xCoordinate[i];

//---Sort

intt=0;

for(i=0;i

for(intj=0;j

if(xCoordinate[j]>xCoordinate[j+1]){

t=xCoordinate[j];

xCoordinate[j]=xCoordinate[j+1];

xCoordinate[j+1]=t;

}

}

voidcalculateCenter(){

//---内存分配

center=newunsigned*[village];//动态分配二维数组的第一维

for(unsignedi=0;i

center[i]=newunsigned[village];

//---初始化Center(l,r)

for(unsignedl=0;l

for(unsignedr=l;r

center[l][r]=xCoordinate[(r-l)/2+l];

}

voidcalculateDis(){

//---内存分配

dis=newunsigned*[village];//动态分配二维数组的第一维

for(unsignedi=0;i

dis[i]=newunsigned[village];

//---初始化Dis(l,r)

for(unsignedl=0;l

for(unsignedr=l;r

dis[l][r]=0;

for(unsignedk=l;k<=r;k++)

if(center[l][r]>xCoordinate[k])

dis[l][r]+=center[l][r]-xCoordinate[k];//计算unsigned时不要得出负数

else

dis[l][r]+=xCoordinate[k]-center[l][r];

}

}

voidcalculateTotalDis(){

//---内存分配

totalDis=newinfo*[village];//动态分配二维数组的第一维

for(unsignedi=0;i

totalDis[i]=newinfo[postoffice+1];

//---计算TotalDis(v,p+1)

//----当k=1时,根据公式(1.2),直接计算

for(unsignedt=0;t

totalDis[t][1].dis=dis[t][village-1];

//----当k=2,3,...,p时的情况

for(unsignedk=2;k<=postoffice;k++)

for(unsignedt=0;t

totalDis[t][k].dis=(unsigned)(-1);

totalDis[t][k].r=0;

for(unsignedr=t;r<=village-k;r++){

unsignedtemp=dis[t][r]+totalDis[r+1][k-1].dis;

//----计算最小值

if(temp

totalDis[t][k].dis=temp;

totalDis[t][k].r=r;

}

}

}

}

voidoutput(unsignedt,unsignedk){

if(1==k)

cout<

else{

cout<

output(totalDis[t][k].r+1,k-1);

}

}

voidsetFree(){

//--释放动态分配的内存

for(unsignedi=0;i

delete[]center[i];

delete[]dis[i];

delete[]totalDis[i];

}

delete[]center;

delete[]dis;

delete[]totalDis;

}

赞同

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1