Date: 2019-08-10
1. 快速排序總比簡單排序快() 錯
解釋: 當原有數列是有序的,快排和簡單選擇時間複雜度都爲O(n^2)
2. 在索引順序表中,實現分塊查找,在等概率查找情況下,其平均查找長度不僅與表中元素個數有關,而且與每塊中元素個數有關() 對
解釋:
假設有n個數,分塊查找,每個塊有k個數,這樣可以分成n/k塊;
對每個塊檢索,可以有klogk;
這樣所有的數,共有n/k * klogk = nlogk
3. 計算算法的時間複雜度是屬於一種() 事前分析估算的方法
解釋: 算法時間複雜度是運行實際程序前通過分析和估算衡量算法的效率。
4. 下面給出的四種排序法中()排序法是不穩定性排序法 D
A. 插入
B. 起泡
C. 二路歸併
D. 堆
解釋:冒泡排序、基數排序、歸併排序、插入排序算法都是穩定性算法(冒歸基插)。不穩定的:快排,堆排,希爾,選擇
5. 對有 n 個記錄的表作快速排序,在最壞情況,算法的時間複雜度是 (O(n^2)) ;最壞情況即是基本有序的情況下。
6. 下面的哪種排序算法在算複雜度平均不是O(nlogn)的? B
A.快速排序
B.桶排序
C.歸併排序
D.二叉樹排序樹排序
E.堆排序
解釋;
桶排序的平均時間複雜度爲線性的O(N+C),其中C=N*(logN-logM)。如果相對於同樣的N,桶數量M越大,其效率越高,最好的時間複雜度達到O(N)。 當然桶排序的空間複雜度 爲O(N+M),如果輸入數據非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。
7. 對同一待排序序列分別進行折半插入排序和直接插入排序,兩者之間可能的不同之處是 ()。 D
A. 排序的總趟數
B. 元素的移動次數
C. 使用輔助空間的數量
D .元素之間的比較次數
解釋;折半插入排序,是對插入排序算法的一種改進,由於排序算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分爲已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查找的方法來加快尋找插入點的速度。 所以,很明顯比較的次數減少了。
補充:
1、算法複雜度與初始狀態無關的有:選擇排序、堆排序、歸併排序、基數排序。
2、元素總比較次數與初始狀態無關的有:選擇排序、基數排序。
3、元素總移動次數與初始狀態無關的有:歸併排序、基數排序。
8.
假設小明用某個排序算法對整數序列(82,45,25,15,21)進行排序。一下爲排序過程中序列狀態的變化過程:
輸入:82 45 25 15 21
第一步:45 82 25 15 21
第二步:25 45 82 15 21
第三步:15 25 45 82 21
······
請問小明用的是什麼排序算法? 插入排序算法(插入排序,特點是,第n輪,前n個數字會有序。 )
解釋:
該題考查的是不同排序方法的原理,從題目中可以得出是逐步將待排序的元素插入到已排序序列的對應位置,屬於插入排序。
選擇排序:將第一個元素作爲基準,後面的元素依次和第一個元素做比較選出最小元素,並和第一個元素交換位置,所以經過第一步排序可以確定整個序列的最小元素。A不正確。
歸併排序:兩兩合併排序,第一步的元素25,15應該交換位置作爲子序列,所以B不正確。
快速排序:需要樞軸值爲比較對象,第一步排序後會將序列分爲大於樞軸和小於樞軸兩部分,題目選項後三個元素均小於樞軸而沒有放到樞軸之前
9. 將兩個各有n個元素的有序表歸併成一個有序表,其最多的比較次數是() 2n-1
解釋: 最多的比較次數是當兩個有序表的數據剛好是插空順序的時候,比如:第一個序列是1,3,5,第二個序列是2,4,6,把第二個序列插入到第一個序列中,先把第二個序列中的第一個元素2和第一個序列依次比較,需要比較2次(和1,3比較),第二個元素4需要比較2次(和3,5比較,因爲4比2大,2之前的元素都不用比較了),第三個元素6需要比較1次(只和5比較),所以最多需要比較5次。即2n-1次。
10. 輸入若已經是排好序的(升序),下列排序算法最快的是() A
A. 插入排序
B. Shell排序
C. 合併排序
D. 快速排序
解釋:
快速排序在元素基本無序的情況下是最好的選擇,在基本遞增或遞減中時間複雜度是O(n^2)
歸併排序時間複雜度穩定在O(nlogn)
希爾排序很難說,跟選擇的增量有關,一般小於O(n^2),大於O(n)
插入排序是在序列已有序的情況下最快的,時間複雜度是O(n),另外在數數據規模較小時插入排序效果也很好。
一般不選擇傳統的冒泡排序,如果題目中有一個選項是冒泡排序,要想一下是否隱含着改進冒泡排序的含義。
11. 在外部排序時,利用選擇樹方法在能容納m個記錄的內存緩衝區中產生的初始歸併段的平均長度爲2m個記錄() 對
解釋:
內排序:我們常用的選擇、交換、插入、歸併、基數排序都屬於內排序,只用在內存讀一次原始數據即可完成排序。
外部排序:指的是大文件的排序,即待排序的記錄存儲在外存儲器上,待排序的文件無法一次裝入內存,需要在內存和外部存儲器之間進行多次數據交換,以達到排序整個文件的目的。外部排序最常用的算法是多路歸併排序,即將原文件分解成多個能夠一次性裝入內存的部分,分別把每一部分調入內存完成排序。然後,對已經排序的子文件進行多路歸併排序。
由於利用選擇樹選擇出來後,就是將兩個長度爲m的子節點數組歸併成一個長度爲2m的根節點數組,然後再取數據,依次向上遞歸,如下圖。
X
/ \
a[m] a[m] 由於最後一個可能不夠m,所以那一個初始歸併X段會稍微小,但是最後求所有X平均的話應該是2m附近。
12. 以下哪種排序算法對[1, 3, 2, 4, 5, 6, 7, 8, 9]進行排序最快 ? 基本有序:插入排序或者改進的冒泡排序算法
堆排序無論排序序列有序還是無序,時間複雜度都爲O(nlogn),但改良的冒泡排序可以將時間複雜度降到O(n)。其次,歸併排序無論有序還是無序其時間複雜度也是O(nlogn),歸併排序在歸併的時候,如果右路最小值比左路最大值還大,那麼只需要比較n次,但如果右路每個元素分別比左路對應位置的元素大,那麼需要比較2*n-1次,該序列明顯滿足第二個條件,所以其時間複雜度爲O(2n)
13. 在下列排序算法中,哪一個算法的時間複雜度與初始序列無關( ) 一堆(堆)烏龜(歸併)選(選擇)基(基數)友
直接插入排序
冒泡排序
快速排序
直接選擇排序
解釋:
1.直接插入排序
需要和前面都有序序列對比插入的位置,如果本身有序,則每次對比一個即可。
最壞情況,則需要一直對比到第一個元素
最好時間複雜度O(n),最壞時間複雜度O(n^2)
2.冒泡排序
假設遞增冒泡,需要每次把無序部分最大的移動到無序部分的最右邊,如果本身就是遞增,則無序移動,遍歷一遍就完成了。
最好時間複雜度爲O(n),最壞時間複雜度爲O(n^2);
3.快速排序
大家都知道,最差爲O(n^2),平均爲O(nlogn)
4.直接選擇排序
每次需要遍歷一遍選擇無序部分最大的,無論是否有序,都要遍歷才能找到,所以其時間複雜度與初始序列無關。
14. 以下排序算法中,最壞情況時間複雜度與其他選項不同的是()D
冒泡排序
插入排序
快速排序
歸併排序
15. 爲實現快速排序算法,待排序序列宜採用的存儲方式是()。 A(快速排序中元素進行比較,需要快速查詢,而順序存儲適用於頻繁快速查詢)
A. 順序存儲
B.散列存儲
C. 鏈式存儲
D.索引存儲
補充解釋:
1、順序存儲方式:順序存儲方式就是在一塊連續的存儲區域(物理)一個接着一個的存放數據。一般採用數組或結構數組來描述。
2、鏈式存儲方式:鏈式存儲方式比較靈活,節點邏輯上相鄰,但不要求節點在物理位置上(存儲區域)相鄰,一個節點的引用字段往往指向下一個節點的存放位置,比如鏈表;
3、索引存儲方式:索引存儲方式是採用附加的索引表的方式來存儲節點信息的一種存儲方式。索引表由若干索引項組成。索引存儲方式中索引項的一般形式爲(關鍵字、地址);
4、散列存儲方式:散列存儲方式是根據節點o的關鍵字,利用散列函數直接計算出該節點的存儲地址的一種存儲方式。
16. 用希爾(Shell)方法排序時,若關鍵字的初始排序雜亂無序,則排序效率就低() 錯
時間複雜度受增量序列的影響明顯大於其他因素,最壞的情況是o(n2),好的情況在o(n1.3),與增量序列選擇有關。
17. 下列程序的時間複雜度是(o(n^2))
for (int i = 1, s = 0; i <= n; ++i)
{
int t = 1;
for (int j = 1; j <= i; ++j)
t = t * j;
s = s + t;
}
18. 一棵哈夫曼樹的帶權路徑長度等於其中所有葉結點的帶權路徑長度之和() 對
解釋: 樹的帶權路徑長度(Weighted Path Length of Tree):定義爲樹中所有葉結點的帶權路徑長度之和。
結點的帶權路徑長度:結點到樹根之間的路徑長度與該結點上權的乘積。
19. 在用鄰接表表示圖的情況下,建立圖的算法的時間複雜度爲() o(n+e)
解釋:在鄰接表中,給定一頂點,很容易地找出它的所有鄰邊,因爲只需要讀取它的鄰接表就可以了,題目中的n表示n個結點,e表示e條邊
20. 基於比較方法的n個數據的內部排序。最壞情況下的時間複雜度能達到的最好下界是() O(nlogn)
解釋:
基於比較的排序算法有:(1)直接插入排序;(2)冒泡排序;(3)簡單選擇排序;(4)希爾排序;(5)快速排序;(6)堆排序;(7)歸併排序。
分配式排序:基數排序、桶排序
21. 已知字符串S 爲“abaabaabacacaabaabcc”,模式串 t 爲“abaabc”。採用 KMP 算法進行匹配,第一 次出現“失配”(s[i]≠t[j]) 時,i=j=5,則下次開始匹配時,i 和 j 的值分別是 () 。 i=5,j=2
22. n!後面有多少個0,6!=1*2*3*4*5*6=720.720後面有1個0,n=10000,求n!。 2499個
解釋:
10000/5=2000 有2000個能被5整除
2000/5=400 這2000個裏面能被5整除有400個(2000個已被5除過1次。能除第二次的有400)
400/5=80 同理 80個
80/5=16 同理 16個
16/5=3餘1 同理 3個
結果2000+400+80+16+3=2499
用短除法
24. 關鍵路徑是AOE網中() 從始點到終點的最長路徑
解釋:在AOE網中,從源點到匯點的所有路徑中,具有最大路徑長度的路徑成爲關鍵路徑。在AOE網中,可以有不止一條的關鍵路徑。
25. 外排中使用置換選擇排序的目的,是爲了增加初始歸併段的長度() 對
解釋:外部排序過程中,爲了減少外存讀寫次數需要減小歸併趟數(外部排序的過程中用到歸併),歸併趟數爲: (其中k爲歸併路數,n爲歸併段的個數)。增加k和減小n都可以達到減小歸併趟數的目的。置換-選擇排序就是一種減小n的、在外部排序中創建初始歸併段時用到的算法。它可以讓初始歸併段的長度增減,從而減小初始歸併段的段數(因爲總的記錄數是一定的)
26. 下列選項中,不可能是快速排序第2趟排序結果的是 () C
2,3,5,4,6,7,9
2,7,5,6,4,3,9
3,2,5,4,7,6,9
4,2,3,5,7,6,9
解釋:四個選項都是同樣的數組元素,若完全有序,應爲2345679
每經過一趟快排,軸點元素都必然就位,也就是說,一趟下來至少有1個元素在其最終位置
所以考察各個選項,看有幾個元素就位即可。
A:2、3、6、7、9
B:2、9
C:9
D:5、9
第二趟至少應有2個元素就位,所以C不對。
27. 假設在有序線性表A[1..30]上進行二分查找,則比較五次查找成功的結點數爲( ) 15
解釋:
查找一次成功的節點數爲1,值爲15
查找二次成功的節點數爲2,值爲7,,23
查找三次成功的節點數爲4,值爲3,11,19,27
查找四次成功的節點數爲8,值爲1,5,9,13,17,21,25,29
查找五次成功的節點數爲15,值爲2,3,4,6,8,10,12,14,16,18,20,22,24,26,28,30
28. 將一組無序的正整數重新排列成有序序列,其方法有() BCD
拓撲排序
快速排序
堆排序
基數排序
29. 下面哪一方法可以判斷出一個有向圖是否有環(迴路)() AB
深度優先遍歷
拓撲排序
Dijkstra求最短路徑
求關鍵路徑
解釋:
如果是又環的話,使用深度優先遍歷,會碰到重複的節點;B本來就是用來判斷是不是存在環的;廣度優先遍歷不可以,因爲廣度優先搜索過程中如果訪問到一個已經訪問過的節點,可能是多個節點指向這個節點,不一定是存在環
30. 在最好情況下,下列排序算法中() 排序算法所需比較關鍵字次數最少。 AB
冒泡排序
直接插入排序
快速排序
歸併排序
解釋:
冒泡排序若文件初始爲正序,則一趟冒泡即㐓完成,比較次數是n-1
直接插入也是初始是正序, 比較次數也是n-1
快速排序---越是正序,需要時間越多大於n-1
歸併排序-------每一趟歸併都得比較,第一趟歸併比較是n-1,後面都大於n-1
31. 已知圖的鄰接表如下所示,根據算法,則從頂點 0 出發按深度優先遍歷的結點序列是(BCD)
0132
0231
0321
0123
牛客上解釋:
直接先根據鄰接表還原圖:
0
1 - 2- 3
對該圖深度優先搜索
0 1 2 3
0 2 1 3
0 3 2 1
如果在遍歷上優先序號最大節點,則:
0 3 2 1
0 2 3 1
0 1 2 3
題外話:題目說的遍歷順序,着實讓人不解,實際遍歷順序應該爲
0 3 2 1 2 3 1 1 2 3
假如遍歷到4個節點的時候,做以記錄,則結果只有
0 3 2 1,
其他因爲不滿足四個節點而無法記錄。很奇怪,這樣的題目,沒意思。
part two:
1. 若在線性表中採用折半查找法查找元素,該線性表應該:() 元素按值有序且採用順序存儲結構
解釋:折半查找需要先對查找的數據集合排序,並且每次要獲得數據列表的中間位置,通過數組這種順序存儲結構,只要一次索引就能獲得中間值,如果是鏈式結構,就每次都要從頭遍歷到中間位置,耗費大量時間。
2. 答案:快速排序
解釋: 快速排序將數據按照基準數據(一般選擇第一個元素,此處選擇中間元素)分爲左右兩部分,左邊都比基準數據小,右邊都比基準數據大,按照中間位置,遞歸左右兩側,直到只有一個數據時,排序完成。
3. 歸併排序輔助存儲爲O(1)() 錯; 歸併排序時所有排序算法中空間複雜度最高的,爲O(n)
4. 優化過後的冒泡排序算法關鍵字比較的次數與記錄的初始排列次序無關,這樣的說法正確嗎? 錯誤
解釋: 原始冒泡排序算法與序列的初始狀態沒有關係,都需要進行O((n*(n-1))/2)次比較;但是對於改進後的冒泡排序(當某趟判斷是不需要進行交換時,就表明該序列已經排好序了,停止排序。)的比較次數是與初始狀態有關的。
5. 使用二分查找算法在一個有序序列中查找一個元素的時間複雜度爲( ) o(logN)
補充:
1. 順序查找,時間複雜度爲O(n)
2. 二分查找,時間複雜度爲O(logn)
3. 插值查找,關鍵字分佈又比較均勻, 時間複雜度爲O(log(logn))
4. 斐波那契查找,時間複雜度爲O(logn)
5. 樹表查找
a) 二叉樹查找算法,插入和查找的時間複雜度均爲O(logn)
b) 紅黑樹,logn
c) B樹和B+樹,O(log n)
6. 分塊查找,關鍵字構成一個索引表
7. 哈希查找,以空間換時間的算法
6. 衡量查找算法效率的主要標準是( )。 均勻查找長度
解釋:
評價一個算法的優劣主要就看兩方面:算法的時間複雜度和算法的空間複雜度
1:算法的時間複雜度一般用於衡量一個算法的運行效率(平均查找長度)
2:算法的空間複雜度指的是算法運行過程中對資源的消耗情況
7. 下列哪個查找方法的平均查找長度與查找表中數據元素個數無關? 哈希(散列)查找
解釋:順序查找方法和折半查找方法的平均查找長度都與元素的個數有關,由於散列結構是由事先準備好的散列函數關係與處理衝突的方法來確定數據元素在散列表中的存儲位置的,因此散列表查找方法的平均查找長度與元素的個數無關
8. 對線性表進行二分查找,其前提條件是 有序的查找表
注意:順序表只是說明數據存儲是有序的,但是並不代表存儲的值是有序的。
9. 設一個有序的單鏈表中有n個結點,現要求插入一個新結點後使得單鏈表仍然保持有序,則該操作的時間複雜度(O(n))
解釋:
首先要找打插入位置,
由於單鏈表不能像順序表那樣二分查找,因此只能順序查找,查找的時間複雜度爲O(n)
其次是插入,鏈表的插入操作時間複雜度是O(1)
因此總的操作時間複雜度爲O(n)
10. 順序查找法適用於存儲結構爲順序或鏈接存儲的線性表。()正確
解釋:因爲順序查找時每一個每一個進行遍歷,不需要索引,所以鏈表存儲也是可以的。
順序存儲的線性表不但邏輯上連續,物理上也連續,可以使用順序查找法。
鏈式存儲的線性表雖然物理上不一定連續,但邏輯上連續(通過額外的指針表示邏輯相鄰關係),也可以使用順序查找法。
11. 排序算法的穩定是指,關鍵碼相同的記錄排序前後相對位置不發生改變,下面哪種排序算法是不穩定的() 選堆希快不穩
12. 串的樸素模式匹配算法,主要思想是對主串(S)的每一個字符作爲子串(T)開頭,與要匹配的字符串進行匹配。主串(S)的長度爲n,要匹配的子串的長度爲m,那麼樸素模式匹配算法的最壞時間複雜度爲:O((n-m+1)*m)
例如:S:1 2 3 4 5 6 7 8 9 n=9,m=2,則S中需要匹配的首字母是:1 2 3 4 5 6 7 8,然後每個作爲首字母時,需要進行m次比較。
13. 設順序表的長度爲 n 。下列排序方法中,最壞情況下比較次數小於 n(n-1)/2 的是( )。 堆排序
解釋:
堆排的最好、最壞、平均時間複雜度均爲O(nlogn);
快排最壞時間複雜度爲O(n^2),發生在序列基本有序情況下;
簡單插入排序最壞時間複雜度爲O(n^2),發生條件:逆序;
冒泡排序最壞時間複雜度爲O(n^2),發生條件:逆序;
14. 在長度爲n的有序線性表中進行二分查找,最壞情況下需要比較的次數是( )。 O(logn)
15. 基數分類只適用於以數字爲關鍵字的情況,不適用於以字符串爲關鍵字的情況() 錯,字符也是可以的
16. 以下排序方式中佔用O(n)輔助存儲空間的是 歸併排序(歸併排序是所有排序中佔用內存最多,但是效率比較高且穩定的算法,即犧牲內存提高了效率)
17. 下列程序段的時間複雜度是 。
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
解釋:O(nlogn)
內層循環條件j<=n與外層循環的變量無關,每次循環j自增1,每次內層循環都執行n次。外層循環條件爲k<=n,增量定義爲k*=2,可知循環次數爲2k<=n,即k<=log2n。所以內層循環的時間複雜度是O(n),外層循環的時間複雜度是O(log2n)。對於嵌套循環,根據乘法規則可知,該段程序的時間複雜度T(n)=T1(n)*T2(n)=O(n)*O(log2n)=O(nlog2n)
18. 在所有的排序方法中,關鍵字比較的次數與記錄的初始排列次序無關的是 。 選 基
19. 二叉排序樹刪除一個結點後,仍是二叉排序樹。() 正確
解釋:二叉排序樹的左子樹結點值均小於根結點值;右子結點值均大於根結點值。所以刪除一個數後仍然爲二叉排序樹。
20. 設有遞歸算法如下,最終打印結果是()
#include<stido.h>
int foo(int a ,int b)
{
if (b == 0) return 0;
if (b %2 == 0) return foo(a+a,b/2);
return foo(a+a,b/2)+a;
}
void main()
{
printf("%d",foo(1,3));
}
解釋分析:
計算foo(1,3):此時a=1,b=3;
跳過兩個if語句進入return foo(1+1,3/2)+1,即foo(2,1)+1;
計算foo(2,1):
同樣,跳過兩個if語句進入return foo(2+2,1/2)+2,即foo(4,0)+2;
計算foo(4,0):
進入第一個if語句,return 0;
逐層返回,得foo(2,1)=0+2=2;
再返回上一層,得foo(1,3)=2+1=3;
返回結果,foo(1,3)=3;
21.
void recursive(int n, int m, int o)
{
if (n <= 0)
{
printf("%d,%d\n", m, o);
}
else
{
recursive(n - 1, m + 1, o);
recursive(n - 1, m, o + 1);
}
}
以上代碼的時間複雜度是: O(2^n)
22. 設順序線性表的長度爲30,分成5塊,每塊6個元素,如果採用分塊查找並且索引表和塊內均採用順序查找,則其平均查找長度爲( )。 6.5
注意解釋: 預備知識:一個小知識點:平均查找長度。 順序查找:從表的一端開始,順序掃描線性表 表中有n個元素,假設爲{1,2,...,n},那麼,在等概率的條件下,平均查找長度爲:ASL=(1+2+...n)/n=(n+1)/2
分析: 分塊查找會分兩部分進行,第一步先進行索引表查找判斷其在那個字表中,第二步然後進行在字表中的查找
索引表有5個元素 所以平均查找長度爲:(1+5)/2=3
字表中有6個元素,所以平均查找長度爲:(1+6)/2=3.5
所以總的平均查找長度爲3+3.5=6.5
23. 假設在有序線性表A[1..30]上進行二分查找,則比較五次查找成功的結點數爲( ) 15 答案見前面
24. 在一個有8個int數據的數組中,隨機給出數組的數據,找出最大和第二大元素一定需要進行()次比較: 9
網友答案:
25. 下列排序算法的常規實現中,哪些空間複雜度是O(1) ABE
A. 冒泡
B. 選擇
C. 歸併O(N)
D.快排 O(logN)
E. 堆排序
26. 下列關於效率的說法不正確的是() D
A. 效率是一個性能要求,其目標應該在需求分析時給出
B. 提高程序效率的根本途徑在於選擇良好的設計方法,數據結構與算法
C. 效率主要指處理機時間和存儲器容量兩個方面
D. 程序的效率與程序的長度強相關
27. 排序趟數與序列的原始狀態有關的排序方法是()排序法 優化的冒泡算法+快速排序算法
解釋:
1、總排序趟數與初始狀態無關的有:(除了快速排序和優化的冒泡,其他都是)
2、算法複雜度與初始狀態無關的有:堆排序、歸併排序、選擇排序、基數排序。
3、元素總比較次數與初始狀態無關的有:選擇排序、基數排序。
4、元素總移動次數與初始狀態無關的有:歸併排序、基數排序。
28. 基於鏈式隊列,關於計數排序的敘述中正確的是(BC ) 計數排序 計數排序 計數排序
A. 計數排序是一種基於比較的排序算法 (基於統計的排序算法)
B.計數排序的時間複雜度爲O(n+k)
C.計數排序的空間複雜度爲 O(k)
D.計數算法是原地排序算法 (不是原地排序算法)
解釋:
B. 需要遍歷所有數據,時間複雜度 O(N) ,但最後輸出排序後的序列更合理,設 k 爲數據範圍(最大值 - 最小值),則遍歷標記數組需要 O(k) ,總共 O(N+k) 。
C. 當數據範圍是 k 時,空間複雜度 O(k)
29. 在排序方法中,元素比較次數與元素的初始排列無關的是() 選擇+基數