




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
算法設(shè)計(jì)與分析作業(yè)
姓名:學(xué)號(hào):專(zhuān)業(yè):
習(xí)題一
1-1函數(shù)的漸進(jìn)表達(dá)式
3n2+10n=O(n2);
n2/10+2n=O(2n);
21+l/n=0(l);
logn3=O(logn);
10log3n=O(n)
1-2O⑴和0(2)的區(qū)別
分析與解答:根據(jù)符號(hào)0的定義可知。(1)=0(2)用。(1)和。(2)
表示同一個(gè)函數(shù)時(shí),差別僅在于其中的常數(shù)因子。
1-3按漸進(jìn)階排列表達(dá)式
分析與解答:按漸進(jìn)階從低到高,函數(shù)排列順序如下:
0(2)<0(logn)<0(n2/3)<0(20n)<0(4n2)<0(3n)<0(n!)
習(xí)題二
算法分析題
2-27個(gè)二分搜索算法
分析與解答:(1)與主教材中的算法Binarysearch相比,數(shù)組段左、右游
標(biāo)left和right的調(diào)整不正確,導(dǎo)致陷入死循環(huán)。
(2)數(shù)組段左、右游標(biāo)left和right的調(diào)整不正確,導(dǎo)致當(dāng)x=a[n-l]時(shí)返回
錯(cuò)誤。
(3)數(shù)組段左、右游標(biāo)left和right的調(diào)整不正確,導(dǎo)致當(dāng)x=a[n-l]時(shí)返回
錯(cuò)誤。
(4)數(shù)組段左、右游標(biāo)left和right的調(diào)整不正確,導(dǎo)致陷入死循環(huán)。
(5)算法正確,且當(dāng)數(shù)組中有重復(fù)元素時(shí),返回滿足條件的最右元素。
(6)數(shù)組段左、右游標(biāo)left和right的調(diào)整不正確,導(dǎo)致當(dāng)x=a[n-l]時(shí)返回
錯(cuò)誤。
(7)數(shù)組段左、右游標(biāo)left和right的調(diào)整不正確,導(dǎo)致當(dāng)x=a⑼時(shí)陷入死
循環(huán)。
2-26修改快速排序算法,使它在最壞情況下的計(jì)算時(shí)間為0(nlogn).
分析與解答:從一個(gè)無(wú)序的序列中隨機(jī)取出一個(gè)值q做為支點(diǎn),然后把大
于q的放到一邊,小于q的放到q的另一邊,然后再以q為分界點(diǎn),分別對(duì)q的
兩邊進(jìn)行排序(快排時(shí)直接再對(duì)q兩邊重新取支點(diǎn),整理,再取支點(diǎn),…直到支
點(diǎn)兩旁都有序。也就是支點(diǎn)兩旁只有一個(gè)數(shù)時(shí))
#include<stdio.h>
#include<stdlib.h>
intQsort(intp[],intbegjntend)
if(beg+l>=end)return0;〃退出遞歸
intlow,hight,q;
low=beg;
hight=end;
q=p[low];〃q為支點(diǎn),其實(shí)q可以為隨機(jī)數(shù)。但相應(yīng)以下程序就要改了
while(l){
while(low<hight&&p[hight]>q)hight-;
if(low>=hight)break;
p[low++]=p[hight];
while(low<hight&&p[low]<q)low++;
p[hight++]=p[low];
}
p[low]=q;
Qsort(p,beg,low-1);
Qsortfpjow+l^nd);
}
intmain()
(
inti,a[]={lz32,6,4,54,654,6,6,2,76,76,7,66,5,544,334,34,78};
Qsort(a,0,sizeof(a)/4-l);
for(i=0;i<sizeof(a)/4;i++)printf("%d",a[i]);
system(,,pause");
return0;
)
算法實(shí)現(xiàn)題
2-2眾數(shù)問(wèn)題
分析與解答:算法具體實(shí)現(xiàn)如下:
Voidmode(intl,intr)
{intllzrl;
Intmed=median(aj,r);
lf(largest<rl-ll+l)
Largest=rl-ll+l,element=med;
lf(largest<ll-l)
mode(IJl-l);
lf(largest<r-rl)
mode(rl+l,r);
)
其中,median用于找中位數(shù),split用中位數(shù)將數(shù)組分割為2段。
習(xí)題三
算法分析題
3-5二維0-1背包問(wèn)題
分析與解答:?jiǎn)栴}的形式化描述是:給定c>0,d>0.wi>0,bi>0,vi>0,l<=i<=n,
要求找出n7C0-1向量(xl,x2,......,xn),xi屬于{0.1},1<=I<=n,使得fwixi<=c,
i=l
Z〃漢而且2心,達(dá)到最大。
z=li=l
因此,二維0-1背包問(wèn)題也是一個(gè)特殊的整數(shù)規(guī)劃問(wèn)題。
Max^vm
i=l
ZWZXZ<=c
/=1
(>bixi<=d
i=\
xi屬于{0.1},1<=i<=n
I
容易證明該問(wèn)題具有最優(yōu)子結(jié)構(gòu)性質(zhì)
設(shè)所給二維0.1背包問(wèn)題的子問(wèn)題
MaxZ心/
/=/
ZmX/<=j
t=i
xt屬于{0.1},1<=t<=n
I
的最優(yōu)質(zhì)為m(l,j,k),即m(ljk)背包容量為j溶積為k,可選擇物品為IJ+1,…,n
時(shí)二維0-1背包問(wèn)題的最優(yōu)值。由二維0-1背包問(wèn)題的最優(yōu)子結(jié)構(gòu)性質(zhì),可以建
立計(jì)算m(l,j,k)的遞歸式如下:
“Max{m(i+Lj),m(i+ljwi,k-bi)+vi}j>=wiandk>=bi
m(ijk)二y
Im(i+l,j)0<=j<wior0<=k<bi
"vnj>=wnandk>=bn
m(nj,k)-
100<=j<wnor0<=k<bn
按此遞歸式計(jì)算出的m(n,c,d)為最優(yōu)值。算法所需的計(jì)算時(shí)間為O(ncd).
算法實(shí)現(xiàn)題
3-2最少硬幣問(wèn)題
分析與解答:對(duì)于這個(gè)硬幣問(wèn)題,我們每次都是取硬幣,或者不取硬幣。
因此我們可以將這個(gè)硬幣問(wèn)題切割成若干個(gè)子問(wèn)題(取不取這種硬幣),而且每
次決策都會(huì)用到這個(gè)子問(wèn)題。而且所有的子問(wèn)題中必定存在最優(yōu)解。每次取硬幣,
都僅僅是做出決策,判斷是否取這三種硬幣,每次決策之后,除了n塊錢(qián)會(huì)改變
之外,其他都沒(méi)有改變,都是判斷是否取這三種硬幣的一種,因此可以說(shuō)硬幣問(wèn)
題無(wú)后效性。
#include<iostream>
usingnamespacestd;
intfind_dest(intmoney,int*coin,intn)
{int*minCoin=newint[money+1]();
int*valueCoin=newint[money+1]();
memset(minCoin,0,sizeof(int)*(money+1));
memset(valueCoin,0,sizeof(int)*(money+1));
for(inti=1;i<=money;i++)
{intmaxCoin=i;
intvalue=0;
for(intj=0;j<n;j++)
{if(i>=coinfj])
{if(minCoin[i-coin[j]]+1<=maxCoin&&(i==coin[j]||valueCoin[i-coin[j]]!=0)/*
檢測(cè)上一個(gè)是否有效,無(wú)效則跳過(guò)*/)
(
maxCoin=minCoin[i-coin[j]]+1;
value=coin[j];
})
minCoin[i]=maxCoin;
valueCoin[i]=value;
}
if(valueCoin[money]!=0)
(
while(money)
(
cout?valueCoin[money]?
money-=valueCoin[money];}
cout?endl;
}
else
(
cout?"error!"?endl;
}
delete[]minCoin;
deletef]valueCoin;
return0;}
intmain()
(
intmoney=9;
intcoin[3]={2,3,5};
find_dest(money,coin,3);
system("pause");
return0;
}
習(xí)題4
算法實(shí)現(xiàn)題
4-6最優(yōu)服務(wù)次序問(wèn)題
分析與解答:貪心策略:最短服務(wù)時(shí)間優(yōu)先。
doublegreedy(vector<int>x)
{intn=x.size();
Sort(x.begin(),x.end());
For(inti=l;i<n;i++)
x[i]+=x[i-l];
doublet=0;
For(i=l;i<n;i++)
t+=x[i];
t/=n;
returnt;
)
4-7多次最優(yōu)服務(wù)次序問(wèn)題
分析與解答:貪心策略:最短服務(wù)時(shí)間優(yōu)先。
Doublegreedy(vector<int>x,ints)
{vector<int>st(s+l,O);
vector<int>su(s+l,0);
intn=x.size();
sort(x.begin(),x.end());
inti=0,j=0;
while(i<n){
st[j]+=x[i];
su[j]+=st[j];
i++;j++;
if(j==s)
j=0;}
doublet=0;
for(i=0;i<s;i++)t+=su[i];
t/=n
returnt;}
習(xí)題五
算法分析題
5-4最大團(tuán)問(wèn)題的迭代回溯法
分析與解答:與教材中裝載問(wèn)題的迭代回溯法相似,最大團(tuán)問(wèn)題的迭代回
溯法描述如下:
voidclique::iterclique()
{for(inti=0;i<=n;i++)x[i]=0;
i=l;
while(true){
while(i<=n&&ok(i)){x[i++]=l;cn++;}
if(i>=n){
for(intj=l;j<=n;j++)bestx[j]=x[j];
bestn=cn;
}
Elsex[i++]=0;
While(cn+n-i<=bestn){
i-;
while(i&&!x[i])i-;
if(i==0)return;
x[i++]=0;cn-;
}
)
}
其中,OK用于判斷當(dāng)前頂點(diǎn)是否可加入當(dāng)前團(tuán)。
boolClique::ok(inti)
{for(intj=l;j<l;j++)
lf(x[j]&&a[i][j]==NoEdge)returnfalse;
Returntrue;}
依「Clique用于初始化,并調(diào)用迭代回溯法求解。
IntClique::lterClique(intv[])
{x=newint[n+l];
cn=0;
bestn=O;
bestx=v;
lterClique();
delete[]x;
returnbetn;
)
算法實(shí)現(xiàn)題
5-4運(yùn)動(dòng)員最佳配對(duì)問(wèn)題
分析與解答:磁體的解空間顯然是一顆排列數(shù),可以套用搜索排列數(shù)的回溯法框
架。
voidpref::Comppute(void)
{for(inti=l,temp=O;i<=n;i++)
Temp+=p[i][r[i]]*q[r[i]][i];
lf(temp>best){
Best=temp;
For(inti=l;i<=n;i++)bestr[i]=r[i];
)
}
習(xí)題六
算法分析題
6-9解旅行售貨員問(wèn)題的分支限界法中保存已產(chǎn)生的排列樹(shù)。
分析與解答:排列樹(shù)中結(jié)點(diǎn)類(lèi)型定義為:
classbbnode{
public:
bbnode*parent;
ints,*x;
);
保存已產(chǎn)生的排列樹(shù)的旅行售貨員問(wèn)題的分支限界法如下。
template<classtype>
classTraveling(
friendintmain();
public:
typeBBTSP(intv[]);
private:
intn;
type**a,NoEdge,cc,bestc;
);
Template<classtype>
ClassMinHeapNode{
Friendtraveling<type>;
Public:
Operatortype()const{returnIcost;}
Private:
TypeIcostccjcost;
Bbnode*ptr;};
Template<classtype>
Typetraveling<type>::BBTSP(intv[])
{〃解旅行售貨員問(wèn)題的優(yōu)先隊(duì)列式分支限界法
、、定義最小堆得容量為100000
MinHeap<MinHeapNode<Type?H(100000);
Type*MinOut=newType[n+1];
〃計(jì)算MinOut[i]二頂點(diǎn)i的最小出邊費(fèi)用
TypeMinSum=0;
For(inti=l;i<=n;i++)
{typeMin=NoEdge;
For(intj=l;j<=n;j++)
lf(a[i]U]!=NoEdge&&(a[i][j]<Min||Min==NoEdge))
Min=a[i][j];
lf(Min==NoEdge)returnNoEdge;
MinOut[i]=Min;
MinSum+=Min;
)
〃初始化
MinHeapNode<Type>E;
bbnode*bb=newbbnode;
bb->parent=O;
bb->x=newint[n];
bb->s=0;
for(intj=O;j<n;j++)bb->x[j]=j+l;
E.ptr=bb;=0;E.rcost=MinSum;
Typebestc=NoEdge;
〃搜索排列空間樹(shù)
While(E.ptr->s<n-l){
lf(E.ptr->s==n-2){
lf(a[E.ptr->x[n-2]][E.ptr->x[n-l]]!=NoEdge&&a[E.ptr->x[n-l]][l]!=NoEdge&&{
+a.[E.ptr->x[n-2]][E.ptr->x[n-l]]+a[E.ptr->x[n-l]][l]<bestc||bestc==NoEdge)){
Bestc=+a.[E.ptr->x[n-2]][E.ptr->x[n-l]]+a[E.ptr->x[n-l]][l];
=bestc;
E.lcost=bestc;
E.ptr->s++;
H.lnsert(E);
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)儲(chǔ)占地合同范例
- 公司外貿(mào)合同范例
- 個(gè)人送餐合同范例
- 農(nóng)場(chǎng)車(chē)庫(kù)出租合同范例
- 企業(yè)員工招聘合同范例
- 中交集團(tuán)采購(gòu)合同范例
- 中日貿(mào)易合同范例
- 供貨服務(wù)合同范例
- 住宅產(chǎn)權(quán)購(gòu)房合同范例
- 代寫(xiě)投標(biāo)文件合同范例
- 新蘇教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 觸電事故應(yīng)急處置卡
- 國(guó)際貿(mào)易運(yùn)輸方式課件
- 南陽(yáng)理工學(xué)院畢業(yè)論文格式規(guī)范
- SolidWorks入門(mén)教程(很全面)PPT課件
- 日語(yǔ)五十音圖(清晰打印版)92905
- 新舊會(huì)計(jì)科目對(duì)照表
- 2019寧波地產(chǎn)品牌半程馬拉松 (海景風(fēng)情 健康寧波主題)活動(dòng)策劃方案-41P
- 醫(yī)用耗材超常預(yù)警和評(píng)價(jià)制度
- 性格色彩培訓(xùn)-團(tuán)隊(duì)培訓(xùn)必備
- 拆遷安置房小區(qū)物業(yè)管理的問(wèn)題與對(duì)策
評(píng)論
0/150
提交評(píng)論