算法分析中的几个经典例子.docx
《算法分析中的几个经典例子.docx》由会员分享,可在线阅读,更多相关《算法分析中的几个经典例子.docx(13页珍藏版)》请在冰豆网上搜索。
![算法分析中的几个经典例子.docx](https://file1.bdocx.com/fileroot1/2023-1/7/88a8a774-8878-4b25-bd7d-41953961e926/88a8a774-8878-4b25-bd7d-41953961e9261.gif)
算法分析中的几个经典例子
*分析过程:
由于主管道是东西走向,那么通过主轴线的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;iscanf("%d",&y[i]);//x坐标在此题中无用,而y坐标在x坐标之后写入。
因此两次写入一样的数组y[LEN]
scanf("%d",&y[i]);
}
dy=RandomizedSelect(y,0,n-1,(n+1)/2);//中位数求取
for(i=0;isum+=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;ireturnrst;
}
else//否则,分别找出左半和右半区间中的最佳小区,谁更优,就返回谁
{
Rsta=f(s,(s+e)/2),b=f((s+e+1)/2,e);
returna.la:
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;icin>>xCoordinate[i];
//---Sort
intt=0;
for(i=0;ifor(intj=0;jif(xCoordinate[j]>xCoordinate[j+1]){
t=xCoordinate[j];
xCoordinate[j]=xCoordinate[j+1];
xCoordinate[j+1]=t;
}
}
voidcalculateCenter(){
//---内存分配
center=newunsigned*[village];//动态分配二维数组的第一维
for(unsignedi=0;icenter[i]=newunsigned[village];
//---初始化Center(l,r)
for(unsignedl=0;lfor(unsignedr=l;rcenter[l][r]=xCoordinate[(r-l)/2+l];
}
voidcalculateDis(){
//---内存分配
dis=newunsigned*[village];//动态分配二维数组的第一维
for(unsignedi=0;idis[i]=newunsigned[village];
//---初始化Dis(l,r)
for(unsignedl=0;lfor(unsignedr=l;rdis[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;itotalDis[i]=newinfo[postoffice+1];
//---计算TotalDis(v,p+1)
//----当k=1时,根据公式(1.2),直接计算
for(unsignedt=0;ttotalDis[t][1].dis=dis[t][village-1];
//----当k=2,3,...,p时的情况
for(unsignedk=2;k<=postoffice;k++)
for(unsignedt=0;ttotalDis[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(temptotalDis[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;idelete[]center[i];
delete[]dis[i];
delete[]totalDis[i];
}
delete[]center;
delete[]dis;
delete[]totalDis;
}
赞同