習題集解析部分
第9章 查找
——《數據結構題集》-嚴蔚敏.吳偉民版
源碼使用說明 鏈接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明
課本源碼合輯 鏈接☛☛☛ 《數據結構》課本源碼合輯
習題集全解析 鏈接☛☛☛ 《數據結構題集》習題解析合輯
相關測試數據下載 鏈接☛ 數據包
本習題文檔的存放目錄:數據結構\▼配套習題解析\▼09 查找
文檔中源碼的存放目錄:數據結構\▼配套習題解析\▼09 查找\▼習題測試文檔-09
源碼測試數據存放目錄:數據結構\▼配套習題解析\▼09 查找\▼習題測試文檔-09\Data
一、基礎知識題
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%的元素為非零元素,現要求用哈希表作存儲結構。試設計一個哈希表並編寫相應算法,對給定的行值和列值確定矩陣元素在哈希表上的位置。請將你的算法與在稀疏矩陣的三元組表存儲結構上存取元素的算法(不必寫出)進行時間復雜度的比較。