數(shù)據(jù)結(jié)構(gòu)(C語言版清華大學出版社)-章課后部分答案.doc
《數(shù)據(jù)結(jié)構(gòu)(C語言版清華大學出版社)-章課后部分答案.doc》由會員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)(C語言版清華大學出版社)-章課后部分答案.doc(5頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第八章 選擇題 1. C 2.A 3.B 4.C 5.D 6.B 7.B 8.A 9.D 10.D 11.C 12.C 填空題 1. n、n+1 2. 4 3. 8.25( 折半查找所在塊 ) 4. 左子樹、右子樹 5. 26 6. 順序、(n+1)/2、O(log2n) 7. m-1、[m/2]-1 8. 直接定址 應用題 1. 進行折半查找時,判定樹是唯一的,折半查找過程是走了一條從根節(jié)點到末端節(jié)點的路徑,所以其最大查找長度為判定樹深度[log2n]+1.其平均查找長度約為[log2n+1]-1.在二叉排序樹上查找時,其最大查找長度也是與二叉樹的深度相關(guān),但是含有n個節(jié)點的二叉排序樹不是唯一的,當對n個元素的有序序列構(gòu)造一棵二叉排序樹時,得到的二叉排序樹的深度也為n,在該二叉樹上查找就演變成順序查找,此時的最大查找長度為n;在隨機情況下二叉排序樹的平均查找長度為1+4log2n。 因此就查找效率而言,二分查找的效率優(yōu)于二叉排序樹查找,但是二叉排序樹便于插入和刪除,在該方面性能更優(yōu)。 3. 評價哈希函數(shù)優(yōu)劣的因素有:能否將關(guān)鍵字均勻的映射到哈希表中,有無好的處理沖突的方法,哈希函數(shù)的計算是否簡單等。 沖突的概念:若兩個不同的關(guān)鍵字Ki和Kj,其對應的哈希地址Hash(Ki) = Hash(Kj),則稱為地址沖突,稱Ki和K,j為同義詞。 (1) 開放定址法 (2) 重哈希法 (3) 鏈接地址法 4. (1)構(gòu)造的二叉排序樹,如圖 (2)中序遍歷結(jié)果如下: 10 12 15 20 24 28 30 35 46 50 55 68 (4) 平均查找長度如下: ASLsucc = (1x1+2x2+3x3+4x3+5x3)/12 = 41/12 8. 哈希地址如下: H(35) = 35%11 = 2 H(67) = 67%11 = 1 H(42) = 42%11 = 9 H(21) = 21%11 = 10 H(29) = 29%11 = 7 H(86) = 86%11 = 9 H(95) = 95%11 = 7 H(47) = 47%11 = 3 H(50) = 50%11 = 6 H(36) = 36%11 = 3 H(91) = 91%11 = 3 第九章 選擇題 1. D 2.C 3.B 4.D 5.C 6.B 7.A 8.A 9.D 10.D 填空題 1. 插入排序、交換排序、選擇排序、歸并排序 2. 移動(或者交換) 3. 歸并排序、快速排序、堆排序 4. 保存當前要插入的記錄,可以省去在查找插入位置時的對是否出界的判斷 5. O(n)、O(log2n) 6. 直接插入排序或者改進了的冒泡排序、快速排序 7. Log2n、n 8. 完全二叉樹、n/2 9. 15 10. {12 38 25 35 50 74 63 90} 應用題 11. (1)Shell排序(步長為5 3 1)每趟的排序結(jié)果 初始序列為 100 87 52 61 27 170 37 45 61 118 14 88 32 步長為5的排序 14 37 32 61 27 100 87 45 61 118 170 88 52 步長為3的排序結(jié)果 14 27 32 52 37 61 61 45 88 87 170 100 118 步長為1的排序結(jié)果 14 27 32 37 45 52 61 61 87 88 100 118 最后結(jié)果 14 27 32 37 45 52 61 61 87 88 100 118 170 (2)快速排序每趟的排序結(jié)果如圖 初始序列 100 87 52 61 27 170 37 45 61 118 14 88 32 第一趟排序 [32 87 52 61 27 88 37 45 61 14]100[118 170] 第二趟排序 [14 27]32[61 52 88 37 45 61 87]100 118[170] 第三趟排序 14[27]32[45 52 37]61[88 61 87]100 118[170] 第四趟排序 14[27]32[37]45[52]61[87 61]88 100 118[170] 第五趟排序 14[27]32[37]45[52]61[87 61]88 100 118[170] 最后結(jié)果 14[27]32[37]45[52]61[61]87 88 100 118[170] (3)二路歸并排序每趟的排序結(jié)果 初始序列 [100][87][52][61][27][170][37][45][61][118][14][88][32] 第一趟歸并 [87 100][52 61][27 170][37 45][61 118][14 88][32] 第二趟歸并 [52 61 87 100][27 37 45 170][14 61 88 118][32] 第三趟歸并排序 [27 37 45 52 61 87 100 170][14 32 61 88 118] 第四趟歸并排序 [14 27 32 37 45 52 61 61 87 88 100 118 170] 最后結(jié)果 14 27 32 37 45 52 61 61 87 88 100 118 170 12. 采用快速排序時,第一趟排序過程中的數(shù)據(jù)移動如圖: 算法設計題 1. 分析:為討論方便,待排序記錄的定義為(后面各算法都采用此定義): #define MAXSIZE 100 /* 順序表的最大長度,假定順序表的長度為100 */ typedef int KeyType; /* 假定關(guān)鍵字類型為整數(shù)類型 */ typedef struct { KeyType key; /* 關(guān)鍵字項 */ OtherType other; /* 其他項 */ }DataType; /* 數(shù)據(jù)元素類型 */ typedef struct { DataType R[MAXSIZE+1]; /* R[0]閑置或者充當哨站 */ int length; /* 順序表長度 */ }sqList; /* 順序表類型 */ 設n個整數(shù)存儲在R[1..n]中,因為前n-2個元素有序,若采用直接插入算法,共要比較和移動n-2次,如果最后兩個元素做一個批處理,那么比較次數(shù)和移動次數(shù)將大大減小。 算法如下: (1) 求出大小 若R[n] >= R[n-1],則large = R[n],small = R[n-1];否則large = R[n-1],small = R[n]。 (2) 尋找large的位置,從 i = n – 2 開始循環(huán),若large < R[i],則R[i]后移兩個單元,并且i-1;否則執(zhí)行第三步。 (3) 插入large R[i+2] = large (4) 尋找small的位置 從i開始循環(huán),若small < R[i],則R[i]后移一個單元,并且i減1;否則,執(zhí)行第五步。 (5) 插入small R[i+1] = small,結(jié)束 算法描述如下: void insert-two( SqList * s ){ int n,i; DataType large,small; n = s->length; if( s->R[n].key >= s->R[n-1].key ){ large = s->R[n]; small = s->R[n-1]; }else{ large = s->R[n-1]; small = s->R[n]; } i = n-2; s->R[0] = large; while( large.key < s->R[i].key ){ s->R[i+2] = s->R[i]; i = i-1; } s->R[i+2] = large; s->R[0] = small; while( small.key < s->R[i].key ){ s->R[i+1] = s->R[i]; i = i-1; s->R[i+1] = small; } } 算法分析: 因為對兩個元素的插入是“同時”相繼進行的,所以讓其比較次數(shù)的最大值為n,最小值為3;平均值約為n/2;移動次數(shù)的最大值為n+2,最小值為4,平均約為n/2 。 可以看出,平均比較次數(shù)和記錄的平均移動次數(shù)約為直接插入排序的一半。該算法是穩(wěn)定的。 2. 分析:設R[0]~R[n-1]中存有n個記錄的待排序列,對其進行雙向冒泡。奇數(shù)趟對序列R[]從前往后掃描,比較相鄰的關(guān)鍵字,若逆序則交換,直到把關(guān)鍵字最大的記錄移動到序列尾部;偶數(shù)趟從后往前掃描,比較相鄰的關(guān)鍵字,若逆序則交換,直到把關(guān)鍵字最小的記錄移動到序列前端,反復進行上述過程,直到有序為止。因此需設變量i,記錄掃描的循環(huán)次數(shù)(奇數(shù)趟和偶數(shù)趟兩趟作為一個循環(huán)),以便對待排序列的上下界進行修正。 算法描述如下: void Shuttlesort( DataType R[], int n ){ int i=1,j,exchange = 1; while( exchange == 1 ){ exchange = 0; for( j=i-1;j<=n-i-1;++j ){ if( R[j].key > R[j+1].key ){ R[j] <=> R[j+1]; /* 交換 */ exchange = 1; } } for( j=n-i-1;j>=i;j-- ){ if( R[j-1].key > R[j].key ){ R[j-1] <=> R[j]; /* 交換 */ exchange = 1; } } ++i; } } 可以看出,循環(huán)次數(shù)最多為[n/2]+1次,最少為1次。記錄的比較次數(shù)和移動次數(shù)等同于單向掃描時的冒泡排序。 [此文檔可自行編輯修改,如有侵權(quán)請告知刪除,感謝您的支持,我們會努力把內(nèi)容做得更好] 最新可編輯word文檔- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 數(shù)據(jù)結(jié)構(gòu) 語言版 清華大學出版社 課后 部分 答案
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。
鏈接地址:http://zhongcaozhi.com.cn/p-5362901.html