習題集解析部分
第5章 數組和廣義表
——《數據結構題集》-嚴蔚敏.吳偉民版
源碼使用說明 鏈接☛☛☛ 《數據結構-C語言版》(嚴蔚敏,吳偉民版)課本源碼+習題集解析使用說明
課本源碼合輯 鏈接☛☛☛ 《數據結構》課本源碼合輯
習題集全解析 鏈接☛☛☛ 《數據結構題集》習題解析合輯
相關測試數據下載 鏈接☛ 數據包
本習題文檔的存放目錄:數據結構\▼配套習題解析\▼05 數組和廣義表
文檔中源碼的存放目錄:數據結構\▼配套習題解析\▼05 數組和廣義表\▼習題測試文檔-05
源碼測試數據存放目錄:數據結構\▼配套習題解析\▼05 數組和廣義表\▼習題測試文檔-05\Data
一、基礎知識題
5.1❶假設有二維數組A6×8,每個元素用相鄰的6個字節存儲,存儲器按字節編址,已知A的起始存儲位置(基地址)為1000,計算:
(1) 數組A的體積(即存儲量);
(2) 數組A的最后一個元素a57的第一個字節的地址;
(3) 按行存儲時,元素a14的第一個字節的地址;
(4) 按列存儲時,元素a47的第一個字節的地址。

5.2❶假設按低下標優先存儲整數數組A9×3×5×8時,第一個元素的字節地址是100,每個整數占四個字節。問下列元素的存儲地址是什么?
(1) a0000 (2) a1111 (3) a3125 (4) a8247

5.3❶按高下標優先存儲方式(以最右的下標為主序),順序列出數組A2×2×3×3中所有元素aijkl,為了簡化表達,可以只列出(i,j,k,l)的序列。

5.4❶將教科書5.3.1節中的式(5-3)改寫為一個等式的形式。

5.5❸設有上三角矩陣(aij)n×n,將其上三角元素逐行存於數組B[m]中(m充分大),使得B[k]=aij,且k=f1(i)+f2(j)+c。試推導出函數f1,f2和常數c(要求f1和f2中不含常數項)。

5.6❷設有三對角矩陣(aij)n×n,將其三條對角線上的元素存於數組B[3][n]中,使得元素B[u][v]=aij,試推導出從(i,j)到(u,v)的下標變換公式。

5.7❸設有三對角矩陣(aij)n×n,將其三條對角線上的元素逐行地存於數組B[3n-2]中,使得B[k]=aij,求:
(1) 用i,j表示k的下標變換公式;
(2) 用k表示i,j的下標變換公式。


5.8❸假設一個准對角矩陣
按以下方式存於一維數組B[4m]中:
寫出由一對下標(i,j)求k的轉換公式。

5.9❷已知A為稀疏矩陣,試從空間和時間角度比較采用兩種不同的存儲結構(二維數組和三元組表)完成求運算
的優缺點。

5.10❷求下列廣義表操作的結果:
(1) GetHead【(p, h, w)】;
(2) GetTail【(b, k, p, h)】;
(3) GetHead【((a, b), (c, d))】;
(4) GetTail【((a, b), (c, d))】;
(5) GetHead【GetTail【((a, b), (c, d))】】;
(6) GetTail【GetHead【((a, b), (c, d))】】;
(7) GetHead【GetTail【GetHead【((a, b), (c, d))】】】;
(8) GetTail【GetHead【GetTail【((a, b), (c, d))】】】.
注意:【】是函數的符號。

5.11❷利用廣義表的GetHead和GetTail操作寫出如上題的函數表達式,把原子banana分別從下列廣義表中分離出來。
(1) L1 = (apple, pear, banana, orange);
(2) L2 = ((apple, pear), (banana, orange));
(3) L3 = (((apple), (pear), (banana), (orange)));
(4) L4 = (apple, (pear), ((banana)), (((orange))));
(5) L5 = ((((apple))), ((pear)), (banana), orange);
(6) L6 = ((((apple), pear), banana), orange);
(7) L7 = (apple, (pear, (banana), orange));

5.12❷按教科書5.5節中圖5.8所示結點結構,畫出下列廣義表的存儲結構圖,並求它的深度。
(1) ((()),a,((b,c),(),d),(((e))))
(2) ((((a),b)),(((),(d)),(e,f)))


5.13❷已知以下各圖為廣義表的存儲結構圖,其結點結構和5.12題相同。寫出各圖表示的廣義表。

5.14❸已知等差數列的第一項為a1,公差為d,試寫出該數列前n項的和S(n)(n≥1)的遞歸定義。

5.15❹寫出求給定集合的冪集的遞歸定義。


5.16❸試利用C語言中的增量運算“++”和減量運算“--”寫出兩個非負整數a和b相加的遞歸定義。

5.17❸ 已知順序表L含有n個整數,試分別以函數形式寫出下列運算的遞歸算法:
(1) 求表中的最大整數;
(2) 求表中的最小整數;
(3) 求表中n個整數之和;
(4) 求表中n個整數之積;
(5) 求表中n個整數的平均值。


二、算法設計題
數組
5.18❺設計一個算法,將數組An中的元素A[0]至A[n-1]循環右移k位,並要求只用一個元素大小的附加存儲,元素移動或交換次數為O(n)。
5.19❹若矩陣Am×n中的某個元素aij是第i行中的最小值,同時又是第j列中的最大值,則稱此元素為該矩陣中的一個馬鞍點。假設二維數組存儲矩陣Am×n,試編寫求出矩陣中所有馬鞍點的算法,並分析你的算法在最壞情況下的時間復雜度。



5.20❺類似於以一維數組表示一元多項式,以m維數組:(aj1j2…jm),0≤ji≤n,i=1,2,…,m,表示m元多項式,數組元素ae1e2…em表示多項式中x1e1x2e2…xmem的系數。例如,和二元多項式x2+3xy+4y2-x+2相應的二維數組為:

試編寫一個算法將m維數組表示的m元多項式以常規表示的形式(按降冪順序)輸出。可將其中一項ckx1e1x2e2…xmem印成ckx1Ee1x2Ee2…xmEem(其中m,ck和ej(j=1,2,…,m)印出它們具體的值),當ck或ej(j=1,2,…,m)為1時,ck的值或“E”和ej的值可省略不印。


三元組順序表(稀疏矩陣)
5.21❹假設稀疏矩陣A和B均以三元組順序表作為存儲結構。試寫出矩陣相加的算法,另設三元組表C存放結果矩陣。


5.22❹假設稀疏矩陣A和B均以三元組順序表作為存儲結構。試寫出滿足以下條件的矩陣相加的算法:假設三元組順序表A的空間足夠大,將矩陣B加到矩陣A上,不增加A,B之外的附加空間,你的算法能否達到O(m+n)的時間復雜度?其中m和n分別為A,B矩陣中非零元的數目。


行邏輯鏈接的順序表(稀疏矩陣)
5.23❷三元組順序表的一種變型是,從三元組順序表中去掉行下標域得到二元組順序表,另設一個行起始向量,其每個分量是二元組順序表的一個下標值,指示該行中第一個非零元素在二元組順序表中的起始位置。試編寫一個算法,由矩陣元素的下標值i,j求矩陣元素。試討論這種方法和三元組順序表相比有什么優缺點。


稀疏矩陣
5.24❷三元組順序表的另一種變型是,不存矩陣元素的行、列下標,而存非零元在矩陣中以行為主序時排列的順序號,即在LOC(0, 0)=1,l=1時按教科書5.2節中公式(5-2)計算出的值。試寫一算法,由矩陣元素的下標值i,j求元素的值。


5.25❸若將稀疏矩陣A的非零元素以行序為主序的順序存於一維數組V中,並用二維數組B表示A中的相應元素是否為零元素(以0和1分別表示零元素和非零元素)。例如,

可用V=(15, 22, -6, 9)和
表示。
試寫一算法,實現在上述表示法中實現矩陣相加的運算。並分析你算法的時間復雜度。




十字鏈表(稀疏矩陣)
5.26❸試編寫一個以三元組形式輸出用十字鏈表表示的稀疏矩陣中非零元素及其下標的算法。
5.27❹試按教科書5.3.2節中定義的十字鏈表存儲表示編寫將稀疏矩陣B加到稀疏矩陣A上的算法。

廣義表
5.28❹采用教科書5.6節中給出的m元多項式的表示方法,寫一個求m元多項式中第一變元的偏導數的算法。
5.29❹采用教科書5.6節中給出的m元多項式的表示方法,寫一個m元多項式相加的算法。

5.30❸試按表頭、表尾的分析方法重寫求廣義表的深度的遞歸算法。



5.31❸試按教科書5.5節圖5.10所示結點結構編寫復制廣義表的遞歸算法。

5.32❹試編寫判別兩個廣義表是否相等的遞歸算法。


5.33❹試編寫遞歸算法,輸出廣義表中所有原子項及其所在層次。


5.34❺試編寫遞歸算法,逆轉廣義表中的數據元素。
例如:將廣義表
(a, ((b, c), ()), (((d), e), f))
逆轉為:
((f, (e, (d))), ((), (c, b)), a)。



5.35❺假設廣義表按如下形式的字符串表示。
(a1, a2, …, an) n≥0
其中ai或為單字母表示的原子,或為廣義表;n=0時為只含空格字符的空表( )。
試按教科書5.5節圖5.8所示鏈表結點結構編寫,按照讀入的一個廣義表字符串建立其存儲結構的遞歸算法。


5.36❺試按教科書5.5節圖5.8所示存儲結構,編寫按上題描述的格式輸出廣義表的遞歸算法。


5.37❺試編寫遞歸算法,刪除廣義表中所有值等於x的原子項。


5.38❹試編寫算法,依次從左至右輸出廣義表中第l層的原子項。
例如:廣義表(a, (b, (c)), (d))中的a為第一層的原子項;b和d為第二層的原子項;c為第三層的原子項。



