算法期末考試練習題!!!


一、選擇題

1.算法分析中,記號O表示(B),記號Ω標售(A),記號Θ表示(D)

A 漸進下界 B 漸進上界 C 非緊上界 D 緊漸進界 E 非緊下界

2.以下關於漸進記號的性質是正確的有:(A)

A  f(n) =Θ(g(n)),g(n) =Θ(h(n)) ⇒f(n) =Θ(h(n))

B  f(n) =O(g(n)),g(n) =O(h(n)) ⇒h(n) =O(f(n))

C  O(f(n))+O(g(n)) = O(min{f(n),g(n)}) 

D  f(n) = O(g(n)) ⇔g(n) = O(f(n))

3. 記號O的定義正確的是(A)。

A O(g(n)) = { f(n) | 存在正常數c和n0使得對所有n≥n0有:0≤ f(n) ≤ cg(n) };

B O(g(n)) = { f(n) | 存在正常數c和n0使得對所有n≥n0有:0≤ cg(n) ≤ f(n) };

C  O(g(n)) = { f(n) | 對於任何正常數c>0,存在正數和n0 >0使得對所有n≥n0有:0 ≤f(n)<cg(n) };

D  O(g(n)) = { f(n) | 對於任何正常數c>0,存在正數和n0 >0使得對所有n≥n0有:0 ≤cg(n) < f(n) }; 

4. 記號Ω的定義正確的是(B)。

A   O(g(n)) = { f(n) | 存在正常數c和n0使得對所有n≥n0有:0≤ f(n) ≤ cg(n) };

B   O(g(n)) = { f(n) | 存在正常數c和n0使得對所有n≥n0有:0≤ cg(n) ≤ f(n) };

C   (g(n)) = { f(n) | 對於任何正常數c>0,存在正數和n0 >0使得對所有n≥n0有:0 ≤f(n)<cg(n) };

D   (g(n)) = { f(n) | 對於任何正常數c>0,存在正數和n0 >0使得對所有n≥n0有:0 ≤cg(n) < f(n) }; 

5. T(n)表示當輸入規模為n時的算法效率,以下算法效率最優的是( C )

A T(n)= T(n – 1)+1,T(1)=1    

B T(n)=  2n2

C T(n)= T(n/2)+1,T(1)=1      

D T(n)= 3nlog2n

6. 動態規划算法的基本要素為(C)

A  最優子結構性質與貪心選擇性質

B 重疊子問題性質與貪心選擇性質

C 最優子結構性質與重疊子問題性質

D  預排序與遞歸調用

7.下列不是動態規划算法基本步驟的是(   A    )。

A 找出最優解的性質            B 構造最優解  

C 算出最優解                  D 定義最優解

8.能采用貪心算法求最優解的問題,一般具有的重要性質為:(A)

A 最優子結構性質與貪心選擇性質

B 重疊子問題性質與貪心選擇性質

C 最優子結構性質與重疊子問題性質

D 預排序與遞歸調用

9.下面是貪心算法的基本要素的是(      C     )。

A 重疊子問題  B 構造最優解  C 貪心選擇性質  D 定義最優解

10(   D   )是貪心算法與動態規划算法的共同點。

A 重疊子問題          B 構造最優解

C 貪心選擇性質        D 最優子結構性質

11.使用分治法求解不需要滿足的條件是(A )。

A 子問題必須是一樣的         B 子問題不能夠重復

C 子問題的解可以合並       D 原問題和子問題使用相同的方法解

12.實現循環賽日程表利用的算法是(    A      )。

A 分治策略       B 動態規划法  

C 貪心法         D 回溯法

13.使用分治法求解不需要滿足的條件是(A )。

A 子問題必須是一樣的         B 子問題不能夠重復

C 子問題的解可以合並       D 原問題和子問題使用相同的方法解

14.下列算法中不能解決0/1背包問題的是(A )

A 貪心法  B 動態規划  C 回溯法  D 分支限界法

15.以下( C )不能不能在線性時間完成排序

A 計數排序     B 基數排序      C 堆排序      D 桶排序

16.下列哪一種算法是隨機化算法(    D     )

A 貪心算法     B 回溯法     C 動態規划算法    D 舍伍德算法

17. 下列算法中通常以自底向上的方式求解最優解的(    B     )。 A 分治法     B 動態規划法    C 貪心法    D 回溯法

18. n個人拎着水桶在一個水龍頭前面排隊打水,水桶有大有小,水桶必須打滿水,水流恆定。如下 ( A ) 說法不正確?A

A 讓水桶大的人先打水,可以使得每個人排隊時間之和最小

B 讓水桶小的人先打水,可以使得每個人排隊時間之和最小

C 讓水桶小的人先打水,在某個確定的時間t內,可以讓盡可能多的人打上水

D 若要在盡可能短的時間內,n個人都打完水,按照什么順序其實都一樣

19.哈弗曼編碼的貪心算法所需的計算時間為 (  B    )。

A O(n2n)  B O(nlogn)  C O(2n)  D O(n)

20.下面關於NP問題說法正確的是(B )

A NP問題都是不可能解決的問題   

B P類問題包含在NP類問題中

C NP完全問題是P類問題的子集    

D NP類問題包含在P類問題中

21.背包問題貪心算法所需的計算時間為(  B   )   

A O(n2n)  B O(nlogn)  C O(2n)  D O(n)

22.背包問題的回溯算法所需的計算時間為(  A   )  

A O(n2n)  B O(nlogn)  C O(2n)  D O(n)

23.采用最大效益優先搜索方式的算法是(  A   )  

A 分支界限發      B 動態規划法     C 貪心法    D 回溯法

24. 在棋盤覆蓋問題中,對於2k×2k的特殊棋盤(有一個特殊方塊),所需的L型骨牌的個數是 ( A )

A ( 4k – 1)/3  B 2k /3      C 4k      D 2k

25. 下列隨機算法中運行時有時候成功有時候失敗的是(C )

A 數值概率算法 B 舍伍德算法 C 拉斯維加斯算法 D 蒙特卡羅算法

26. 實現大整數的乘法是利用的算法(      C   )。

A 貪心法    B 動態規划法   C 分治策略  D 回溯法

二、填空題

1.算法的復雜性有    時間    復雜性和    空間     復雜性之分。

2.矩陣連乘問題的算法可由  動態規划  設計實現。

3.從分治法的一般設計模式可以看出,用它設計出的程序一般是  遞歸算法  。

4.算法是由若干條指令組成的有窮序列,且要滿足輸入輸出確定性有限性四條性質。

5.快速排序算法的性能取決於  划分的對稱性 

6.使用二分搜索算法在n個有序元素表中搜索一個特定元素,在最佳情況下,搜索的時間復雜性為O( 1 ),在最壞情況下,搜索的時間復雜性為O( logn  )

三、解答題

1. 給定已按升序排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定元素x,返回其在數組中的位置,如果未找到返回-1。 寫出二分搜索的算法,並分析其時間復雜度

2. 分析最有搜索二叉樹和0/1背包的時間復雜度

3. 試用動態規划算法實現最大子矩陣和問題:求n×m矩陣A的一個子矩陣,使其各元素之各為最大

4已知輸入向量a=(1,3,4,-2),給出用FFT的蝶形操作求輸出向量y的結果,並分析出FFT的計算時間復雜度。

 

1.采用遞歸算法求遞歸方程F(n)=F(n-1(+F(n-2),算法描述如下(就是遞歸fibonacci!)

問:算法共需要進行多少次遞歸調用(算法中沒引用F(i)一次稱為一次遞歸調用)。有沒有更好的算法來計算F(n)?若有請描述算法並分析復雜度。

2.如下算法是否產生平均分布的隨即置換?為什么?

Permute-With-All(A)

  n←length(A)

  for i←1 to n

     swap(A[i],A[RANDOM(1,n)])

注:RANDOM(1,n)隨機、等可能地返回整數k,1≤k≤n

3. 能否在給定的s[n]中判斷是否存在兩個數的和為x,並且時間復雜度是nlgn,如果可以寫出程序的偽代碼,否則給出理由。

6. 活動選擇問題

(1)遞歸的時間復雜度分析

(2)動態規划的時間復雜度分析

(3)寫出一個更優的算法,並且對其進行時間復雜度分析

7. 多項式乘法問題

描述一個高效的算法來解決復數之間的多項式乘法,多項式的系數為復數,未知數也為復數。

並且對此進行時間復雜度分析。

 

鄭55                           算法2013考試題

填空:

  1. 給一系列的函數,根據漸進性,從大到小排列n^3/2,nlgn,lgn,e^n,n!,n^2
  2. 動歸的兩個性質
  3. 貪心的兩個性質
  4. 1)NP問題:  2)P問題
  5. 面試問題 雇一個人的概率:  ,雇n個人的概率:
  6. 復雜度分為:  和  ;動歸是犧牲   復雜度換取   復雜度
  7. 使用二分搜索算法在n個有序元素表中搜索一個特定元素,在最佳情況下,搜索的時間復雜性為O( 1 ),在最壞情況下,搜索的時間復雜性為O( logn  )。

選擇:

1攤還排序是()情況下的()代價

A最優B最壞C平均D最好

2動態規划的設計思想是a

(a)自底向上   (b)自上而下   (c)從左向右   (d)從右向左

3貪心算法的設計思想是b

(a)自底向上   (b)自上而下   (c)從左向右   (d)從右向左

4以下哪一個更可能描述實際一個有效的算法d

(a)    (b)    (c)    (d)

5蝶形操作的設計思想是a

(a)分治法   (b)貪心算法   (c)動態規划   (d)回溯

6以下哪一個不是NPC問題

(a)單源最短路徑   (b)巡回售貨員問題   (c)布爾可滿足性問題   (d)大數分解

7以下哪個不是幾何研究中的基本操作

(a)+   (b)—   (c)×   (d)/

8哪個問題不能用貪心算法解決

(a)活動安排   (b)哈夫曼編碼   (c)分數背包   (d)0-1背包

9哪個問題不能用動態規划解決c

(a)分數背包   (b)0-1背包   (c)最長簡單路徑   (d)最短簡單路徑

10插入排序的最好時間復雜度是a

(a)n   (b)n^2   (c)nlgn   (d)lgn

11歸並排序的時間復雜度是c

(a)n   (b)n^2   (c)nlgn   (d)lgn

12算法分析中,記號O表示(B),記號Ω標售(A),記號Θ表示(D)

A 漸進下界 B 漸進上界 C 非緊上界 D 緊漸進界 E 非緊下界

13.n個人拎着水桶在一個水龍頭前面排隊打水,水桶有大有小,水桶必須打滿水,水流恆定。如下 ( A ) 說法不正確?A

A 讓水桶大的人先打水,可以使得每個人排隊時間之和最小

B 讓水桶小的人先打水,可以使得每個人排隊時間之和最小

C 讓水桶小的人先打水,在某個確定的時間t內,可以讓盡可能多的人打上水

D 若要在盡可能短的時間內,n個人都打完水,按照什么順序其實都一樣

14.哈弗曼編碼的貪心算法所需的計算時間為 (  B    )。

A O(n2n)  B O(nlogn)  C O(2n)  D O(n)

15.下面關於NP問題說法正確的是(B )

A NP問題都是不可能解決的問題   

B P類問題包含在NP類問題中

C NP完全問題是P類問題的子集    

D NP類問題包含在P類問題中

大題

  1. 四路歸並排序:分解時分成四個,合並等其他步驟與二路歸並相似,請寫出核心算法,並分析時間復雜度。
  2. 矩陣鏈乘積的遞歸算法

T(n)= 1    n=1

  n>=2

請詳細分析該算法的時間復雜度

  1. 給出最優二叉搜索樹的程序代碼和p,q概率

根據概率1)求e,w,root,2)畫出二叉樹的結構3)請說出root[i,j]有什么意義

(見3621大班試卷影印版的第五題)

  1. FFt蝶形操作 見3621大班試卷的影印版第九題
  2. 字符串自動機構造,見書

 

2006-2007學年第二學期《計算機算法設計與分析》試題

院系:軟件學院   專業:軟件工程   年級:2004級

 

一.簡答題(共10分)

 

二.計算題(35分)

1.(6分) 對下列各組函數f(n)和g(n),確定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n))。

(1)   f(n)=3n,g(n)=2n

(2)   f(n)=log n + 5,g(n)=log n2

(3)   f(n)=log n,g(n)=

答:

(1)                                 f(n) = Ω(g(n))         (2分)

(2)                                 f(n) = θ(g(n))         (2分)

(3)                                 f(n) = O(g(n))          (2分)

 

2.(8分)采用動態規划策略,計算a={5,-3,7,-4,-5,9,-2,10,-3,2}的最大子段和,並給出這個最大子段和的起始下標和終止下標。[設數組a中的元素下標從1開始。]要求給出過程。

答:

       b[1]=5;

       b[2]=max{b[1]+a[2],a[2]}=max{2,-3}=2

b[3]=max{b[2]+a[3],a[3]}=max{9,7}=9

b[4]=max{b[3]+a[4],a[4]}=max{5,-4}=5

b[5]=max{b[4]+a[5],a[5]}=max{0,-5}=0

b[6]=max{b[5]+a[6],a[6]}=max{9,9}=9

b[7]=max{b[6]+a[7],a[7]}=max{7,-2}=7

b[8]=max{b[7]+a[8],a[8]}=max{17,10}=17

b[9]=max{b[8]+a[9],a[9]}=max{14,-3}=14

b[10]=max{b[9]+a[10],a[10]}=max{16,2}=16

(上述每兩行1分,共5分)

最大子段和為17(1分)

(若數組下標從1開始)起始下標:6(1分),終止下標:8(1分)

(若數組下標從0開始)起始下標:5(0.5分),終止下標:7(0.5分)

 

3.(11分)設有3件工作分配給3個人,將工作i分配給第j個人所花的費用為Cij,現將為每一個人都分配1件不同的工作,並使總費用達到最小。設:

      

要求:

(1)畫出該問題的解空間樹;(6分)

(2)寫出該問題的剪枝策略(限界條件);(1分)

(3)按回溯法搜索解空間樹,並利用剪枝策略對應該剪掉的子樹打´;(2分)

(4)最終給出該問題的最優值和最優解。(2分)

答:

     (1)

                                   

1         2        3             

2       3      1      3       1      2

         

              1        1      2        2      3        3

      

                                                 

             3          2     3        1      2        1

                       

           16        16   9      9      9      9

                         ╳               ╳        ╳        ╳

         (每個分枝1分,或者是每層2分,共6分)

       (2)當耗費大於等於當前最優值時,剪枝。(1分)

       (3)見上圖。(每2個 1分,共2分)

    (4)最優值: 9   (1分)

        最優解:2,1,3

 

 

 

4.(8分)給定兩個序列X=<A,B,C,B,A>,Y=<B,D,C,A,B>,請采用動態規划策略求出其最長公共子序列。要求給出過程。

答:

j   0    1     2     3     4      5   

i         yi      B    D     C     A     B   

0   xi    0    0    0      0     0      0    

1   A    0    0    0      0     1      1    

2   B    0    1    1      1     1      2    

3   C   0    1    1      2     2      2   

4   B    0    1    1      2     2      3   

5      0    1    2      2     2      3    

         (上述表內每一行一分,共6分)

         最長公共子序列為<B,C,B>  (2分)

   

5.(2分)考慮n=3時的0-1背包問題的實例:W={15,10,10},P={50,30,30},c=20。當x[1]=1,x[2]=0時,請計算Bound(2)。

答:

Bound(3)=50+5/10 * 20 = 65    (2分)

 

三、算法填空題(共10分,每空2分)

給定n種物品和一個背包,物品i的重量是w[i], 其價值是p[i], 背包的容量為c。設物品已按單位重量價值遞減的次序排序。每種物品不可以裝入背包多次,但可以裝入部分的物品i。求解背包問題的貪心算法如下:

float Knapsack (float x[ ], float w[ ], float p[ ],float c, int n)  

{ float maxsum=           ;   // maxsum表示裝進包的物品價值總和               

for ( int i=1;i<=n; i++)  x[i]=0 // x[i]=0表示第i個物品未裝進包         

for (                         )                        

         if(                )                                

{ x[i] =1;                                 

             maxsum+=             ;                           

             c- = w[i];                                

       }

         else break;                               

if (c>0) {x[i]=c/w[i];                   ;}      

return maxsum;                             

}

答:(共5個空,每空2分,總計10分)

       0 

       int i=1;i<=n;i++

       w[i]<=C

       p[i]

       maxsum+ = p[i] * c / w[i]

 

四、算法設計及分析題(共45分)

1.(20分)請用分治策略設計遞歸的二分檢索算法,並分析其時間復雜性(要求給出每個階段所花的時間,在此基礎上列出遞歸方程,並求出其解的漸進階)。

答:(此題解法不唯一)

算法:

int bsearch(A[],K,L,H)                                          1分)

{ if (H<L)  return(-1);                                           (2)

 else

{ mid=(L+H) /2;                                            (2)

          if (A[mid] == K)                                      (1)

              return(mid)                                    (1)

     else if A[mid]>K                                       (2)

return(bsearch(A,K,L, mid-1)) ;                     (2

         else  return(bsearch(K, mid+1,H));                       (2)

     }

}

 

 

算法時間復雜性分析:

Divide階段所花時間為O(1)                                   (1)

   Conquer階段所花時間為T(n/2)                              (1)

   merge階段沒有花時間(或者說,merge階段所花時間為O(1) (1)

算法時間復雜性遞歸方程如下:

   T(n)=O(1)             n0

     T(n)= T(n/2)+O1    n>1                              (2)

  用套用公式法(master method)求解遞歸方程:

     a=1,b=2,                                  

   f(n)=O(1), f(n)同階                             

T(n)= O(log n)                                                     (2)

 

2.(15分)請用回溯法設計算法,用四種顏色給地圖着色(若在調用了其它算法,也需將該算法寫出)。請在每個循環語句和條件判斷語句后加注釋。

答:(此題解法不唯一)

算法:

boolColor::Ok(int k)                                                 

{ for (int j=1; j<k; j++) //檢查前k-1個點與當前點(第k點)顏色是否沖突 (2)

if ((a[k][j]==1)&&(x[j]==x[k]))

//判斷第j點與當前點(第k點)顏色是否沖突  (2)

return false;                                            (1)

else  return true;                                                       (1)

}

 

void Color::Backtrack(int t)                                                   

{ if (t > n)  // 判斷是否到葉節點                                            (1)

{ sum++;                                                              

for (int i=1;i<=n; i++) //輸出每個點的色號                                 

cout << x[i]<< ’  ’ ;                                              

cout << endl;                                                         2分)

}

else  

for (int i=1; i<=4; i++) // 依次檢查當前點(第t點)是否可着第i(1≤i≤4)種顏色  (2)

{ x[t]=i;                                                               (1)

if (Ok(t))  Backtrack(t+1); //若當前點(第t點)可着第i種顏色,則遞歸調用  (3)

}

}

 

3.(10分)請設計一個算法,實現優先隊列的出隊操作。要求:

(1)指出用什么數據結構實現優先隊列;

(2)用C語言描述算法。

答:(此題解法不唯一)

       (1)用堆實現優先隊列。     (2分)

       (2)算法

              SIFT(k,i,m)

              {temp = k[i];              

               j=2*i;                    (1分)

               while (j<=m)              (1分)

                      { if((j<m)&&(R[j].key<R[j+1].key))j++;  (1分)

if (temp.key <R[j].key)                 (1分)

        { R[i] = R[j];

          i=j; j=2*i;                       (1分)

        }

else break;                               (0.5分)

        R[i]=temp;                                    (0.5分)

       }

 

      Delete(n) 

          { temp = R[1]; R[1]=R[i]; R[i]=temp;        (1分)

SIFT(k,1,n-1);                        (1分)

       }

 

 

算法導論試題

題型:選擇+解答

一,選擇

(1)       動態規划的設計思想是a

(a)自底向上   (b)自上而下   (c)從左向右   (d)從右向左

(2)       貪心算法的設計思想是b

(a)自底向上   (b)自上而下   (c)從左向右   (d)從右向左

(3)       以下哪一個更可能描述實際一個有效的算法d

(a)    (b)    (c)    (d)

(4)       蝶形操作的設計思想是a

(a)分治法   (b)貪心算法   (c)動態規划   (d)回溯

(5)       以下哪一個不是NPC問題

(a)單源最短路徑   (b)巡回售貨員問題   (c)布爾可滿足性問題   (d)大數分解

(6)       以下哪個不是幾何研究中的基本操作

(a)+   (b)—   (c)×   (d)/

(7)       哪個問題不能用貪心算法解決

(a)活動安排   (b)哈夫曼編碼   (c)分數背包   (d)0-1背包

(8)       哪個問題不能用動態規划解決c

(a)分數背包   (b)0-1背包   (c)最長簡單路徑   (d)最短簡單路徑

(9)       插入排序的最好時間復雜度是a

(a)n   (b)n^2   (c)nlgn   (d)lgn

(10)   歸並排序的時間復雜度是c

(a)n   (b)n^2   (c)nlgn   (d)lgn

 

二,解答題(共6題,此處少1題)

(1)       編寫偽代碼並分析時間復雜度,需要設計的程序是:運用遞歸算法設計插入排序,並且用到折半查找。提示:要排序a[1……n],先排a[1……n-1],插入a[n]用折半查找。

(2)       能否在給定的s[n]中判斷是否存在兩個數的和為x,並且時間復雜度是nlgn,如果可以寫出程序的偽代碼,否則給出理由。

(3)       兩個n維矩陣乘法A×B=C,將A,B分解為4個n/2維的矩陣,分析以下算法的時間復雜度。

A=,B=,C=

定義P1=(A11+A22)(B11+B22),P2=(A11+A22)B11,P3=A11(B11-B22),P4=A22(-B11+B22),P5=(A12+A11)B22,P6=(-A11+A21)(B11+B12),P7=(A12-A22)(B11+B22)

則C11=P1+P4-P5+P7,C12=P3+P5,C21=P2+P4,C22=P1+P3-P2+P6

(4)       遞歸斐波納切數列的時間復雜度

(5)       矩陣鏈乘法計算最優代價,需要畫出和書本上p200類似的三角形圖(動態規划)

 

 

一。選擇題

1、二分搜索算法是利用(   A      )實現的算法。

A、分治策略   B、動態規划法   C、貪心法    D、回溯法

2、下列不是動態規划算法基本步驟的是(   A    )。

A、找出最優解的性質   B、構造最優解   C、算出最優解   D、定義最優解

3、最大效益優先是(  A         )的一搜索方式。

A、分支界限法      B、動態規划法    C、貪心法    D、回溯法

4、在下列算法中有時找不到問題解的是( B       )。

A、蒙特卡羅算法    B、拉斯維加斯算法   C、舍伍德算法   D、數值概率算法

5. 回溯法解旅行售貨員問題時的解空間樹是( A      )。

A、子集樹         B、排列樹     C、深度優先生成樹    D、廣度優先生成樹

6.下列算法中通常以自底向上的方式求解最優解的是(   B      )。

A、備忘錄法       B、動態規划法     C、貪心法                D、回溯法

7、衡量一個算法好壞的標准是(C )。
A 運行速度快 B 占用空間少 C 時間復雜度低 D 代碼短
8、以下不可以使用分治法求解的是(D )。
A 棋盤覆蓋問題 B 選擇問題 C 歸並排序 D 0/1背包問題
9. 實現循環賽日程表利用的算法是(    A      )。

A、分治策略          B、動態規划法        C、貪心法         D、回溯法

10、下列隨機算法中運行時有時候成功有時候失敗的是(C )
A 數值概率算法 B 舍伍德算法 C 拉斯維加斯算法 D 蒙特卡羅算法

11.下面不是分支界限法搜索方式的是(     D     )。

A、廣度優先       B、最小耗費優先   C、最大效益優先      D、深度優先

12.下列算法中通常以深度優先方式系統搜索問題解的是(      D   )。

A、備忘錄法       B、動態規划法     C、貪心法                D、回溯法

13.備忘錄方法是那種算法的變形。(     B )

A、分治法     B、動態規划法     C、貪心法                D、回溯法

14.哈弗曼編碼的貪心算法所需的計算時間為(   B     )。

A、O(n2n)       B、O(nlogn)     C、O(2n)               D、O(n)

15.分支限界法解最大團問題時,活結點表的組織形式是(    B    )。

A、最小堆            B、最大堆         C、棧                    D、數組

16.最長公共子序列算法利用的算法是(    B       )。

A、分支界限法     B、動態規划法        C、貪心法            D、回溯法

17.實現棋盤覆蓋算法利用的算法是(     A      )。

A、分治法         B、動態規划法     C、貪心法                D、回溯法

18.下面是貪心算法的基本要素的是(      C     )。

A、重疊子問題     B、構造最優解     C、貪心選擇性質      D、定義最優解

19.回溯法的效率不依賴於下列哪些因素(   D     )

A.滿足顯約束的值的個數             B. 計算約束函數的時間 

C. 計算限界函數的時間              D. 確定解空間的時間

20.下面哪種函數是回溯法中為避免無效搜索采取的策略(    B    )

A.遞歸函數       B.剪枝函數        C。隨機數函數        D.搜索函數

21、下面關於NP問題說法正確的是(B )
A NP問題都是不可能解決的問題
B P類問題包含在NP類問題中
C NP完全問題是P類問題的子集
D NP類問題包含在P類問題中

22、蒙特卡羅算法是(   B      )的一種。

A、分支界限算法      B、概率算法    C、貪心算法    D、回溯算法

23.下列哪一種算法不是隨機化算法(    C     )

A. 蒙特卡羅算法B. 拉斯維加斯算法C.動態規划算法D.舍伍德算法

24. (   D         )是貪心算法與動態規划算法的共同點。

A、重疊子問題 B、構造最優解 C、貪心選擇性質      D、最優子結構性質

25. 矩陣連乘問題的算法可由(          B)設計實現。

A、分支界限算法      B、動態規划算法    C、貪心算法    D、回溯算法

26. 分支限界法解旅行售貨員問題時,活結點表的組織形式是(   A    )。

A、最小堆         B、最大堆         C、棧                D、數組

27、Strassen矩陣乘法是利用(    A     )實現的算法。

A、分治策略   B、動態規划法   C、貪心法    D、回溯法

29、使用分治法求解不需要滿足的條件是(A )。
A 子問題必須是一樣的
B 子問題不能夠重復
C 子問題的解可以合並
D 原問題和子問題使用相同的方法解
30、下面問題(B )不能使用貪心法解決。
A 單源最短路徑問題          B N皇后問題
C 最小花費生成樹問題        D 背包問題
31、下列算法中不能解決0/1背包問題的是(A )
A 貪心法 B 動態規划 C 回溯法 D 分支限界法
32、回溯法搜索狀態空間樹是按照(C )的順序。
A 中序遍歷 B 廣度優先遍歷 C 深度優先遍歷 D 層次優先遍歷

33、下列隨機算法中運行時有時候成功有時候失敗的是(C )
A 數值概率算法 B 舍伍德算法 C 拉斯維加斯算法 D 蒙特卡羅算法
34.實現合並排序利用的算法是(     A    )。

A、分治策略          B、動態規划法        C、貪心法         D、回溯法

35.下列是動態規划算法基本要素的是(  D     )。

A、定義最優解        B、構造最優解        C、算出最優解     D、子問題重疊性質

36.下列算法中通常以自底向下的方式求解最優解的是(    B     )。

A、分治法            B、動態規划法        C、貪心法         D、回溯法

37.采用廣度優先策略搜索的算法是(     A      )。

A、分支界限法        B、動態規划法        C、貪心法         D、回溯法

38、合並排序算法是利用(   A      )實現的算法。

A、分治策略   B、動態規划法   C、貪心法    D、回溯法

39、在下列算法中得到的解未必正確的是(  B      )。

A、蒙特卡羅算法    B、拉斯維加斯算法   C、舍伍德算法   D、數值概率算法

40、背包問題的貪心算法所需的計算時間為(  B      )

A、O(n2n)     B、O(nlogn)    C、O(2n)      D、O(n)

41.實現大整數的乘法是利用的算法(      C   )。

A、貪心法            B、動態規划法        C、分治策略       D、回溯法

42.0-1背包問題的回溯算法所需的計算時間為(  A      )

A、O(n2n)          B、O(nlogn)        C、O(2n)        D、O(n)

43.采用最大效益優先搜索方式的算法是(   A        )。

A、分支界限法        B、動態規划法        C、貪心法         D、回溯法

44.貪心算法與動態規划算法的主要區別是(  B         )。

A、最優子結構        B、貪心選擇性質      C、構造最優解     D、定義最優解

45. 實現最大子段和利用的算法是(     B      )。

A、分治策略          B、動態規划法        C、貪心法         D、回溯法

46.優先隊列式分支限界法選取擴展結點的原則是(     C      )。

A、先進先出          B、后進先出          C、結點的優先級   D、隨機

47.背包問題的貪心算法所需的計算時間為(   B     )。

A、O(n2n)           B、O(nlogn)     C、O(2n)            D、O(n)

48、廣度優先是(    A       )的一搜索方式。

A、分支界限法      B、動態規划法    C、貪心法    D、回溯法

49、舍伍德算法是(    B     )的一種。

A、分支界限算法      B、概率算法    C、貪心算法    D、回溯算法

50、在下列算法中有時找不到問題解的是(  B      )。

A、蒙特卡羅算法    B、拉斯維加斯算法   C、舍伍德算法   D、數值概率算法

51下列哪一種算法是隨機化算法(    D     )

A. 貪心算法B. 回溯法C.動態規划算法D.舍伍德算法

52. 一個問題可用動態規划算法或貪心算法求解的關鍵特征是問題的(   B          )。

A、重疊子問題     B、最優子結構性質    C、貪心選擇性質   D、定義最優解

53.采用貪心算法的最優裝載問題的主要計算量在於將集裝箱依其重量從小到大排序,故算法的時間復雜度為    (     B           ) 。

A、O(n2n)           B、O(nlogn)     C、O(2n)            D、O(n)

54. 以深度優先方式系統搜索問題解的算法稱為  (     D   )             。

A、分支界限算法      B、概率算法    C、貪心算法    D、回溯算法

55. 實現最長公共子序列利用的算法是(     B      )。

A、分治策略          B、動態規划法        C、貪心法         D、回溯法

 

二、 填空題

1.算法的復雜性有         時間          復雜性和    空間         復雜性之分。

2、程序是    算法     用某種程序設計語言的具體實現。

3、算法的“確定性”指的是組成算法的每條  指令  是清晰的,無歧義的。

4.矩陣連乘問題的算法可由  動態規划  設計實現。

5、拉斯維加斯算法找到的解一定是   正確解。

6、算法是指解決問題的   一種方法    一個過程  。

7、從分治法的一般設計模式可以看出,用它設計出的程序一般是  遞歸算法  。

8、問題的    最優子結構性質  是該問題可用動態規划算法或貪心算法求解的關鍵特征。

9、以深度優先方式系統搜索問題解的算法稱為   回溯法 

10、數值概率算法常用於  數值問題   的求解。

11、計算一個算法時間復雜度通常可以計算  循環次數 、  基本操作的頻率       或計算步。

12、利用概率的性質計算近似值的隨機算法是__數值概率算法,運行時以一定的概率得到正確解的隨機算法是__蒙特卡羅算法_____________________。

14、解決0/1背包問題可以使用動態規划、回溯法和分支限界法,其中不需要排序的是   動態規划    ,需要排序的是  回溯法   ,分支限界法    。
15、使用回溯法進行狀態空間樹裁剪分支時一般有兩個標准:約束條件和目標函數的界,N皇后問題和0/1背包問題正好是兩種不同的類型,其中同時使用約束條件和目標函數的界進行裁剪的是     0/1背包問題   ,只使用約束條件進行裁剪的是    N皇后問題     。

16、  貪心選擇性質  是貪心算法可行的第一個基本要素,也是貪心算法與動態規划算法的主要區別。

17、矩陣連乘問題的算法可由   動態規划   設計實現。

18、拉斯維加斯算法找到的解一定是  正確解。

19.貪心算法的基本要素是     貪心選擇   質和    最優子結構              性質 。

21. 動態規划算法的基本思想是將待求解問題分解成若干    子問題        ,先求解  子問題          ,然后從這些  子問題        的解得到原問題的解。

22.算法是由若干條指令組成的有窮序列,且要滿足輸入、   輸出           、確定性和      有限性       四條性質。

23、大整數乘積算法是用   分治法   來設計的。

24、以廣度優先或以最小耗費方式搜索問題解的算法稱為   分支限界法   。

25、舍伍德算法總能求得問題的   一個解  。

26、  貪心選擇性質  是貪心算法可行的第一個基本要素,也是貪心算法與動態規划算法的主要區別。

27.快速排序算法是基於       分治策略        的一種排序算法。

28.動態規划算法的兩個基本要素是.   最優子結構                性質和    重疊子問題                性質 。

 30.回溯法是一種既帶有    系統性             又帶有       跳躍性    的搜索算法。

31.分支限界法主要有    隊列式(FIFO)                分支限界法和      優先隊列式          分支限界法。

32.分支限界法是一種既帶有    系統性        又帶有       跳躍性    的搜索算法。

33.回溯法搜索解空間樹時,常用的兩種剪枝函數為   約束函數   和    限界函數          。

34.任何可用計算機求解的問題所需的時間都與其   規模   有關。

35.快速排序算法的性能取決於  划分的對稱性  。

三、算法填空

1.背包問題的貪心算法

void Knapsack(int n,float M,float v[],float w[],float x[])

{

       Sort(n,v,w);

       int i;

       for (i=1;i<=n;i++) x[i]=0;

       float c=M;

       for (i=1;i<=n;i++) {

          if (w[i]>c) break;

          x[i]=1;

          c - =w[i];

          }

       if (i<=n) x[i]=c/w[i];

}

2.最大子段和: 動態規划算法

int MaxSum(int n, int a[])

{

    int sum=0, b=0;   //sum存儲當前最大的b[j], b存儲b[j]

    for(int j=1; j<=n; j++)  { 

        if (b>0)  b+= a[j] ;

        else  b=a[i];     ;    //一旦某個區段和為負,則從下一個位置累和

 if(b>sum) sum=b;

 

     }

     return sum;

 }        

3.貪心算法求裝載問題

template<class Type>

void Loading(int x[],  Type w[], Type c, int n)

{

        int *t = new int [n+1];

                             ;

        for (int i = 1; i <= n; i++) x[i] = 0;

        for (int i = 1; i <= n && w[t[i]] <= c; i++)

 {x[t[i]] = 1;

           ;}

}

 

4.貪心算法求活動安排問題

template<class Type>

void GreedySelector(int n, Type s[], Type f[], bool A[])

{

       A[1]=true;

       int j=1;

       for (int i=2;i<=n;i++) {

          if (s[i]>=f[j])

{  A[i]=true;

j=i;

 }

          else A[i]=false;

          }

}

 

5.快速排序

template<class Type>

void QuickSort (Type a[], int p, int r)

{

      if (p<r) {

        int q=Partition(a,p,r);

        QuickSort (a,p,q-1); //對左半段排序

        QuickSort (a,q+1,r); //對右半段排序

        }

}

 

6.排列問題

Template <class Type>

void perm(Type list[],  int k, int m )

{ //產生[list[k:m]的所有排列

    if(k==m)

     {  //只剩下一個元素

         for (int i=0;i<=m;i++)  cout<<list[i];

         cout<<endl;

    }

    else  //還有多個元素待排列,遞歸產生排列

       for (int i=k; i<=m; i++)

        {

           swap(list[k],list[i]);

           perm(list,k+1;m);

           swap(list[k],list[i]);        

     }

  }

 

四、問答題

1.分治法的基本思想時將一個規模為n的問題分解為k個規模較小的子問題,這些子問題互相獨立且與原問題相同。遞歸地解這些子問題,然后將各個子問題的解合並得到原問題的解。

 

2設計動態規划算法的主要步驟為:

(1)找出最優解的性質,並刻划其結構特征。(2)遞歸地定義最優值。(3)以自底向上的方式計算出最優值。(4)根據計算最優值時得到的信息,構造最優解。

3. 分治法與動態規划法的相同點是:將待求解的問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。

兩者的不同點是:適合於用動態規划法求解的問題,經分解得到的子問題往往不是互相獨立的。而用分治法求解的問題,經分解得到的子問題往往是互相獨立的。

 

4. 分支限界法與回溯法的相同點是:都是一種在問題的解空間樹T中搜索問題解的算法。

不同點:(1)求解目標不同;

(2)搜索方式不同;

(3)對擴展結點的擴展方式不同;

(4)存儲空間的要求不同。

5用回溯法搜索子集樹的算法為:

void backtrack (int t)

{

  if (t>n) output(x);

    else

      for (int i=0;i<=1;i++) {

        x[t]=i;

        if (constraint(t)&&bound(t)) backtrack(t+1);

      }

}

6. 分治法所能解決的問題一般具有的幾個特征是:

(1)該問題的規模縮小到一定的程度就可以容易地解決;

(2)該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質;

(3)利用該問題分解出的子問題的解可以合並為該問題的解;

(4)原問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。

7. 用分支限界法設計算法的步驟是:

(1)針對所給問題,定義問題的解空間(對解進行編碼);分

(2)確定易於搜索的解空間結構(按樹或圖組織解) ;

(3)以廣度優先或以最小耗費(最大收益)優先的方式搜索解空間,並在搜索過程中用剪枝函數避免無效搜索。

8. 常見的兩種分支限界法的算法框架

(1)隊列式(FIFO)分支限界法:按照隊列先進先出(FIFO)原則選取下一個節點為擴展節點。 (2)優先隊列式分支限界法:按照優先隊列中規定的優先級選取優先級最高的節點成為當前擴展節點。

 

9. 回溯法中常見的兩類典型的解空間樹是子集樹和排列樹。

當所給的問題是從n個元素的集合S中找出滿足某種性質的子集時,相應的解空間樹稱為子集樹。這類子集樹通常有2n個葉結點,遍歷子集樹需O(2n)計算時間 。

當所給的問題是確定n個元素滿足某種性質的排列時,相應的解空間樹稱為排列樹。這類排列樹通常有n!個葉結點。遍歷排列樹需要O(n!)計算時間。

10. 分支限界法的搜索策略是:     

    在擴展結點處,先生成其所有的兒子結點(分支),然后再從當前的活結點表中選擇下一個擴展結點。為了有效地選擇下一擴展結點,加速搜索的進程,在每一個活結點處,計算一個函數值(限界),並根據函數值,從當前活結點表中選擇一個最有利的結點作為擴展結點,使搜索朝着解空間上有最優解的分支推進,以便盡快地找出一個最優解。

 

五、算法題

1. 給定已按升序排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定元素x,返回其在數組中的位置,如果未找到返回-1。

寫出二分搜索的算法,並分析其時間復雜度。

1. template<class Type>

int BinarySearch(Type a[], const Type& x, int n)

{//在a[0:n]中搜索x,找到x時返回其在數組中的位置,否則返回-1

     Int left=0;  int  right=n-1;

     While (left<=right){

        int middle=(left+right)/2;

        if (x==a[middle]) return middle;

        if (x>a[middle]) left=middle+1;

        else right=middle-1;

      }

      Return -1;

}

時間復雜性為O(logn)

2. 利用分治算法寫出合並排序的算法,並分析其時間復雜度

1. void MergeSort(Type a[], int left, int right)   

   {

      if (left<right) {//至少有2個元素

      int i=(left+right)/2;  //取中點

      mergeSort(a, left, i);

      mergeSort(a, i+1, right);

      merge(a, b, left, i, right);  //合並到數組b

      copy(a, b, left, right);    //復制回數組a

      }

   }

算法在最壞情況下的時間復雜度為O(nlogn)。

 

3.N皇后回溯法

bool Queen::Place(int k)

{ //檢查x[k]位置是否合法

 

  for (int j=1;j<k;j++)

    if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false;

  return true;

}

 

void Queen::Backtrack(int t)

{

  if (t>n) sum++;

  else    for (int i=1;i<=n;i++) {

      x[t]=i;

      if (   約束函數  ) Backtrack(t+1);

    }

}

 

4.最大團問題

void Clique::Backtrack(int i) // 計算最大團

{  if (i > n) { // 到達葉結點

      for (int j = 1; j <= n; j++) bestx[j] = x[j];

      bestn = cn;   return;}

 // 檢查頂點 i 與當前團的連接

   int OK = 1;

   for (int j = 1; j < i; j++)

      if (x[j] && a[i][j] == 0) {         // i與j不相連

         OK = 0;  break;}

 

   if (OK ) { // 進入左子樹

      x[i] = 1;  cn++;

      Backtrack(i+1);

      x[i] = 0; cn--;  }

  

  if (     cn + n - i > bestn       ) { // 進入右子樹

      x[i] = 0;

      Backtrack(i+1);  }

}

5.最長公共子序列問題

6.哈弗曼編碼算法

 

 

算法設計與分析試題

 

一、概念題

1.隊列    2. 完全二叉樹    3.堆        4.P類問題      5.NP問題

 

二、程序填空題

1.寬度優先圖周游算法

procedure bft(g,n)

      //g的寬度優先周游//

          declare visited(n)

          for iß1 to n do  //將所有結點標記為未訪問//

                    ⑴        

          repeat

          for i<--1 to n do  //反復調用bfs//

            if visited(i)=0 then      ⑵          endif

          repeat   

        end bft

2.找一個圖的所有m—着色方案 

     procedure  mcoloring(k)

//這是圖着色的一個遞歸回溯算法。圖g用它的布爾鄰接矩陣graPh(1:n,1:n)表示。它計算並打印出符合以下要求的全部解,把整數1,2,…,m分配給圖中各個結點且使相鄰近的結點的有不同的整數。k是下一個要着色結點的下標。//

global integer  m,n,x(1:n)boolean  graPh(1;n,1:n)

integer k

loop  //產生對x(k)所有的合法賦值。//

    call nextvalue(k)。//將一種合法的顏色分配給x(k)//

    if     ⑴         then  exit  endif  //沒有可用的顏色了//   

     if     ⑵      

      then print(x)  //至多用了m種顏色分配給n個結點//  

     else call  mcoloring<k+1)  //所有m—着色方案均在此反復遞歸調用中產生//

    endif

    repeat

    end mcoloring

 

三、問答題

1.二分查找的思想是什么?

2.請用遞歸方法寫出歸並排序法的主要思想和算法。  

3.已知如下多段圖,請用動態規划方法的向后處理法寫出求解此問題的遞推公式並完成對各結點的計算。

   

                   

4. 最小自然數:求具有下列兩個性質的最小自然數n:
    (1)n的個位數是6;
    (2)若將n的個位數移到其余各位數字之前,所得的新數是n的4倍。

提示:仍用窮舉法尋找,當找到一個符合條件者便停止。“找到便停止”的重復,宜采用repeat-until循環。

 

5. 以二叉鏈表為存儲結構,分別寫出求二叉樹結點總數及葉子總數的算法。

 

 Copyright ©2015 伊甸一點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM