算法分析中的几个经典例子.docx
- 文档编号:27240091
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:13
- 大小:22.34KB
算法分析中的几个经典例子.docx
《算法分析中的几个经典例子.docx》由会员分享,可在线阅读,更多相关《算法分析中的几个经典例子.docx(13页珍藏版)》请在冰豆网上搜索。
算法分析中的几个经典例子
*分析过程:
由于主管道是东西走向,那么通过主轴线的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 提问者: 哆啦没做梦打丁11悬赏分: 200|浏览次数: 1080次 一道我们算法课上留的作业题,大概内容是: 某市有n个小区(坐标给出),每个小区的住户数不相同(带权)。 现有一邮局将建在某小区内,要求到各个用户的距离之和最短,用分治法解答。 请高手帮下忙,很急,在线等。 请注解详细点,采用后积分倾囊相赠! 问题补充: 必须用分治法的,因为是分治法那章留的题。 分治是在小区坐标的地方,把横纵坐标分开来计算,好像是利用中位点求解的拜托了! G32008-11-2514: 43 最佳答案 代码如下: #include #inelude #inelude #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 (y[s]-y[i])*(y[s]-y[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«"请分别输入"<<*<"个小区的x坐标,y坐标,住户数\n"; for(i=0;i { coutvv"第"< "; cin>>x[i]»y[i]>>num[i]; } Rstrst=f(0,n-1);〃0到n-1为所有小区编号,则返回值就是最终结果 coutvv"到各个用户的距离之和最短的小区编号: "vvrst.idx+1vv"\n该小区到各个用户的距离之和: "vvrst.lvvendl; return0; } II最后说两句,算法时间复杂度0(n^2),其实就跟枚举没有区别 //这个题目布置的不好根本体现不出分治算法的优势 4 向TA求助 回答者: deitytodayG3|五级 擅长领域: 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++语言邮局选址 復I更等待您来回答 •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,Kn<10000接下来n行是居民点的位置,每行2个整数x和y,-lOOOOWx,y<10000= 结果输出: 程序运行结束时,将计算结果输出到文件output.txt中。 文件的第1行中的数是 n个居民点到邮局的距离总和的最小值。 输入文件示例 5 12 22 13 3-2 33 输出文件示例 10 解法: http: //blog.csdn.net/lyflower/archive/2008/03/07/2156943.aspx //-ByCQ.Xiao@SCAU //-Nov.9th2007 #include"iostream" usingnamespacestd; structinfo{ unsigneddis;//最小值 unsignedr;〃标号r之前(包括r)的村庄为一个辖区 }; //--DefinitionforGlobal-Variable unsignedvillage=0,postoffice=0;〃numberofvillage&postofficeunsigned*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©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(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(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< } } voidsetFree(){ //--释放动态分配的内存 for(unsignedi=0;i delete[]dis[i]; delete[]totalDis[i]; } delete[]center; delete[]dis; delete[]totalDis; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 中的 几个 经典 例子