第五章1 數(shù)組
《第五章1 數(shù)組》由會員分享,可在線閱讀,更多相關《第五章1 數(shù)組(13頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第5章 數(shù)組 作為抽象數(shù)據(jù)類型數(shù)組的類聲明。 ? #include 〈iostream.h>?? //在頭文件“array.h”中 ? #include 〈stdlib.h〉 const int DefaultSize = 30; ?? template <class Type> class Array { //數(shù)組是數(shù)據(jù)類型相同的n(size)個元素的一個集合, 下標范圍從0到n-1.對數(shù)組中元素 ? //可按下標所指示位置直接訪問。 ? private: ? Type *elements;? ? ? ?? //數(shù)組 ?? int ArraySize;
2、???? ? //元素個數(shù) ?public: Array ( int Size = DefaultSize ); ??? ?//構(gòu)造函數(shù) ? Array ( const Array〈Type> & x ); ?????//復制構(gòu)造函數(shù) ?? ~Array ( ) { delete [ ] elements; } ???? //析構(gòu)函數(shù) ? Array〈Type〉 & operator =?。?const Array〈Type〉 & A ); //數(shù)組整體賦值 (復制) ?? Type& operator [ ] ( int i ); ? ?? //按下標
3、訪問數(shù)組元素 ? int Length ( ) const { return?。羠raySize; } ??//取數(shù)組長度 void ReSize ( int sz ); ???? //修改數(shù)組長度 ? } ??順序表的類定義 ?#include < iostream.h〉? ? ?//定義在頭文件“seqlist.h”中 #include 〈stdlib.h〉 template <class Type〉 class SeqList {? ? ??private: ? Type *data;? ? ?//順序表的存放數(shù)組 ? int M
4、axSize;? ? ?//順序表的最大可容納項數(shù) ? int last;? ????//順序表當前已存表項的最后位置 ? int current; ? ?//順序表的當前指針(最近處理的表項) public: ?? SeqList ( int MaxSize );? ??//構(gòu)造函數(shù) ? ~SeqList ( ) { delete [ ] data; } ??//析構(gòu)函數(shù) ? int Length?。?) const { return last+1;?。??//計算表長度 int Find ( Type& x ) const;
5、??//定位函數(shù): 找x在表中位置,置為當前表項 ?? int IsIn ( Type& x );? ? ?//判斷x是否在表中,不置為當前表項 ? Type *GetData ( ) { return current == —1?NULL : data[current]; }?//取當前表項的值 int Insert ( Type& x ); ?? //插入x在表中當前表項之后,置為當前表項 int Append ( Type& x );????//追加x到表尾,置為當前表項 ? Type * Remove ( Type& x ); ??
6、?//刪除x,置下一表項為當前表項 ? Type * First?。ā。?? ? //取表中第一個表項的值,置為當前表項 Type * Next ( ) { return current 〈 last ? &data[++current] : NULL;?。? ? ? //取當前表項的后繼表項的值,置為當前表項 ? Type?。?Prior ( )?。。騟turn current > 0 ? &data[--current] : NULL; }? ? ?? //取當前表項的前驅(qū)表項的值,置為當前表項 ? int IsEmpty ( ) { re
7、turn last == —1; }? //判斷順序表空否, 空則返回1; 否則返回0 ?? int IsFull ( ) { return last == MaxSize—1; } //判斷順序表滿否, 滿則返回1; 否則返回0 ??} 2-1 設n個人圍坐在一個圓桌周圍,現(xiàn)在從第s個人開始報數(shù),數(shù)到第m個人,讓他出局;然后從出局的下一個人重新開始報數(shù),數(shù)到第m個人,再讓他出局,……,如此反復直到所有的人全部出局為止。下面要解決的Josephus問題是:對于任意給定的n, s和m,求出這n個人的出局序列。請以n?。?9, s = 1, m = 5為例,人工模擬Josephus的求解
8、過程以求得問題的解. 【解答】 出局人的順序為5, 1, 7, 4, 3, 6, 9, 2,?。?。 2-2 試編寫一個求解Josephus問題的函數(shù)。用整數(shù)序列1, 2, 3, ……, n表示順序圍坐在圓桌周圍的人,并采用數(shù)組表示作為求解過程中使用的數(shù)據(jù)結(jié)構(gòu).然后使用n = 9, s = 1, m = 5,以及n = 9, s =?。? m = 0,或者n = 9, s = 1, m = 10作為輸入數(shù)據(jù),檢查你的程序的正確性和健壯性.最后分析所完成算法的時間復雜度。 【解答】函數(shù)源程序清單如下: void Josephus( int A[?。? int n, s, m ) {
9、 ?int i, j, k, tmp; ? if ( m == 0 ) { cout 〈< "m = 0是無效的參數(shù)!” 〈< endl; return; } for ( i = 0; i 〈 n; i++ ) A[i] = i + 1;? ?/*初始化,執(zhí)行n次*/ ?i = s - 1;? ? ? /*報名起始位置*/ ? for (?。搿? n; k 〉 1; i—- ) {??? ?/*逐個出局,執(zhí)行n-1次*/ if ( i == k ) i = 0; ? i = ( i + m — 1 ) % k; ? /*尋找出局位置*/ if (?。?!
10、= k-1?。?{ tmp = A[i];??????/*出局者交換到第k-1位置*/ ?? for ( j = i; j 〈 k-1; j++ ) A[j] = A[j+1]; ? A[k—1] = tmp; ?? } ? } ? for ( k = 0; k < n / 2;?。?+ ) { ? /*全部逆置, 得到出局序列*/ ?? tmp = A[k]; A[k] =?。粒郏睢猭+1]; A[n-k+1] = tmp; ? } } 例:n = 9, s = 1, m = 5 0 1 2 3 4 5 6 7
11、 8 k = 9 1 2 3 ?。? 5 6 7 8 ?。? 第5人出局, i = 4 k = 8 1 2 ?。? 4 6 7 8 9 5 第1人出局, i = 0 k = 7 2 3 4 6 7 8 9 1 5 第7人出局, i = 4 k = 6 2 3 4 6 8 9 7 1 5 第4人出局, i = 2 k = 5 2 3 6 8 9 4 7 1 5 第3人出局, i = 1 k = 4
12、 2 6 8 9 3 4 7 1 5 第6人出局, i = 1 k = 3 2 8 ?。? 6 3 4 7 1 5 第9人出局, i = 2 k = 2 2 8 9 6 3 4 7 1 5 第2人出局, i =?。? 8 2 9 6 3 4 7 1 5 第8人出局, i = 0 逆置 5 1 7 4 3 6 9 2 8 最終出局順序 ?例:n = 9, s = 1, m = 0 ?報錯信息 m =
13、?。笆菬o效的參數(shù)! 例:n = 9, s = 1,?。?= 10 0 1 2 3 4 5 ?。? 7 8 k = 9 1 2 3 4 5 6 7 8 9 第1人出局, i = 0 k = 8 2 3 4 5 6 7 8 9 1 第3人出局, i = 1 k = 7 2 4 5 6 7 8 9 3 ?。? 第6人出局, i = 3 k = 6 2 4 5 7 8 9 6 3 1
14、 第2人出局, i = 0 k = 5 4 5 7 8 9 ?。? 6 3 1 第9人出局, i = 4 k?。?4 4 5 7 8 9 2 6 ?。? 1 第5人出局, i = 1 k = 3 4 7 8 5 9 2 6 3 1 第7人出局, i = 1 k = 2 4 8 7 5 9 ?。? 6 3 1 第4人出局, i = 0 8 4 7 5 9 2 6 3 1 第8人出局, i = 0 逆置
15、 1 3 6 2 9 5 7 4 8 最終出局順序 當m = 1時,時間代價最大。達到( n—1 ) + ( n-2 )?。?????? + 1 = n(n-1)/2 ? O(n2)。 2—3 設有一個線性表?。╡0, e1, …, en-2, en—1) 存放在一個一維數(shù)組A[arraySize]中的前n個數(shù)組元素位置。請編寫一個函數(shù)將這個線性表原地逆置,即將數(shù)組的前n個原址內(nèi)容置換為 (en-1, en—2, …, e1, e0)。 【解答】 ?templat(yī)e<class Type> void inverse ( Type A[ ], in
16、t n ) { ?Type tmp; ?for ( int i = 0; i 〈= ( n-1 ) / 2; i++ ) { ?tmp = A[i]; A[i] = A[n-i-1]; A[n—i—1] = tmp; } ?} 2-4 假定數(shù)組A[arraySize]中有多個零元素, 試寫出一個函數(shù), 將A 中所有的非零元素依次移到數(shù)組A的前端A[i](0£ i £?。醨raySize)。 【解答】 因為數(shù)組是一種直接存取的數(shù)據(jù)結(jié)構(gòu),在數(shù)組中元素不是像順序表那樣集中存放于表的前端,而是根據(jù)元素下標直接存放于數(shù)組某個位置,所以將非零元素前移時必須檢測整個數(shù)組空間
17、,并將后面變成零元素的空間清零。函數(shù)中設置一個輔助指針free,指示當前可存放的位置,初值為0。
?template
18、2—5 順序表的插入和刪除要求仍然保持各個元素原來的次序。設在等概率情形下, 對有127個元素的順序表進行插入, 平均需要移動多少個元素? 刪除一個元素, 又平均需要移動多少個元素? 【解答】 ?若設順序表中已有n = last+1個元素,last是順序表的數(shù)據(jù)成員,表明最后表項的位置。又設插入或刪除表中各個元素的概率相等,則在插入時因有n+1個插入位置(可以在表中最后一個表項后面追加),每個元素位置插入的概率為1/(n+1),但在刪除時只能在已有n個表項范圍內(nèi)刪除,所以每個元素位置刪除的概率為1/n。 插入時平均移動元素個數(shù)AMN(Averagy Moving Number )為
19、刪除時平均移動元素個數(shù)AMN為 2-6 若矩陣Am′n中的某一元素A[i][j]是第i行中的最小值,同時又是第j列中的最大值,則稱此元素為該矩陣的一個鞍點.假設以二維數(shù)組存放矩陣,試編寫一個函數(shù),確定鞍點在數(shù)組中的位置(若鞍點存在時),并分析該函數(shù)的時間復雜度。 【解答】 ?int minmax ( int?。粒?][ ], const int m, const int n ) { //在二維數(shù)組A[m][n]中求所有鞍點, 它們滿足在行中最小同時在列中最大 int *row = new int[m]; int * col?。健ew int[n]; ? int i
20、, j; ? for ( i = 0;?。?< m; i++ ) {? ?//在各行中選最小數(shù)組元素, 存于row[i] ? row[i] = A[i][0]; ? for?。ā = 1; j?。?n; j++ ) if ( A[i][j] < row[i] ) row[i] = A[i][j]; ? } ? for (?。?= 0; j 〈 n; j++ )?。? ??//在各列中選最大數(shù)組元素, 存于col[j] ??。悖飈[i] = A[0][j];? for ( i = 1; i < m; i++ )
21、 if ( A[i][j] 〉 col[j] ) col[j] = A[i][j]; } for ( i?。?0; i?。?m; i++ ) {?? ? //檢測矩陣,尋找鞍點并輸出其位置 ? for ( j = 0; j < n; j++ ) ? if ( row[i] == col[j] ) cout << “The saddle point is?。骸?” <〈 i 〈< “, " 〈< j << “)” 〈〈 endl; ? delete [ ] row; ?。鋏lete [ ] col; } 此算法有3個并列二重循環(huán),其時間復雜度
22、為O(m′n). 2-7 設有一個二維數(shù)組A[m][n],假設A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每個元素占一個空間,問A[3][3](10)存放在什么位置?腳注(10)表示用10進制表示. 【解答】 設數(shù)組元素A[i][j]存放在起始地址為Loc ( i, j ) 的存儲單元中。 ∵ Loc ( 2, 2 ) = Loc ( 0, 0 )?。?2 * n + 2 = 644 + 2 * n?。? = 676. ∴ n = ( 676 - 2 - 644 ) /?。病? 15 ∴ Loc ( 3, 3 ) = Loc ( 0, 0?。?
23、+ 3 * 15 + 3 = 644 + 45 + 3 = 692. 2-8 利用順序表的操作,實現(xiàn)以下的函數(shù)。 ?(1) 從順序表中刪除具有最小值的元素并由函數(shù)返回被刪元素的值。空出的位置由最后一個元素填補,若順序表為空則顯示出錯信息并退出運行。 (2) 從順序表中刪除第i個元素并由函數(shù)返回被刪元素的值。如果i不合理或順序表為空則顯示出錯信息并退出運行。 ?(3) 向順序表中第i個位置插入一個新的元素x。如果i不合理則顯示出錯信息并退出運行。 ?(4) 從順序表中刪除具有給定值x的所有元素。 ?(5) 從順序表中刪除其值在給定值s與t之間(要求s小于t)的所有元素,如果s或t
24、不合理或順序表為空則顯示出錯信息并退出運行。
(6) 從有序順序表中刪除其值在給定值s與t之間(要求s小于t)的所有元素,如果s或t不合理或順序表為空則顯示出錯信息并退出運行。
?(7) 將兩個有序順序表合并成一個新的有序順序表并由函數(shù)返回結(jié)果順序表。
(8) 從順序表中刪除所有其值重復的元素,使表中所有元素的值均不相同。
【解答】
(1) 實現(xiàn)刪除具有最小值元素的函數(shù)如下:
templat(yī)e
25、r << “ List is Empty! ” 〈< endl; exit(1); } int m = 0; ? ? ??//假定0號元素的值最小 for ( int?。?= 1; i <= last; i++ ) {????//循環(huán), 尋找具有最小值的元素 ? if?。?data[i] 〈 data[m] ) m = i; ? ?//讓m指向當前具最小值的元素 Type?。鬳mp = dat(yī)a[m]; data[m] = data[last]; last——; ? ?//空出位置由最后元素填補, 表最后元素位置減1 ? retur
26、n temp; ?} (2) 實現(xiàn)刪除第i個元素的函數(shù)如下(設第i個元素在data[i], i=0,1,?,last): template〈Type〉 Type SeqList〈Type> :: DelNo#i?。ānt?。?) { if?。?last == -1 || i < 0 || i 〉 last ) ?//表空, 或i不合理, 中止操作返回 { cerr 〈< “ List is Empty or?。衋rameter is out range! ” << endl; exit(1);?。? Type temp = data[i];? ? ?
27、?//暫存第i個元素的值
for ( int j?。健; j 〈 last;?。辏? ) ? ??//空出位置由后續(xù)元素順次填補
data[j] =?。洌醫(yī)a[j+1];
last--; ? ???//表最后元素位置減1
return temp;
}
(3) 實現(xiàn)向第i個位置插入一個新的元素x的函數(shù)如下(設第i個元素在dat(yī)a[i], i=0,1,?,last):
?template〈Type〉 void SeqList 28、ze-1|| i 〈 0 || i 〉 last+1 ) ?//表滿或參數(shù)i不合理, 中止操作返回
? { cerr << “ List is Full or Parameter is out range! ” << endl; ?。鍃it(1); }
for ( int j = last; j >= i; j-- ) ? //空出位置以便插入, 若i=last+1, 此循環(huán)不做
?。鋋ta[j+1] = data[j];
data[i] = x; ??? //插入
last++; ?? ???//表最后元素位置加1
?}
?(4) 29、 從順序表中刪除具有給定值x的所有元素。
template〈Type> void SeqList〈Type〉 :: DelValue ( Type& x ) {
int i = 0, j;
while ( i 〈= last ) ??????//循環(huán), 尋找具有值x的元素并刪除它
? if ( data[i] == x ) { ??//刪除具有值x的元素, 后續(xù)元素前移
for ( j = i; j 。靉st; j++ ) dat(yī)a[j] = data[j+1];
last-—; ??? ?? //表最后元素位置減1
? }
? e 30、lse i++;
}
?(5) 實現(xiàn)刪除其值在給定值s與t之間(要求s小于t)的所有元素的函數(shù)如下:
template<Type> void SeqList〈Type> ::?。膃lNo#sto#t ( Type&?。?, Type& t ) {
if ( last == -1 ||?。?>= t )
?。?cerr 〈< “List is empty or parameters are illegal!" <〈 endl; exit(1); }
int i = 0, j;?
? while?。?i <= last ) ?? ??//循環(huán), 尋找具有值x的元 31、素并刪除它
? if ( data[i] >= s && data[i] <= t ) { ?//刪除滿足條件的元素, 后續(xù)元素前移
for?。ā = i;?。?< last; j++ ) data[j] = data[j+1];
last——; ? ???? //表最后元素位置減1
?? }
else i++;
}
?(6) 實現(xiàn)從有序順序表中刪除其值在給定值s與t之間的所有元素的函數(shù)如下:
template〈Type>?。鰋id?。觘qList<Type> :: DelNo#sto#t1 ( Type& s, Type& t?。
?。閒 ( 32、?。靉st ==?。?|| s >=?。?)
{ cerr <〈 “List is empty or parameters are illegal!” <〈 endl; exit(1); }
for ( int i = 0; i <= last; i++ ) ??? //循環(huán), 尋找值 ≥s 的第一個元素
? if ( data[i] 〉= s ) break; ? ?? //退出循環(huán)時, i指向該元素
if ( i <= last ) {
for ( int j = 1; i + j 〈= last; j++ )? ?//循環(huán), 尋找值?。?t 的第一 33、個元素
if ( data[i+j] > t?。?break; ? //退出循環(huán)時, i+j指向該元素
for ( int k = i+j; k 〈= last; k++ ) ?//刪除滿足條件的元素, 后續(xù)元素前移
data[k-j]?。?data[k];
last-= j; ??? ? //表最后元素位置減j
? }
}
(7) 實現(xiàn)將兩個有序順序表合并成一個新的有序順序表的函數(shù)如下:
templat(yī)e〈Type〉 SeqList 34、〈Type>& B ) {
//合并有序順序表A與B成為一個新的有序順序表并由函數(shù)返回
?。閒?。?A.Length() + B.Length() > MaxSize )
{ cerr 〈< “The summary of The length of?。蘨sts is out MaxSize!” 〈< endl; exit(1); }
Type value1 = A.Fist ( ), value2 = B.Fisrt ( );
?。閚t i?。?0, j = 0, k =?。埃?
?。鱤ile ( i 〈 A.length ( )?。? j 〈 B.leng 35、th ( ) ) { //循環(huán), 兩兩比較, 小者存入結(jié)果表
if ( value1 <= value2 )
{ data[k] = value1; value1 = A。Next?。?); i++; }
else { dat(yī)a[k] = value2; value2 = B.Next (?。?; j++; }
k++;
? ?。?
while ( i < A.Length ( ) ) ? ?//當A表未檢測完, 繼續(xù)向結(jié)果表傳送
{ data[k] = value1; value1 = A.Next ( ); i++; k+ 36、+; } ??
while ( j 〈 B.Length ( ) ) ? ??//當B表未檢測完, 繼續(xù)向結(jié)果表傳送
{ data[k] = value2; value2 = B。Next ( ); j++; k++; }
? last = k – 1;
? return *this;
}
(8) 實現(xiàn)從表中刪除所有其值重復的元素的函數(shù)如下:
template<Type〉 void SeqList〈Type> :: DelDouble?。?) {
if ( last == -1 )
{ cerr 〈〈 “List is empty!” 37、<< endl; exit(1); }
int i = 0, j, k; Type temp;
while ( i <= last ) {? ? ?//循環(huán)檢測
j = i + 1; temp = data[i];
while ( j <= last ) {??? //對于每一個i, 重復檢測一遍后續(xù)元素
if?。?temp == data[j]?。?{?? ? //如果相等, 后續(xù)元素前移
for ( k = j+1; k <= last; k++ ) data[k-1] = data[k];
? last--; ? 38、? //表最后元素位置減1
}
else j++;
}
i++; ???//檢測完dat(yī)a[i], 檢測下一個
? }
}
2—9 設有一個n′n的對稱矩陣A,如圖(a)所示。為了節(jié)約存儲,可以只存對角線及對角線以上的元素,或者只存對角線或?qū)蔷€以下的元素。前者稱為上三角矩陣,后者稱為下三角矩陣。我們把它們按行存放于一個一維數(shù)組B中,如圖(b)和圖(c)所示。并稱之為對稱矩陣A的壓縮存儲方式.試問:
?(1) 存放對稱矩陣A上三角部分或下三角部分的一維數(shù)組B有多少元素?
(2) 若在一維數(shù)組B中從0號位置開始存放,則如圖(a)所示的對稱矩陣 39、中的任一元素aij在只存上三角部分的情形下(圖(b))應存于一維數(shù)組的什么下標位置?給出計算公式。
(3) 若在一維數(shù)組B中從0號位置開始存放,則如圖(a)所示的對稱矩陣中的任一元素aij在只存下三角部分的情形下(圖(c))應存于一維數(shù)組的什么下標位置?給出計算公式.
【解答】
?(1) 數(shù)組B共有n + ( n-1 ) +?????? + 1= n * ( n+1 ) / 2個元素。
(2) 只存上三角部分時,若i £ j,則數(shù)組元素A[i][j]前面有i—1行(1~i—1,第0行第0列不算),第1行有n個元素,第2行有n—1個元素,??????,第i—1行有n—i+2個元素。 40、在第i行中,從對角線算起,第j號元素排在第j-i+1個元素位置(從1開始),因此,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為
??n + (n—1) +?。╪-2) + ?????? + (n-i+2) + j-i+1
= (2n-i+2) *?。ǎ椋?) / 2 + j-i+1
= (2n-i) * (i—1) / 2 + j
若i 〉 j,數(shù)組元素A[i][j]在數(shù)組B中沒有存放,可以找它的對稱元素A[j][i]。在
數(shù)組B的第 (2n—j)?。。╦—1) / 2 + i位置中找到。
?如果第0行第0列也計入,數(shù)組B從0號位置開始存放,則數(shù)組元素A[i][j]在數(shù)組B 41、中的存放位置可以改為
??當i £ j時,= (2n—i+1) * i?。?2 + j - i =?。?2n — i - 1 ) * i / 2 + j
?當i > j時,= (2n - j?。?1) * j / 2 + i
?(3) 只存下三角部分時,若i 3 j,則數(shù)組元素A[i][j]前面有i-1行(1~i-1,第0行第0列不算),第1行有1個元素,第2行有2個元素,??????,第i-1行有i-1個元素。在第i行中,第j號元素排在第j個元素位置,因此,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為
??1 + 2 + ?????? +?。╥—1) + j = ( i—1) 42、*i / 2 + j
若i 〈 j,數(shù)組元素A[i][j]在數(shù)組B中沒有存放,可以找它的對稱元素A[j][i]。在
數(shù)組B的第 (j-1)*j?。?2 + i位置中找到。
?如果第0行第0列也計入,數(shù)組B從0號位置開始存放,則數(shù)組元素A[i][j]在數(shù)組B中的存放位置可以改為
? 當i 3 j時,= i*(i+1) / 2 + j
當i 〈 j時,= j*(j+1) / 2 + i
2—10 設A和B均為下三角矩陣,每一個都有n行。因此在下三角區(qū)域中各有n(n+1)/2個元素。另設有一個二維數(shù)組C,它有n行n+1列。試設計一個方案,將兩個矩陣A和B中的下三角區(qū)域元素存放于 43、同一個C中.要求將A的下三角區(qū)域中的元素存放于C的下三角區(qū)域中,B的下三角區(qū)域中的元素轉(zhuǎn)置后存放于C的上三角區(qū)域中。并給出計算A的矩陣元素aij和B的矩陣元素bij在C中的存放位置下標的公式。
【解答】
計算公式
2—11 在實際應用中經(jīng)常遇到的稀疏矩陣是三對角矩陣,如右圖所示。在該矩陣中除主對角線及在主對角線上下最臨近的兩條對角線上的元素外,所有其它元素均為0?,F(xiàn)在要將三對角矩陣A中三條對角線上的元素按行存放在一維數(shù)組B中,且a11存放于B[0].試給出計算A在三條對角線上的元素aij?。?£ i £ n, i—1 £ j £ i+1)在一維數(shù)組B中的存放位置的計算公式.
44、
【解答】
在B中的存放順序為 [?。?1, a12, a21, a22, a23, a32, a33, a34, …, an n-1, ann ],總共有3n—2個非零元素。元素aij在第i行,它前面有3(i-1)-1個非零元素,而在本行中第j列前面有j—i+1個,所以元素aij在B中位置為2*i+j-3.
2-12 設帶狀矩陣是n′n階的方陣,其中所有的非零元素都在由主對角線及主對角線上下各b條對角線構(gòu)成的帶狀區(qū)域內(nèi),其它都為零元素。試問:
?(1) 該帶狀矩陣中有多少個非零元素?
(2) 若用一個一維數(shù)組B按行順序存放各行的非零元素,且設a11存放在B[0]中,請給出 45、一個公式,計算任一非零元素aij在一維數(shù)組B中的存放位置。
【解答】
(1) 主對角線包含n個非零元素,其上下各有一條包含n-1個非零元素的次對角線,再向外,由各有一條包含n—2個非零元素的次對角線,……,最外層上下各有一條包含n-b個非零元素的次對角線。則總共的非零元素個數(shù)有
n +?。玻ǎ?1) + 2(n—2) + … + 2(n-b) = n + 2( (n-1) + (n-2 ) + … + (n-b) )
(2) 在用一個一維數(shù)組B按行順序存放各行的非零元素時,若設b≤n/2,則可按各行非零元素個數(shù)變化情況,分3種情況討論。
① 當1≤i≤b+1時,矩陣第1行有b+1個 46、元素,第2行有b+2個元素,第3行有b+3個元素,……,第i行存有b+i個元素,因此,數(shù)組元素A[i][j]在B[ ]中位置分析如下:
?第i行(i≥1)前面有i—1行,元素個數(shù)為 (b+1)+(b+2)+…+(b+i—1) = (i—1)*b+i*(i—1)/2,在第i行第j列(j≥1)前面有j—1個元素,則數(shù)組元素A[i][j]在B[ ]中位置為
② 當b+1
47、步減少。當i=n—b+1時有2b個非零元素,當i=n—b+2時有2b-1個非零元素,當i=n—b+3時有2b-2個非零元素,…,當i=n時有b+1個非零元素。因為前面n—b行總共有b*(3*b+1)/2+(n—2*b)*(2*b+1)個非零元素,所以在最后各行數(shù)組元素A[i][j]在B[ ]中位置為
2-13 稀疏矩陣的三元組表可以用帶行指針數(shù)組的二元組表代替。稀疏矩陣有多少行,在行指針數(shù)組中就有多少個元素:第i個元素的數(shù)組下標i代表矩陣的第i行,元素的內(nèi)容即為稀疏矩陣第i行的第一個非零元素在二元組表中的存放位置。二元組表中每個二元組只記錄非零元素的列號和元素值,且各二元組按行號遞 48、增的順序排列。試對右圖所示的稀疏矩陣,分別建立它的三元組表和帶行指針數(shù)組的二元組表。
二元組表 dat(yī)a
col
value
0
0
12
1
2
11
2
5
13
3
6
14
4
1
—4
5
5
3
6
3
8
7
1
—9
8
4
2
行指針數(shù)組
row
0
0
1
3
2
4
3
6
4
7
5
7
【解答】
2-14 字符串的替換操作replace (String &s, String?。, String &v)是指:若t是s的子串,則用串v替換串 49、t在串s中的所有出現(xiàn);若t不是s的子串,則串s不變.例如,若串s為“aabbabcbaabaaacbab”,串t為“bab",串v為“abdc",則執(zhí)行replace操作后,串s中的結(jié)果為“aababdccbaabaaacabdc”。試利用字符串的基本運算實現(xiàn)這個替換操作。
【解答】
String &?。觮ring :: Replace ( String?。?t, String &v) {
if ( ( int id?。?Find ( t ) ) == -1 ) ? //沒有找到,當前字符串不改,返回
{ cout 〈〈 "The (replace)?。铮餰ration fai 50、led." << endl; return *this; }
String temp( ch ); ? ?//用當前串建立一個空的臨時字符串
ch[0] = ’\0’; curLen = 0;? ???//當前串作為結(jié)果串,初始為空
int j, k = 0, l;?? ? ?//存放結(jié)果串的指針 ?? while ( id != -1?。?{? ? for ( j = 0; j 〈 id; j++) ch[k++] = temp.ch[j]; //摘取temp.ch中匹配位置
? if ( curLen+ id + v。curLen <= maxLen?。?/p>
51、
l =?。觯甤urLen; ?? ?//確定替換串v傳送字符數(shù)l
?? else l = maxLen- curLen- id;
? for ( j = 0; j 〈 l; j++ ) ch[k++] =?。?。ch[j];? //連接替換串v到結(jié)果串ch后面
?? curLen += id + l;?? ? //修改結(jié)果串連接后的長度
if ( curLen == maxLen ) break;????//字符串超出范圍
?? for ( j = id + t.curLen; j 〈 temp.curLen; j++?。?
temp.ch[j- id - 52、t。curLen] = temp.ch[j]; //刪改原來的字符串??。鬳mp。curLen?。?id + t.curLen;
id = temp.Find ( t );? }
return *this;
}
2—15 編寫一個算法frequency,統(tǒng)計在一個輸入字符串中各個不同字符出現(xiàn)的頻度。用適當?shù)臏y試數(shù)據(jù)來驗證這個算法。
【解答】
?include 53、符串,數(shù)組A[ ]中記錄字符串中有多少種不同的字符,C[ ]中記錄每
//一種字符的出現(xiàn)次數(shù)。這兩個數(shù)組都應在調(diào)用程序中定義。k返回不同字符數(shù).
??int i, j, len = s.length( );
if ( !len ) { cout 〈〈 "The string is empty. " 〈< endl; k = 0; return; }
??else { A[0] = s[0]; C[0] = 1; k = 1;?? ?/*語句s[i]是串的重載操作*/
for ( i = 1; i < len; i++ ) C[i] = 0; ??/*初 54、始化*/
for?。ā = 1; i 〈 len; i++ )?。?? ?? /*檢測串中所有字符*/
??? ?。?= 0;? while ( j?。?k && A[j] != s[i] ) j++;?/*檢查s[i]是否已在A[ ]中*/
?? if ( j == k )?。?A[k] = s[i]; C[k]++; k++ } ?/*s[i]從未檢測過*/
?? else C[j]++;? ? ?/*s[i]已經(jīng)檢測過*/
? ? }
???}
?}
測試數(shù)據(jù) s = "cast cast sat at a tasa\ 55、0”測試結(jié)果
A
c
a
s
t
b
C
2
?。?
4
5
?。?
【另一解答】
include 〈iostream。h〉
include "string。h”
const?。閚t?。鉮arnumber = 128; ? ? /*ASCII碼字符集的大?。?
void frequency( String& s, int& C[ ]?。?{
// s是輸入字符串,數(shù)組C[ ]中記錄每一種字符的出現(xiàn)次數(shù)。
for ( int i = 0; i < charnumber; i++ ) C[i] = 0; ? ?/*初始化*/
? 56、 for ( i = 0; i < s.length ( ); i++?。????? /*檢測串中所有字符*/
C[ atoi (s[i])?。?+;?? ???/*出現(xiàn)次數(shù)累加*/
for?。ā。?= 0; i < charnumber; i++ ) ?/*輸出出現(xiàn)字符的出現(xiàn)次數(shù)*/
if (?。茫郏閉 > 0 ) cout 〈< ”( " << i << " ) : \t" << C[i] 〈〈 "\t”;
}
2—16 設串s為“aaab",串t為“abcabaa”,串r為“abcaabbabcabaacbacba",試分別計算它們的失效函數(shù)f (j)的值。
57、
【解答】
j
0
1
2
3
j
0
1
2
3
4
5
6
?。?
a
a
a
b
t
a
b
c
a
b
a
a
f (j)
-1
0
1
—1
f (j)
—1
-1
-1
0
1
0
0
2-17 設定整數(shù)數(shù)組B[m+1][n+1]的數(shù)據(jù)在行、列方向上都按從小到大的順序排序,且整型變量x中的數(shù)據(jù)在B中存在.試設計一個算法,找出一對滿足B[i][j] == x的i, j值。要求比較次數(shù)不超過m+n.
【解答】
?算法的思想是逐次二維數(shù)組右上角的元素進行比較。每次比較有三種可能的結(jié)果:若相 58、等,則比較結(jié)束;若右上角的元素小于x,則可斷定二維數(shù)組的最上面一行肯定沒有與x相等的數(shù)據(jù),下次比較時搜索范圍可減少一行;若右上角的元素大于x,則可斷定二維數(shù)組的最右面一列肯定不包含與x相等的數(shù)據(jù),下次比較時可把最右一列剔除出搜索范圍。這樣,每次比較可使搜索范圍減少一行或一列,最多經(jīng)過m+n次比較就可找到要求的與x相等的數(shù)據(jù)。
?void find ( int B[ ][ ], int m, int n, int x, int& i, int& j ) {
//在二維數(shù)組B[m][n]中尋找與x相等的元素, 找到后, 由i與j返回該數(shù)組元素的位置
? i = 0; j =?。?;
while ( B[i][j] != x )
if ( B[i][j] < x?。?i++;
?? else j--;
?}
不足之處,敬請諒解
21 / 13
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應急救援安全知識競賽試題
- 1 礦井泵工考試練習題含答案
- 2煤礦爆破工考試復習題含答案
- 1 各種煤礦安全考試試題含答案