算法設(shè)計(jì)和分析作業(yè)_第1頁(yè)
算法設(shè)計(jì)和分析作業(yè)_第2頁(yè)
算法設(shè)計(jì)和分析作業(yè)_第3頁(yè)
算法設(shè)計(jì)和分析作業(yè)_第4頁(yè)
算法設(shè)計(jì)和分析作業(yè)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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):專業(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塊錢會(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)生的排列樹。

分析與解答:排列樹中結(jié)點(diǎn)類型定義為:

classbbnode{

public:

bbnode*parent;

ints,*x;

);

保存已產(chǎn)生的排列樹的旅行售貨員問(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;

〃搜索排列空間樹

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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論