習題集解析部分html
第9章 查找算法
——《數據結構題集》-嚴蔚敏.吳偉民版數據結構
源碼使用說明 連接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明函數
課本源碼合輯 連接☛☛☛ 《數據結構》課本源碼合輯測試
習題集全解析 連接☛☛☛ 《數據結構題集》習題解析合輯spa
相關測試數據下載 連接☛ 數據包設計
本習題文檔的存放目錄:數據結構\▼配套習題解析\▼09 查找指針
文檔中源碼的存放目錄:數據結構\▼配套習題解析\▼09 查找\▼習題測試文檔-09htm
源碼測試數據存放目錄:數據結構\▼配套習題解析\▼09 查找\▼習題測試文檔-09\Datablog
9.1❷若對大小均爲n的有序的順序表和無序的順序表分別進行順序查找,試在下列三種狀況下分別討論二者在等機率時的平均查找長度是否相同?
(1)查找不成功,即表中沒有關鍵字等於給定值K的記錄;
(2)查找成功,且表中只有一個關鍵字等於給定值K的記錄;
(3)查找成功,且表中有若干個關鍵字等於給定值K的記錄,一次查找要求找出全部記錄。此時的平均查找長度應考慮找到全部記錄時所用的比較次數。
9.2❷試分別畫出在線性表(a,b,c,d,e,f,g)中進行折半查找,以查關鍵字等於e,f和g的過程。
9.3❷畫出對長度爲10的有序表進行折半查找的斷定樹,並求其等機率時查找成功的平均查找長度。
9.4❸假設按下述遞歸方法進行順序表的查找:若表長≤10,則進行順序查找,不然進行折半查找。試畫出對錶長n=50的順序表進行上述查找時,描述該查找的斷定樹,並求出在等機率狀況下查找成功的平均查找長度。
9.5❸下列算法爲斐波那契查找的算法:
int FibSearch(SqList r, KeyType K)
{
j=1;
while(fib(j)<n+1)
j = j + 1;
mid = n - fib(j-2) + 1; //若fib(j)=n+1,則mid=fib(j-1)
f1 = fib(j-2);
f2 = fib(j-3);
found = FALSE;
while((mid<>0) && !found)
switch
{
case K=r[mid].key:
found = TRUE;
break;
case K<r[mid].key:
if(!f2)
mid = 0;
else
{
mid = mid-f2;
t = f1 - f2;
f1 = f2;
f2 = t;
}
break;
case K>r[mid].key:
if(f1=1)
mid = 0;
else
{
mid = mid + f2;
f1 = f1 - f2;
f2 = f2 – f1;
}
break;
}
if(found)
return mid;
else
return 0;
}//FibSearch
其中fib(i)爲斐波那契序列(參見9.1.2節注)。試畫出對長度爲20的有序表進行斐波那契查找的斷定樹,並求在等機率時查找成功的平均查找長度。
9.6❺假設在某程序中有以下一個if-then嵌套的語句
if(C1)
if(C2)
if(C3)
…
if(Cn)
S;
其中Ci爲布爾表達式。顯然,只有當全部的Ci都爲TRUE時,語句S才能執行。假設t(i)爲判別Ci是否爲TRUE所需時間,p(i)爲Ci是TRUE的機率,試討論這n個布爾表達式Ci (i=1,2,…,n)應如何排列才能使該程序最有效地執行?
9.7❸已知一個有序表的表長爲8N,而且表中沒有關鍵字相同的記錄。假設按以下所述方法查找一個關鍵字等於給定值K的記錄:先在第8,16,24,…,8K,…,8N個記錄中進行順序查找,或者查找成功,或者由此肯定出一個繼續進行折半查找的範圍。畫出描述上述查找過程的斷定樹,並求等機率查找時查找成功的平均查找長度。
9.8❸已知含12個關鍵字的有序表及其相應權值爲:
(1)試按次優查找樹的構造算法並加適當調整畫出由這12個關鍵字構造所得的次優查找樹,並計算它的PH值;
(2)畫出對以上有序表進行折半查找的斷定樹,並計算它的PH值。
9.9❸已知以下所示長度爲12的表
(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)
(1)試按表中元素的順序依次插入一棵初始爲空的二叉排序樹,畫出插入完成以後的二叉排序樹,並求其在等機率的狀況下查找成功的平均查找長度。
(2)若對錶中元素先進行排序構成有序表,求在等機率的狀況下對此有序表進行折半查找時查找成功的平均查找長度。
(3)按表中元素順序構造一棵平衡二叉排序樹,並求其在等機率的狀況下查找成功的平均查找長度。
9.10❸能夠生成以下二叉排序樹的關鍵字的初始排列有幾種?請寫出其中的任意5個。
9.11❸試推導含12個結點的平衡二叉樹的最大深度,並畫出一棵這樣的樹。
9.12❷在B-樹定義中,特性(3)的意圖是什麼?試思考:若把「┌m/2┐」改成「┌2m/3┐」或「┌m/3┐」是否可行?所獲得的樹結構和B-樹有何區別?
9.13❷含9個葉子結點的3階B-樹中至少有多少個非葉子結點?含10個葉子結點的3階B-樹中至多有多少個非葉子結點?
9.14❷試從空樹開始,畫出按如下次序向2-3樹即3階B-樹中插入關鍵碼的建樹過程:20,30,50,52,60,68,70。若是此後刪除50和68,畫出每一步執行後2-3樹的狀態。
9.15❸試證實:高度爲h的2-3樹中葉子結點的數目在2h-1與3h-1之間。
9.16❷在含有n個關鍵碼的m階B-樹中進行查找時,最多訪問多少個結點?
9.17❸B+樹和B-樹的主要差別是什麼?
9.18❶試畫一個對應於關鍵字集{program, programmer, programming,processor, or}的Trie樹,對每一個關鍵字從右向左取樣,每次一個字母。
9.19❸選取哈希函數H(k)=(3k) MOD 11。用開放定址法處理衝突,di= i((7k) MOD 10+1) (i=1,2,3, …)。試在0~10的散列地址空間中對關鍵字序列(22, 41, 53, 46, 30, 13, 01, 67)造哈希表,並求等機率狀況下查找成功時的平均查找長度。
9.20❸試爲下列關鍵字創建一個裝載因子不小於0.75的哈希表,並計算你所構造的哈希表的平均查找長度。
(ZHAO, QIAN, SUN, LI, ZHOU, WU, ZHENG, WANG, CHANG, CHAO, YANG, JIN)
9.21❸在地址空間爲0~16的散列區中,對如下關鍵字序列構造兩個哈希表:
(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)
(1)用線性探測開放定址法處理衝突;
(2)用鏈地址法處理。
並分別求這兩個哈希表在等機率狀況下查找成功和不成功時的平均查找長度。
設哈希函數爲H(x)= └i/2┘,其中i爲關鍵字中第一個字母在字母表中的序號。
9.22❹已知一個含有1000個記錄的表,關鍵字爲中國人姓氏的拼音,請給出此表的一個哈希表設計方案,要求它在等機率狀況下查找成功的平均查找長度不超過3。
9.23❷設有一個關鍵字取值範圍爲正整數的哈希表,空表項的值爲-1,用開放定址法解決衝突。現有兩種刪除策略:一是將待刪表項的關鍵字置爲-1;二是將探測序列上的關鍵字順序遞補,即用探測序列上下一個關鍵字覆蓋待刪關鍵字,並將原序列上以後一個關鍵字置爲-1。這兩種方法是否可行?爲何?給出一種可行的方法,並敘述它對查找和插入算法所產生的影響。
9.24❺某校學生學號由8位十進制數字組成:C1C2C3C4C5C6C7C8。C1C2爲入學時年份的後兩位;C3C4爲系別:00~24分別表明該校的25個系;C5爲0或1,0表示本科生,1表示研究生;C6C7C8爲對某級某系某類學生的順序編號:對於本科生,它不超過199,對於研究生,它不超過049,共有4個年級,四年級學生1996年入學。
(1)當在校生人數達極限狀況時,將他們的學號散列到0~24999的地址空間,問裝載因子是多少?
(2)求一個無衝突的哈希函數H1,它將在校生學號散列到。0~24999的地址空間。其簇聚性如何?
(3)設在校生總數爲15000人,散列地址空間爲,0~19999,你是否能找到一個(2)中要求的H1?若不能,試設計一個哈希函數H2及其解決衝突的方法,使得多數學號可只經一次散列獲得(可設各系各年級本科平生均人數爲130,研究平生均人數爲20)。
(4)用算法描述語言表達H2,並寫出相應的查找函數。
轉載註明出處:原文連接
9.25❸假設順序表按關鍵字自大至小有序,試改寫教科書9.1.1節中的順序查找算法,將監視哨設在高下標端。而後畫出描述此查找過程的斷定樹,分別求出等機率狀況下查找成功和不成功時的平均查找長度。
9.26❷試將折半查找的算法改寫成遞歸算法。
9.27❷改寫教科書9.1.2節中折半查找的算法,當r[i].key≤K<r[i+1].key(i=1,2,…,n-1)時,返回i;當K<r[1].key時,返回0;當K≥r[n].key時,返回n。
9.28❹試編寫利用折半查找肯定記錄所在塊的分塊查找算法。並討論在塊中進行順序查找時使用「監視哨」的優缺點,以及必要時如何在分塊查找的算法中實現設置「監視哨」的技巧。
9.29❺已知一非空有序表,表中記錄按關鍵字遞增排列,以不帶頭結點的單循環鏈表做存儲結構,外設兩個指針h和t,其中h始終指向關鍵字最小的結點,t則在表中浮動,其初始位置和h相同,在每次查找以後指向剛查到的結點。查找算法的策略是:首先將給定值K和t->key進行比較,若相等,則查找成功;不然因K小於或大於t->key而從h所指結點或t所指結點的後繼結點起進行查找。
(1)按上述查找過程編寫查找算法;
(2)畫出描述此查找過程的斷定樹,並分析在等機率查找時查找成功的平均查找長度(假設表長爲n,待查關鍵碼K等於每一個結點關鍵碼的機率爲1/n,每次查找都是成功的,所以在查找時,t指向每一個結點的機率也爲1/n)。
9.30❹將9.28題的存儲結構改成雙向循環鏈表,且外設一個指針sp,其初始位置指向關鍵字最小的結點,在每次查找以後指向剛查到的結點。查找算法的策略是:首先將給定值K和sp->key進行比較,若相等,則查找成功;不然依K小於或大於sp->key繼續從*sp的前驅或後繼結點起進行查找。編寫查找算法並分析等機率查找時查找成功的平均查找長度。
9.31❹試寫一個判別給定二叉樹是否爲二叉排序樹的算法,設此二叉樹以二叉鏈表做存儲結構。且樹中結點的關鍵字均不一樣。
9.32❸已知一棵二叉排序樹上全部關鍵字中的最小值爲-max,最大值爲max,又-max<x<max。編寫遞歸算法,求該二叉排序樹上的小於x且最靠近x的值a和大於x且最靠近x的值b。
9.33❸編寫遞歸算法,從大到小輸出給定二叉排序樹中全部關鍵字不小於x的數據元素。要求你的算法的時間複雜度爲O(log2n+m),其中n爲排序樹中所含結點數,m爲輸出的關鍵字個數。
9.34❺試寫一時間複雜度爲O(log2n+m)的算法,刪除二叉排序樹中全部關鍵字不小於x的結點,並釋放結點空間。其中n爲樹中所含結點數,m爲被刪除的結點個數。
9.35❹假設二叉排序樹之後繼線索鏈表做存儲結構,編寫輸出該二叉排序樹中全部大於a且小於b的關鍵字的算法。
9.36❸同9.35題的結構,編寫在二叉排序樹中插入一個關鍵字的算法。
9.37❹同9.35題的結構,編寫從二叉排序樹中刪除一個關鍵字的算法。
9.38❺試寫一算法,將兩棵二叉排序樹合併爲一棵二叉排序樹。
9.39❺試寫一算法,將一棵二叉排序樹分裂爲兩棵二叉排序樹,使得其中一棵樹的全部結點的關鍵字都小於或等於x,另外一棵樹的任一結點的關鍵字均大於x。
9.40❸在平衡二叉排序樹的每一個結點中增設一個lsize域,其值爲它的左子樹中的結點數加1。試寫一時間複雜度爲O(logn)的算法,肯定樹中第k小的結點的位置。
9.41❺爲B+樹設計結點類型並寫出算法,隨機(而不是順序)地查找給定的關鍵字K,求得它所在的葉子結點指針和它在該結點中的位置(提示:B+樹中有兩種類型的指針,結點結構也不盡相同,考慮利用記錄的變體)。
9.42❸假設Trie樹上葉子結點的最大層次爲h,同義詞放在同一葉子結點中,試寫在Trie樹中插入一個關鍵字的算法。
9.43❸同9.42的假設,試寫在Trie樹中刪除一個關鍵字的算法。
9.44❹已知某哈希表的裝載因子小於1,哈希函數H(key)爲關鍵字(標識符)的第一個字母在字母表中的序號,處理衝突的方法爲線性探測開放定址法。試編寫一個按第一個字母的順序輸出哈希表中全部關鍵字的算法。
9.45❸假設哈希表長爲m,哈希函數爲H(x),用鏈地址法處理衝突。試編寫輸入一組關鍵字並建造哈希表的算法。
9.46❹假設有一個1000×1000的稀疏矩陣,其中1%的元素爲非零元素,現要求用哈希表做存儲結構。試設計一個哈希表並編寫相應算法,對給定的行值和列值肯定矩陣元素在哈希表上的位置。請將你的算法與在稀疏矩陣的三元組表存儲結構上存取元素的算法(沒必要寫出)進行時間複雜度的比較。