算法基礎知識【3】(8-11)

Date: 2019-08-11

1.  算法的空間複雜度是指()。算法空間複雜度指的是算法 執行過程中需要佔用多少內存空間資源

回顧:算法的時間複雜度

2.  在索引順序表中,實現分塊查找,在等概率查找情況下,其平均查找長度不僅與表中元素個數有關,而且與每塊中元素個數有關。() 正確

解釋:在分塊查找過程中,先對塊間進行順序查找,然後對每個塊內進行查找(有時採用二分查找)

3.  下列排序算法中,已基本有序卻反而變得更復雜的排序算法是:( )。 快速排序算法

快排算法實質上是分治算法的應用:

  1. 快排採用分治的思想,第一次循環結束時,它實際上會產生一個軸,軸左邊的都小於軸值,右邊的都大於軸值,這樣通過軸就分成了兩個子序列,再對兩個子序列遞歸快排,最終得到排好序的序列。
  2. 快排對越混亂的數據,排序效果越好,現在說一下爲什麼對一個基本有序的卻更復雜,那是因爲這樣會導致每次軸劃分出的兩個子序列,一個趨近於1的數量級,一個趨近於n數量級,那麼遞歸快排就近似總是對n做排序,時間複雜度O(n²),而且非常不符合快排的思想。比較好的情況是每次遞歸大致平分成兩個n/2數量級的子序列,時間複雜度O(nlogn)

4.  需要藉助於一個隊列來實現DFS算法()   錯誤

解釋:

DFS是圖的深度優先遍歷算法。

例如,圖中A節點與B,C節點相連,B節點與D節點相連。從圖的頂底A開始,依次訪問B,D,C就是圖的深度優先遍歷。在訪問節點D的時候需要保持B的兄弟節點C,需要用到棧;   

即:DFS 深度優先遍歷,是先進後出的思想,需要用到棧這一種數據結構! 例如:回溯法便是典型的DFS算法,成爲擴展節點的節點可以再次成爲活節點。

同理:BFS廣度優先遍歷,是先進先出的思想,需要用到隊列這一中數據結構! 例如:分支界限法便是典型的BFS算法,成爲擴展節點的節點不可以再次成爲活節點了。

5.  下面的哪個序列可能是二叉搜索樹中序遍歷的結果?  B

73 8 2 9 4 11
2 3 4 7 8 9 11
11 2 9 3 8 4 7

解釋:因爲二叉搜索樹(Binary Search Tree)滿足:針對所有的節點,若有孩子節點,都有:左孩子的值要小於該節點,而右孩子的值都要大於該節點。如果進行中序遍歷(左中右),則返回的結果就是一個非遞減的序列

6.  在所有排序方法中,關鍵字比較的次數與記錄的初始排列次序無關的是()  比較:基數+選擇

7.  假設線性表的長度爲n,則在最壞情況下,冒泡排序需要的比較次數爲多少次?   (n*(n-1)/2)~O(n^2)

8.  在圖採用鄰接表存儲時,求最小生成樹的Prim算法的時間複雜度爲()  O(n+e)

9.  利用如下遞歸算法進行x(x(8))的計算時,需要進行多少次的調用x(n)?    18次

int x(int n)
{
 if(n<=3)
     return 1;
 else
     return x(n-2)+x(n-4)+1;
}

解釋: 

x(8)=x(6)+x(4)+1  遞歸計算x(8)第一次調用

x(6)=x(4)+x(2)+1  遞歸計算x(6)第二次調用

x(4)= x(2)+x(0)+1  遞歸計算x(4)第三次調用

x(4)= x(2)+x(0)+1   遞歸計算x(4)第四次調用

之後再調用x()計算黑體部分的結果(5次,加上前面4次,一共9次),最後x(8)返回值爲9

 

接着計算x(9)

x(9)=x(7)+x(5)+1  遞歸計算x(9)第一次調用

x(7)=x(5)+x(3)+1  遞歸計算x(7)第二次調用

x(5)=x(3)+x(1)+1  遞歸計算x(5)第三次調用

x(5)=x(3)+x(1)+1  遞歸計算x(5)第四次調用

之後再調用x()計算黑體部分的結果(5次,加上前面4次,一共9次),最後x(8)返回值爲9

 

所以總共調用x()的次數是9+9=18

10.  如果把傳輸速率定義爲單位時間內傳送的信息量(以字節計算)多少。關於一下幾種典型的數據傳輸速率:
1.使用USB2.0閃存盤,往USB閃存盤上拷貝文件的數據傳輸速率
2.使用100M以太網,在局域網內拷貝大文件時網絡上的數據傳輸速率
3.使用一輛卡車拉1000塊單塊1TB裝滿數據的硬盤,以100km/h的速度從上海到天津(100km)一趟所等價的數據傳輸帶寬
4.使用電腦播放MP3,電腦的PCI總線到聲卡的數據傳輸速率
在通常情況下,關於這幾個傳輸速率的排序正確的是()      4<1<2<3  【記住吧】

補充常識:

普通U盤寫數據的6MB/s,即48Mbps;

100M以太網的速率就是100Mbps;

卡車拉硬盤,1000x1000x8/3600=2222Mbps,這個應該是最快的;

MP3在256kbps碼率下也平均只有1分鐘2MB,所以不會超過0.3Mbps。

part two:

1.  下面程序段的時間複雜度: O(n^2)

k=1; 
for(i=0;i<n;i++) 
for(j=0;j<n;j++) 
A[i][j]=k++;

2.   排序算法中的比較次數與初始元素序列的排列無關()     錯誤,,這樣的說法太籠統了。選擇+基數的比較次數確實與初始序列無關;但是其他排序算法是有關的,尤其是快排 【目前公認的快排是針對混亂序列進行排序的最快排序算法】

3.  對線性表進行折半查找時,要求線性表必須以鏈式方式存儲,且結點按關鍵字有序排列,這樣的說法正確嗎?  錯誤

解釋:對線性表進行折半查找,也稱作二分查找,需要用到索引,所以需要是順序存儲的線性表,又因爲二分法,所以有序。

牛客上的他人的解釋:【注意:順序存儲不一定是有序存儲】

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。

 

爲什麼採取順序存儲結構:折半查找需要先對查找的數據集合排序,並且每次要獲得數據列表的中間位置,通過數組這種順序存儲結構,只要一次索引就能獲得中間值,如果是鏈式結構,就每次都要從頭遍歷到中間位置,耗費大量時間。

爲什麼有序:沒有序折半還有什麼意義?

4.   若用起泡排序方法對序列{10,14,26,29,41,52}從大到小排序,需進行(15)次比較  O(n*(n-1)/2)

解釋:發現本身是一個升序排列的序列,但要將其寫成降序排列,即現在是逆序的情況,則利用冒泡需要O(n*(n-1)/2)次比較。

5. 若需在O(nlogn)的時間內完成對數組的排序,且要求排序是穩定的,則可選擇的排序方法是()

解釋:穩定排序算法有:冒泡+歸併+插入+基數,其中時間複雜度爲O(logn)的有:歸併排序

6.  設一組初始記錄關鍵字序列(5,2,6,3,8),以第一個記錄關鍵字5爲基準進行一趟快速排序的結果爲() 3,2,5,6,8

上圖來源牛客

7.  京東商城plus會員的消費記錄金額分別爲900,512,613,700,810,若採用選擇排序算法對其進行從小到大的排序,第三趟排序結果爲:()   512613700900810

解釋: 從小到大的選擇排序算法,每次需要選擇最小的元素放在第一位 第二位 等

8.  設散列表的長度爲10,散列函數H(n)=n mod 7,初始關鍵字序列爲 (33,24,8,17,21,10),用鏈地址法作爲解決衝突的方法,平均查找長度是()  1.5  【注意這裏的平均查找長度的計算方法:是每一個數字的計算次數之和除以整個數組的長度】

解釋:

33/7=5, 查找33需要1次;

24/7=3,查找24需要1次;

8/7=1,查找8需要1次;

17/7=3,查找17需要2次;

21/7=0,查找21需要1次;

10/7=3,查找10需要3次;

ASL=每個關鍵字查找的次數之和/關鍵字的個數=(1+1+1+2+3+1)/6=1.5

9.  排序算法中,比較次數與初始序列無關的排序方法有哪些?  選擇排序 + 基數排序

算法複雜度與初始序列的狀態無關的有(最壞、最好、平均情況下時間複雜度相同):一堆(堆)烏龜(歸)選(選)基(基)友

比較次數與初始狀態無關的有: 選擇+ 基數

總移動次數與初始狀態無關的有::歸併+基數

10.  以下哪種操作更適合使用排序處理(   )   C

A. 找最大,最小值  (最大值或最小值可以通過一次遍歷得到。)
B. 找出現次數最多的值  (可以參考計數排序的思路,用一個數組記錄次數。只需一次遍歷。)
C. 找中間值   (只有排序後中間下標的值纔是中間值。)
D. 求算術平均值  (一次遍歷就可以直接計算。)

11.   對長度爲n的線性表排序,在最壞情況下,比較次數不是n(n-1)/2的排序方法是(  )。D

A. 快速排序 (逆序情況下,退化爲冒泡排序的比較次數)
B. 冒泡排序  (逆序情況下)
C. 直接插入排序  (逆序)
D. 堆排序 (三種情況下的時間複雜度相同,都爲O(logn))

12.  具有12個關鍵字的有序表,折半查找的平均查找長度()   3~4之間的數字,具體而言是log12(直接考慮時間複雜度)

更一般的解釋:12個關鍵字的有序表,折半查找的判定樹如下:
         6               (1*1)次      第一層 1個元素 1次
        /  \ 
       3   9            (2*2)次     第二層 2個元素 2次
      / \   / \
     1 4 7 11         (3*4)次    第三層 4個元素 3次
      \  \  \    / \
      2 5 8 10 12   (4*5)次     第四層 5個元素 4次

平均查找長度=1/12*(1*1+2*2+3*4+4*5)=37/12

13.  將兩個各有n個元素的有序表歸併成一個有序表,最少的比較次數是() n  最多比較次數爲2n-1

解釋: 把前一個表A中的第一個值與後一個表B相比較,發現最小的值比B的最大的值都要大,所以第一個回答中的次數其實不是1次,而是N次,因爲你沒辦法直接訪問到最後一個元素 ;而最多的情況是;兩個序列的元素的大小是交錯的。

14. 下面程序段的時間複雜度是:O(n^(1/2))

 

解釋:由題意k=1+2+3+...+i >n,當執行第i次後,條件不成立纔會結束。執行的次數爲i,所以i(i+1)/2>n的,省略常數項和低階項,則i約爲n^(1/2)

15.  下列哪個算法是對一個list排序的最快方法?  快速排序

16. 已知數組元素基本有序的情況下,下面採用那個算法對數組排序時間複雜度最低(D)   插入或者冒泡

A. 直接選擇排序(不變:O(n^2))
B. 堆排序  (不變:O(logn))
C. 快速排序  (基本有序,則最壞時間複雜度:O(n^2))
D. 插入排序   (O(n))

17.  在二叉排序樹(二叉搜索樹)中,最小值結點的( )。  左孩子一定爲空指針

解釋:根據二叉樹的性質:節點的左孩子的值小於該節點的值,而右孩子的值大於該節點的值。

18.  快速排序是基於比較的排序算法中平均性能最好的一種排序。( )  正確

補充解釋: 快速排序是在比較排序中平均性能最好的,但還有線性時間排序啊,比如:基數排序,計數排序,桶排序

19.  時間複雜度不受數據初始狀態影響而恆爲O(nlog2n)的是()。  歸併+堆排序

20.以下是什麼排序算法的應用:A

對數列 (25,84,21,47,15,27,68,35,20) 進行排序,元素序列的變化情況如下:

(1)25,84,21,47,15,27,68,35,20

(2)20,15,21,25,47,27,68,35,84

(3)15,20,21,25,35,27,47,68,84

(4)15,20,21,25,27,35,47,68,84

A. 快速排序
B. 簡單選擇排序
C. 希爾排序
D. 歸併排序

解釋:

從(1)到(2):取第一個數25,放到它應該在的位置,25左邊的數都比25小,右邊的都比25大;

從(2)到(3):對25左邊的數列和25右邊的數列{20,15,21},{47,27,68,35,84}分別進行快速排序,同樣先取各數列的第一個數20和47,使其分別放到應該在的位置,即左邊的數都比它小,右邊的都比它大;

從(3)到(4):對{15},{21},{35,27},{68,84}四個子序列進行排序,最終排序完成;

從整個過程分析,是一個快速排序的過程。

21. 有一組數據(15,9,7,8,20,-1,7,4),用堆排序的篩選方法降序排序建立的初始堆爲()  C

A. -1,4,8,9,20,7,15,7
B. -1,7,15,7,4,8,20,9
C. -1,4,15,9,20,7,7,8

解釋: 

堆排序要先建立一個初始堆,這裏是小頂堆,根據堆的定義

有父節點 <= 子節點,即 a[k]<=a[2k]  a[k]<=a[2k+1]

代入,只有 C符合

22. 循環隊列存儲在數組A[0..m]中,則入隊時的操作爲()   rear=(rear+1)mod(m+1)  注意:[0,m]有m+1個元素

23. 用常規的非遞歸方法遍歷一個平衡二叉樹,所需的時間複雜度和空間複雜度是?() O(n),O(n)

解釋:樹的深度最壞情況下爲n,所以空間複雜度爲O(n)。  遍歷一次,訪問一遍所有節點,並做記錄,空間和時間複雜度一樣

24.  

以下函數的時間複雜度和空間複雜度爲()  T(n)=O(2^n), S(n)= O(n)

解釋:

每個節點都會分裂爲兩個子節點,因此樹高爲n。

每次執行需要訪問f(n-1)和f(n-2),2次;程序共執行n次。時間複雜度爲O(2^n)

空間複雜度爲遞歸深度,即爲樹高O(n),每次都要return一個值,需要佔用一個存儲空間

25.  以下關於算法特性的描述中, (  2  ) 是正確的。
( 1 )算法至少有一個輸入和一個輸出
( 2 )算法至少有一個輸出但是可以沒有輸入
( 3 )算法可以永遠運行下去

補充解釋: 

”算法的五大特性:

1.有窮性;算法必須在執行有限次之後停止;

2.確切性,算法的每一步必須有確切的意義;

3.輸入項:0項或多項;

4.輸出項:至少一項,沒有輸出的算法是沒有意義的;

5.可行性。

26.  已知廣義表: A=(a,b), B=(A,A), C=(a,(b,A),B), 求下列運算的結果:   tail(head(tail(C))) =(  )  (A)

解釋:

head() 返回列表的第一個元素;head返回的是元素(去掉最外層括號)

tail() 返回列表的刪去第一個元素之後的剩餘列表;tail返回的是集合(保留括號)

所以,

tail(C)=((b,A),B);

head(tail(C))=head(   ((b,A),B)   )=(b,A)

tail(head(tail(C)))=tail((b,A))=(A)

27.  分支限界法與回溯法都是在問題的解空間樹T上搜索問題的解,關於二者說法中正確的是()  求解目標不同,搜素方式也不同

區分回溯法與分支界限法:

  • 回溯法
    1)(求解目標)回溯法的求解目標是找出解空間中滿足約束條件的一個解或所有解。
    2)(搜索方式:深度優先)回溯法會搜索整個解空間,當不滿條件時,丟棄,繼續搜索下一個兒子結點,如果所有兒子結點都不滿足,向上回溯到它的父節點。
  • 分支限界法
    1)(求解目標)分支限界法的目標一般是在滿足約束條件的解中找出在某種意義下的最優解,也有找出滿足約束條件的一個解。
    2)(搜索方式:廣度優先)分支限界法以廣度優先或以最小損耗優先的方式搜索解空間。

28.  在含有10個結點的二叉排序樹上,查找關鍵字爲20的結點,則依次比較的關鍵字有可能是( ) ABCD

A. 25,10,15,20
B. 25,10,15,18,20
C. 10,30,20
D. 10,30,25,20

解釋:A:首先根節點爲25,20比25小搜索其左子樹,找到10比25小不矛盾,20比10大搜索其右子樹,找到15比10大不矛盾,20比15大搜索其右子樹找到20,正確 B:首先根節點25,20比25小搜索其左子樹,找到10比25小不矛盾,20比10大搜索其右子樹,找到15比10大不矛盾, 20比15大搜索其右子樹,找到18比15大不矛盾, 20比18大搜索其右子樹,找到20,正確 C:首先根節點爲10,20比10大搜索其右子樹,找到30比10大不矛盾,20比30小搜索其左子樹,找到20,正確 D:首先根節點爲10, 20比10大搜索其右子樹,找到30比10大不矛盾,20比30小搜索其左子樹,找到25比30小不矛盾,20比25小搜索其左子樹找到20,正確

29.  區分一個算法時,主要看它具有()等特點  AC

A. 可行性
B. 至少有一個輸入量
C. 確定性  (確定性是算法的分類方法,)
D. 健壯性  (健壯性是算法的評定方式。)

解釋:

算法的特性:輸入輸出、有窮性、確定性、可執行性

設計需要:正確性、底耦合高效率低存儲、可讀性、健壯性

具體定義:
算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間複雜度與時間複雜度來衡量。
一個算法應該具有以下五個重要的特徵:
1.有窮性(Finiteness)
算法的有窮性是指算法必須能在執行有限個步驟之後終止;
2.確切性(Definiteness)
算法的每一步驟必須有確切的定義;
3.輸入項(Input)
一個算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指算法本身定出了初始條件;
4.輸出項(Output)
一個算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的算法是毫無意義的;
5.可行性(Effectiveness)
算法中執行的任何計算步驟都是可以被分解爲基本的可執行的操作步,即每個計算步都可以在有限時間內完成(也稱之爲有效性)。

part  three 

1. 程序一定是算法()  錯誤,程序 = 算法+數據結構

算法的5個特性:有限性+確定性+輸入+輸出+可行性

2. 折半查找算法的算法複雜度是多少?  O(logn)

3.  下列程序對x的賦值語句頻度是()? O(n^2)

for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        x+=1;

4.  二分查找的時間複雜度( )O(log(N))

5.  有一個有序表位{1,3,9,12,32,41,45,62,75,77,82,95,99},當採用二分查找法查找關鍵字爲82的元素時,(4)次比較後查找成功。

注意:再具體使用二分查找算法進行查找時,,當比較的mid元素和target不同是,要麼左移一位,要麼右移一位!

分析如下:

  1. len = 13, low = 0, high = 12, mid = (0 + 12) >>> 1 = 6, 45 < target = 82。
  2. low = mid + 1, low => 7, high = 12, mid = (low + high) >>> 1 = 9, 77 < target = 82。
  3. low = mid + 1, low => 10, high = 12, mid = (low + high) >>> 1 = 11, 95 > target = 82。
  4. high = mid - 1 = 10, mid = (low + high) >>> 1 = 10, find 82。

6.  冒泡排序算法在非有序的序列中時間複雜度是?( ) O(N^2)

7.  算法的時間複雜度取決於 ( )  C

A. 問題的規模
B. 待處理數據的初態
C. A和B

解釋: 問題規模是指算法複雜程度,n級別,logn級別,n平方級別。初態指的就是初始數據是如何的。例如在排序算法中的初始序列是否有序這種信息?會對算法的時間複雜度產生一定的影響程度!

8.   對一個無向圖進行先深搜索時,得到的先深序列是唯一的()  不唯一的;起點、以及這個無向圖的存儲結構都會導致先深搜索序列不同

即:DFS ,先進後出,使用棧實現,例如回溯法,可以再次稱爲活節點,不唯一

       BFS,先進先出,使用隊列實現,例如分支界限法,不可以再次稱爲活節點,不唯一

9.  已知一個有序表爲(12,18,24,35,47,50,62,83,90,115,134),當折半查找值爲90的元素時,經過()次比較後查找成功。  2次

10. 一個排序算法的時間複雜度與()有關    所需比較關鍵字的次數

解釋;排序過程就是進行比較和交換過程,而時間複雜度就與比較和交換的次數相關

11.  下列序排算法中最壞複雜度不是n(n-1)/2的是? D 堆排序算法三種情況下的時間複雜度都是O(nlogn)

A. 快速排序
B. 冒泡排序
C. 直接插入排序
D.堆排序

12. 【思考】對於關鍵字序列(16,10,20,12,18,7,14,13,5,19),不可能構成其二叉排序樹中一條查找路徑的序列是(    C )

A. 16,10,7,5
B. 16,20,18,19
C. 16,10,7,12,14
D. 16,10,12,14

分析:要構成一條二叉排序樹的一條查找路徑:前面的節點,或者比後面的節點都大,或者比後面的節點都小。C選項 中

10>7 ,但是10<12,14  所以C不可能構成其二叉排序樹中一條查找路徑的序列

13.  下列算法段中,時間複雜度爲()   O(n^3)   三層循環,每層最多都是n,所以一共的時間複雜度爲n^3

for(i=1;i<=n;i++)
{
    for(j=1;j<=i;j++)
    {
        x=0;
        for(k=1;k<=n;k++)
            x+=a*b;
    }
}

14.  設被排序的結點序列共有N個結點,在該序列中的結點已十分接近排序的情況下,用直接插入法,歸併法和一般的快速排序法對其排序,這些算法的時間複雜性爲()    O(N),O(N*log2N),O(N2)

15.  下列說法中錯誤的是:() C

A. 插入排序某些情況下複雜度爲O(n)  (有序情況下)
B. 排序二叉樹元素查找的複雜度可能爲O(n)  (只有右孩子結點的樹 )
C. 對於有序列表的排序最快的是快速排序    (快排是在無序的情況下排序比較快)
D. 在有序列表中通過二分查找的複雜度一定是O(log2n)

16.  幼兒園老師挑一組同樣花色的撲克牌,讓小朋友按牌面數字大小排成一列,小朋友依次從左到右找到合適位置放入撲克牌、這種方法類似以下哪種算法() D

快速排序
冒泡排序
歸併排序
插入排序

解釋:

1.快速排序:

思想:1.在待排序的元素任取一個元素作爲基準(通常選第一個元素,但最的選擇方法是從待排序元素中隨機選取一個作爲基準),稱爲基準元素;

       2.將待排序的元素進行分區,比基準元素大的元素放在它的右邊,比其小的放在它的左邊;

       3.對左右兩個分區重複以上步驟直到所有元素都是有序的

 

2.冒泡排序:

1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後一個。

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

 

3.歸併排序:

第一步:申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列

第二步:設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置

第三步:比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置

重複步驟3直到某一指針超出序列尾

將另一序列剩下的所有元素直接複製到合併序列尾

 

4.插入排序:

⒈從有序數列和無序數列{a2,a3,…,an}開始進行排序;

⒉處理第i個元素時(i=2,3,…,n),數列{a1,a2,…,ai-1}是已有序的,而數列{ai,ai+1,…,an}是無序的。用ai與ai-1,a i-2,…,a1進行比較,找出合適的位置將ai插入;

⒊重複第二步,共進行n-i次插入處理,數列全部有序。

17.  下面程序的結果是:8

#include 
int main() {
    int a, b;
    for (a = 1, b = 1; a <= 100; a++) { if (b >= 20)
            break;
        if (b % 3 == 1) {
            b += 3;
            continue;
        }
        b -= 5;
    }
    printf("%d\n", a);
    return 0;
}

解釋: 

a 2 3 4 5 6 7 8
b 4 7 10 13 16 19 22

18.  希爾排序的組內排序採用的是 。直接插入排序,上面的圖;希爾排序是對直接插入排序算法的改進!

補充:希爾排序的思想是:先將待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成),分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。

19. 若一組記錄的排序碼爲(5 9 , 46, 79, 38, 40, 84),則利用堆排序方法建立的初始大頂堆爲()。  84, 46, 79, 38, 40, 59

 

圖片來自牛客

20.  希爾排序每的最後一趟排序的地址增量一定是(      )。  1

補充:增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用一個序列來表示,{n/2,(n/2)/2...1},稱爲增量序列

21.  對遞歸程序的優化的一般的手段爲()   尾遞歸優化方法

解釋;尾遞歸是指,在函數返回的時候,調用自身本身,並且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只佔用一個棧幀,不會出現棧溢出的情況。 尾遞歸調用時,如果做了優化,棧不會增長,因此,無論多少次調用也不會導致棧溢出。 遺憾的是,大多數編程語言沒有針對尾遞歸做優化,

22.  在用鄰接表表示圖時,拓撲排序算法時間複雜度爲() O(n+e)

23.  下列選項給出的是從根分別到達兩個葉結點路徑上的權值序列,能屬於同一棵哈夫曼樹的是 。 D(該題直接每個選項分析)

A. 24,10,5和24,10,7
B. 24,10,5和24,12,
C. 24,10,10和24,14,11
D. 24,10,5和24,14,6

解釋:

AB選項都存在父節點不等於字節點和的問題。 c選項,14下面除了11,還有3,但這個3不可能跟11在一起,因爲哈夫曼樹構造的過程是選取兩個最小權值節點相加的

24.  拓撲排序算法把一個無向圖中的頂點排成一個有序序列。( )  錯誤,有向無環圖纔可以進行拓撲排序,而且可用作檢測是否有環!

25. 在排序算法中每一項都與其他各項進行比較,計算出小於該項的項的個數,以確定該項的位置叫()  枚舉排序

解釋:  枚舉排序,通常也被叫做秩排序,算法基本思想是:對每一個要排序的元素,統計小於它的所有元素的個數,從而得到該元素在整個序列中的位置,時間複雜度爲O(n^2)

26.  兩分法插入排序所需比較次數與待排序記錄的初始排列狀態相關()  錯誤

解釋:該題有點坑,二分插入法的重點不在二分法,而是插入法。二分的體現在於:在前面已經排好序的部分,查找合適的位置進行放置元素時,採用二分的方法。但是無論怎樣查找都是基於前面已經排好序的。

27.  某地電信局要對業務號碼進行梳理,需要檢測開通的市話號碼是否存在某一個是另一個的前綴的情況,以簡化電話交換機的邏輯。例如:某用戶號碼是“11001100”,但與"110"報警電話產生前綴配對。已知市話號碼最長8位,最短3位,並且所有3位的電話號碼都以1開頭。由於市話號碼衆多,長度也未必一直,高效的算法可以用O(n)的時間複雜度完成檢測(n爲開通市話號碼個數,數量是千萬級的)。那麼,該算法最壞情況下需要耗費大約________內存空間。  50MB

解釋:  

最長 8 位, 最短 3 共6種情況:

  • 三位都是 1 開頭 ,因此有 10^2=100 種
  • 四位: 10^4=10,000 種
  • 五位: 10^5=100,000 種
  • 六位: 10^6=1,000,000 種
  • 七位: 10^7=10,000,000 種
  • 八位: 10^8=100,000,000種

相加一共爲111,110,100種,因爲電話號碼唯一,所有號碼最後1位不用判斷,總數除以10  = 11,111,010種

 一位號碼  4bit(號碼 從  0-9  ,所以至少用  個  bit 位才能表示 ),8位的號碼佔 32bit 即 4字節/byte(其實可以只存前7位,3.5byte)

最後:11,111,010 * 4 / 1024 / 1024 = 42.4 Mb

28.  不穩定算法:選擇+希爾+堆排序+快速排序

         穩定算法:冒泡+歸併+插入+基數

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章