第五章1 數(shù)組
《第五章1 數(shù)組》由會(huì)員分享,可在線閱讀,更多相關(guān)《第五章1 數(shù)組(13頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(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)個(gè)元素的一個(gè)集合, 下標(biāo)范圍從0到n-1.對(duì)數(shù)組中元素 ? //可按下標(biāo)所指示位置直接訪問。 ? private: ? Type *elements;? ? ? ?? //數(shù)組 ?? int ArraySize;
2、???? ? //元素個(gè)數(shù) ?public: Array?。?int Size = DefaultSize ); ??? ?//構(gòu)造函數(shù) ? Array?。āonst Array〈Type> & x ); ?????//復(fù)制構(gòu)造函數(shù) ?? ~Array ( ) { delete [ ] elements; } ???? //析構(gòu)函數(shù) ? Array〈Type〉 & operator =?。?const Array〈Type〉 & A ); //數(shù)組整體賦值 (復(fù)制) ?? Type& operator [ ] ( int i ); ? ?? //按下標(biāo)
3、訪問數(shù)組元素 ? int Length ( ) const { return ArraySize; } ??//取數(shù)組長(zhǎng)度 void ReSize ( int sz ); ???? //修改數(shù)組長(zhǎng)度 ? } ??順序表的類定義 ?#include < iostream.h〉? ? ?//定義在頭文件“seqlist.h”中 #include 〈stdlib.h〉 template <class Type〉 class SeqList {? ? ??private: ? Type *data;? ? ?//順序表的存放數(shù)組 ? int M
4、axSize;? ? ?//順序表的最大可容納項(xiàng)數(shù) ? int last;? ????//順序表當(dāng)前已存表項(xiàng)的最后位置 ? int current; ? ?//順序表的當(dāng)前指針(最近處理的表項(xiàng)) public: ?? SeqList ( int MaxSize );? ??//構(gòu)造函數(shù) ? ~SeqList ( ) { delete [ ] data; } ??//析構(gòu)函數(shù) ? int Length ( ) const { return last+1;?。??//計(jì)算表長(zhǎng)度 int Find ( Type& x ) const;
5、??//定位函數(shù): 找x在表中位置,置為當(dāng)前表項(xiàng) ?? ?。閚t IsIn ( Type& x );? ? ?//判斷x是否在表中,不置為當(dāng)前表項(xiàng) ? Type *GetData ( ) { return current == —1?NULL : data[current]; }?//取當(dāng)前表項(xiàng)的值 int Insert ( Type& x?。?; ?? //插入x在表中當(dāng)前表項(xiàng)之后,置為當(dāng)前表項(xiàng) int Append ( Type& x );????//追加x到表尾,置為當(dāng)前表項(xiàng) ? Type * Remove ( Type& x ); ??
6、?//刪除x,置下一表項(xiàng)為當(dāng)前表項(xiàng) ? Type * First?。ā。?; ? ? //取表中第一個(gè)表項(xiàng)的值,置為當(dāng)前表項(xiàng) Type * Next ( ) { return current 〈 last ? &data[++current] : NULL; } ? ? //取當(dāng)前表項(xiàng)的后繼表項(xiàng)的值,置為當(dāng)前表項(xiàng) ? Type?。?Prior ( )?。。騟turn current > 0 ? &data[--current] : NULL; }? ? ?? //取當(dāng)前表項(xiàng)的前驅(qū)表項(xiàng)的值,置為當(dāng)前表項(xiàng) ? int IsEmpty ( ) { re
7、turn last == —1; }? //判斷順序表空否, 空則返回1; 否則返回0 ?? int IsFull ( ) { return last == MaxSize—1; } //判斷順序表滿否, 滿則返回1; 否則返回0 ??} 2-1 設(shè)n個(gè)人圍坐在一個(gè)圓桌周圍,現(xiàn)在從第s個(gè)人開始報(bào)數(shù),數(shù)到第m個(gè)人,讓他出局;然后從出局的下一個(gè)人重新開始報(bào)數(shù),數(shù)到第m個(gè)人,再讓他出局,……,如此反復(fù)直到所有的人全部出局為止。下面要解決的Josephus問題是:對(duì)于任意給定的n, s和m,求出這n個(gè)人的出局序列。請(qǐng)以n?。?9, s = 1, m = 5為例,人工模擬Josephus的求解
8、過程以求得問題的解. 【解答】 出局人的順序?yàn)?, 1, 7, 4, 3, 6, 9, 2,?。?。 2-2 試編寫一個(gè)求解Josephus問題的函數(shù)。用整數(shù)序列1, 2, 3, ……, n表示順序圍坐在圓桌周圍的人,并采用數(shù)組表示作為求解過程中使用的數(shù)據(jù)結(jié)構(gòu).然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作為輸入數(shù)據(jù),檢查你的程序的正確性和健壯性.最后分析所完成算法的時(shí)間復(fù)雜度。 【解答】函數(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;? ? ? /*報(bào)名起始位置*/ ? for (?。搿? n; k 〉 1; i—- ) {??? ?/*逐個(gè)出局,執(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 9 第5人出局, i = 4 k = 8 1 2 ?。? ?。? 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 ?。? 8 9 4 7 1 5 第3人出局, i = 1 k = 4
12、 2 6 8 9 3 4 7 ?。? 5 第6人出局, i =?。? 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 ?報(bào)錯(cuò)信息 m =
13、?。笆菬o效的參數(shù)! 例:n = 9, s = 1,?。?= 10 0 1 2 3 4 5 6 7 8 k = 9 1 2 3 4 5 6 7 8 9 第1人出局, i =?。? k = 8 2 3 4 5 6 7 8 9 1 第3人出局,?。?= 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人出局,?。椤? 1 k = 2 4 8 7 5 9 2 6 3 1 第4人出局, i = 0 8 4 7 5 9 2 ?。? 3 1 第8人出局, i = 0 逆置
15、 ?。? 3 6 2 9 5 7 4 8 最終出局順序 當(dāng)m = 1時(shí),時(shí)間代價(jià)最大。達(dá)到( n—1 ) + ( n-2 )?。?????? + 1 = n(n-1)/2 ? O(n2)。 2—3 設(shè)有一個(gè)線性表?。╡0, e1, …, en-2, en—1) 存放在一個(gè)一維數(shù)組A[arraySize]中的前n個(gè)數(shù)組元素位置。請(qǐng)編寫一個(gè)函數(shù)將這個(gè)線性表原地逆置,即將數(shù)組的前n個(gè)原址內(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]中有多個(gè)零元素, 試寫出一個(gè)函數(shù), 將A 中所有的非零元素依次移到數(shù)組A的前端A[i](0£ i £ arraySize)。 【解答】 因?yàn)閿?shù)組是一種直接存取的數(shù)據(jù)結(jié)構(gòu),在數(shù)組中元素不是像順序表那樣集中存放于表的前端,而是根據(jù)元素下標(biāo)直接存放于數(shù)組某個(gè)位置,所以將非零元素前移時(shí)必須檢測(cè)整個(gè)數(shù)組空間
17、,并將后面變成零元素的空間清零。函數(shù)中設(shè)置一個(gè)輔助指針free,指示當(dāng)前可存放的位置,初值為0。
?template
18、2—5 順序表的插入和刪除要求仍然保持各個(gè)元素原來的次序。設(shè)在等概率情形下, 對(duì)有127個(gè)元素的順序表進(jìn)行插入, 平均需要移動(dòng)多少個(gè)元素? 刪除一個(gè)元素, 又平均需要移動(dòng)多少個(gè)元素? 【解答】 ?若設(shè)順序表中已有n = last+1個(gè)元素,last是順序表的數(shù)據(jù)成員,表明最后表項(xiàng)的位置。又設(shè)插入或刪除表中各個(gè)元素的概率相等,則在插入時(shí)因有n+1個(gè)插入位置(可以在表中最后一個(gè)表項(xiàng)后面追加),每個(gè)元素位置插入的概率為1/(n+1),但在刪除時(shí)只能在已有n個(gè)表項(xiàng)范圍內(nèi)刪除,所以每個(gè)元素位置刪除的概率為1/n。 插入時(shí)平均移動(dòng)元素個(gè)數(shù)AMN(Averagy Moving Number )為
19、刪除時(shí)平均移動(dòng)元素個(gè)數(shù)AMN為 2-6 若矩陣Am′n中的某一元素A[i][j]是第i行中的最小值,同時(shí)又是第j列中的最大值,則稱此元素為該矩陣的一個(gè)鞍點(diǎn).假設(shè)以二維數(shù)組存放矩陣,試編寫一個(gè)函數(shù),確定鞍點(diǎn)在數(shù)組中的位置(若鞍點(diǎn)存在時(shí)),并分析該函數(shù)的時(shí)間復(fù)雜度。 【解答】 ?int minmax ( int?。粒?][ ], const int m, const int n ) { //在二維數(shù)組A[m][n]中求所有鞍點(diǎn), 它們滿足在行中最小同時(shí)在列中最大 int *row = new int[m]; int * col = new int[n]; ? int i
20、, j; ? for ( i = 0; i < 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++?。?{?? ? //檢測(cè)矩陣,尋找鞍點(diǎn)并輸出其位置 ? for ( j = 0; j < n; j++ ) ? if ( row[i] == col[j] ) cout << “The saddle point is?。骸?” <〈 i 〈< “, " 〈<?。?<< “)” 〈〈 endl; ? delete [ ] row; ?。鋏lete?。?] col; } 此算法有3個(gè)并列二重循環(huán),其時(shí)間復(fù)雜度
22、為O(m′n). 2-7 設(shè)有一個(gè)二維數(shù)組A[m][n],假設(shè)A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每個(gè)元素占一個(gè)空間,問A[3][3](10)存放在什么位置?腳注(10)表示用10進(jìn)制表示. 【解答】 設(shè)數(shù)組元素A[i][j]存放在起始地址為L(zhǎng)oc ( i, j ) 的存儲(chǔ)單元中。 ∵ Loc ( 2, 2 ) = Loc ( 0, 0 )?。?2 * n + 2 = 644 + 2 * n + 2 =?。叮罚叮? ∴ n = ( 676 - 2 - 644 ) / 2 = 15 ∴ Loc ( 3, 3 ) = Loc ( 0, 0?。?
23、+ 3 * 15 + 3 = 644 + 45 + 3 = 692. 2-8 利用順序表的操作,實(shí)現(xiàn)以下的函數(shù)。 ?(1) 從順序表中刪除具有最小值的元素并由函數(shù)返回被刪元素的值??粘龅奈恢糜勺詈笠粋€(gè)元素填補(bǔ),若順序表為空則顯示出錯(cuò)信息并退出運(yùn)行?!? (2) 從順序表中刪除第i個(gè)元素并由函數(shù)返回被刪元素的值。如果i不合理或順序表為空則顯示出錯(cuò)信息并退出運(yùn)行。 ?(3) 向順序表中第i個(gè)位置插入一個(gè)新的元素x。如果i不合理則顯示出錯(cuò)信息并退出運(yùn)行。 ?(4) 從順序表中刪除具有給定值x的所有元素。 ?(5) 從順序表中刪除其值在給定值s與t之間(要求s小于t)的所有元素,如果s或t
24、不合理或順序表為空則顯示出錯(cuò)信息并退出運(yùn)行。
(6) 從有序順序表中刪除其值在給定值s與t之間(要求s小于t)的所有元素,如果s或t不合理或順序表為空則顯示出錯(cuò)信息并退出運(yùn)行。
?(7) 將兩個(gè)有序順序表合并成一個(gè)新的有序順序表并由函數(shù)返回結(jié)果順序表。
(8) 從順序表中刪除所有其值重復(fù)的元素,使表中所有元素的值均不相同。
【解答】
(1) 實(shí)現(xiàn)刪除具有最小值元素的函數(shù)如下:
templat(yī)e
25、r << “ List is Empty! ” 〈< endl; exit(1); } int m = 0; ? ? ??//假定0號(hào)元素的值最小 for ( int?。?= 1; i <= last; i++ ) {????//循環(huán), 尋找具有最小值的元素 ? if?。?data[i] 〈 data[m] ) m = i; ? ?//讓m指向當(dāng)前具最小值的元素 Type?。鬳mp = dat(yī)a[m]; data[m] = data[last]; last——; ? ?//空出位置由最后元素填補(bǔ), 表最后元素位置減1 ? retur
26、n temp; ?} (2) 實(shí)現(xiàn)刪除第i個(gè)元素的函數(shù)如下(設(shè)第i個(gè)元素在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個(gè)元素的值
for ( int j = i; j 〈 last; j++ ) ? ??//空出位置由后續(xù)元素順次填補(bǔ)
data[j] =?。洌醫(yī)a[j+1];
last--; ? ???//表最后元素位置減1
return temp;
}
(3) 實(shí)現(xiàn)向第i個(gè)位置插入一個(gè)新的元素x的函數(shù)如下(設(shè)第i個(gè)元素在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;?。辏? ) ? //空出位置以便插入, 若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) 實(shí)現(xiàn)刪除其值在給定值s與t之間(要求s小于t)的所有元素的函數(shù)如下:
template<Type> void SeqList〈Type> ::?。膃lNo#sto#t (?。詙pe&?。?, 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) 實(shí)現(xiàn)從有序順序表中刪除其值在給定值s與t之間的所有元素的函數(shù)如下:
template〈Type> void?。觘qList<Type> :: DelNo#sto#t1 ( Type& s, Type& t?。
?。閒 ( 32、 last ==?。?|| s >= t )
{ cerr <〈 “List is empty or parameters are illegal!” <〈 endl; exit(1); }
?。鎜r ( int i = 0; i <= last; i++ ) ??? //循環(huán), 尋找值 ≥s 的第一個(gè)元素
? if ( data[i] 〉= s ) break; ? ?? //退出循環(huán)時(shí), i指向該元素
if ( i <= last ) {
for ( int j = 1; i + j 〈= last; j++ )? ?//循環(huán), 尋找值?。?t 的第一 33、個(gè)元素
if ( data[i+j]?。?t?。?break; ? //退出循環(huán)時(shí), i+j指向該元素
for ( int k = i+j; k 〈= last; k++ ) ?//刪除滿足條件的元素, 后續(xù)元素前移
data[k-j]?。?data[k];
last-= j; ??? ? //表最后元素位置減j
? }
}
(7) 實(shí)現(xiàn)將兩個(gè)有序順序表合并成一個(gè)新的有序順序表的函數(shù)如下:
templat(yī)e〈Type〉 SeqList 34、〈Type>& B ) {
//合并有序順序表A與B成為一個(gè)新的有序順序表并由函數(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 ( ) ) ? ?//當(dāng)A表未檢測(cè)完, 繼續(xù)向結(jié)果表傳送
{ data[k] = value1; value1 = A.Next ( ); i++; k+ 36、+; } ??
while ( j 〈 B.Length ( ) ) ? ??//當(dāng)B表未檢測(cè)完, 繼續(xù)向結(jié)果表傳送
{ data[k] = value2; value2 = B。Next ( ); j++; k++; }
? last = k – 1;
? return *this;
}
(8) 實(shí)現(xiàn)從表中刪除所有其值重復(fù)的元素的函數(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)檢測(cè)
j = i + 1; temp = data[i];
while ( j <= last ) {??? //對(duì)于每一個(gè)i, 重復(fù)檢測(cè)一遍后續(xù)元素
if ( temp == data[j]?。?{?? ? //如果相等, 后續(xù)元素前移
for ( k = j+1; k <= last; k++ ) data[k-1] = data[k];
? last--; ? 38、? //表最后元素位置減1
}
else j++;
}
i++; ???//檢測(cè)完dat(yī)a[i], 檢測(cè)下一個(gè)
? }
}
2—9 設(shè)有一個(gè)n′n的對(duì)稱矩陣A,如圖(a)所示。為了節(jié)約存儲(chǔ),可以只存對(duì)角線及對(duì)角線以上的元素,或者只存對(duì)角線或?qū)蔷€以下的元素。前者稱為上三角矩陣,后者稱為下三角矩陣。我們把它們按行存放于一個(gè)一維數(shù)組B中,如圖(b)和圖(c)所示。并稱之為對(duì)稱矩陣A的壓縮存儲(chǔ)方式.試問:
?(1) 存放對(duì)稱矩陣A上三角部分或下三角部分的一維數(shù)組B有多少元素?
(2) 若在一維數(shù)組B中從0號(hào)位置開始存放,則如圖(a)所示的對(duì)稱矩陣 39、中的任一元素aij在只存上三角部分的情形下(圖(b))應(yīng)存于一維數(shù)組的什么下標(biāo)位置?給出計(jì)算公式。
(3) 若在一維數(shù)組B中從0號(hào)位置開始存放,則如圖(a)所示的對(duì)稱矩陣中的任一元素aij在只存下三角部分的情形下(圖(c))應(yīng)存于一維數(shù)組的什么下標(biāo)位置?給出計(jì)算公式.
【解答】
?(1) 數(shù)組B共有n + ( n-1 ) +?????? + 1= n * ( n+1 ) / 2個(gè)元素。
(2) 只存上三角部分時(shí),若i £ j,則數(shù)組元素A[i][j]前面有i—1行(1~i—1,第0行第0列不算),第1行有n個(gè)元素,第2行有n—1個(gè)元素,??????,第i—1行有n—i+2個(gè)元素。 40、在第i行中,從對(duì)角線算起,第j號(hào)元素排在第j-i+1個(gè)元素位置(從1開始),因此,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為
??n + (n—1) + (n-2) + ?????? + (n-i+2) + j-i+1
=?。?n-i+2) *?。ǎ椋?) / 2 + j-i+1
= (2n-i) * (i—1) / 2 + j
若i 〉 j,數(shù)組元素A[i][j]在數(shù)組B中沒有存放,可以找它的對(duì)稱元素A[j][i]。在
數(shù)組B的第?。?n—j)?。。╦—1) / 2 + i位置中找到。
?如果第0行第0列也計(jì)入,數(shù)組B從0號(hào)位置開始存放,則數(shù)組元素A[i][j]在數(shù)組B 41、中的存放位置可以改為
??當(dāng)i £ j時(shí),= (2n—i+1) * i / 2 + j - i?。健。?2n — i - 1 ) * i / 2 + j
?當(dāng)i > j時(shí),= (2n - j?。?1) * j / 2 + i
?(3) 只存下三角部分時(shí),若i 3 j,則數(shù)組元素A[i][j]前面有i-1行(1~i-1,第0行第0列不算),第1行有1個(gè)元素,第2行有2個(gè)元素,??????,第i-1行有i-1個(gè)元素。在第i行中,第j號(hào)元素排在第j個(gè)元素位置,因此,數(shù)組元素A[i][j]在數(shù)組B中的存放位置為
??1 + 2 + ?????? +?。╥—1) + j = ( i—1) 42、*i / 2 + j
若i 〈 j,數(shù)組元素A[i][j]在數(shù)組B中沒有存放,可以找它的對(duì)稱元素A[j][i]。在
數(shù)組B的第 (j-1)*j?。?2 + i位置中找到。
?如果第0行第0列也計(jì)入,數(shù)組B從0號(hào)位置開始存放,則數(shù)組元素A[i][j]在數(shù)組B中的存放位置可以改為
? 當(dāng)i 3 j時(shí),= i*(i+1) / 2 + j
當(dāng)i 〈 j時(shí),= j*(j+1) / 2?。?i
2—10 設(shè)A和B均為下三角矩陣,每一個(gè)都有n行。因此在下三角區(qū)域中各有n(n+1)/2個(gè)元素。另設(shè)有一個(gè)二維數(shù)組C,它有n行n+1列。試設(shè)計(jì)一個(gè)方案,將兩個(gè)矩陣A和B中的下三角區(qū)域元素存放于 43、同一個(gè)C中.要求將A的下三角區(qū)域中的元素存放于C的下三角區(qū)域中,B的下三角區(qū)域中的元素轉(zhuǎn)置后存放于C的上三角區(qū)域中。并給出計(jì)算A的矩陣元素aij和B的矩陣元素bij在C中的存放位置下標(biāo)的公式。
【解答】
計(jì)算公式
2—11 在實(shí)際應(yīng)用中經(jīng)常遇到的稀疏矩陣是三對(duì)角矩陣,如右圖所示。在該矩陣中除主對(duì)角線及在主對(duì)角線上下最臨近的兩條對(duì)角線上的元素外,所有其它元素均為0?,F(xiàn)在要將三對(duì)角矩陣A中三條對(duì)角線上的元素按行存放在一維數(shù)組B中,且a11存放于B[0].試給出計(jì)算A在三條對(duì)角線上的元素aij?。?£ i £ n, i—1 £ j £ i+1)在一維數(shù)組B中的存放位置的計(jì)算公式.
44、
【解答】
在B中的存放順序?yàn)椤?。?1, a12, a21, a22, a23, a32, a33, a34, …, an n-1, ann ],總共有3n—2個(gè)非零元素。元素aij在第i行,它前面有3(i-1)-1個(gè)非零元素,而在本行中第j列前面有j—i+1個(gè),所以元素aij在B中位置為2*i+j-3.
2-12 設(shè)帶狀矩陣是n′n階的方陣,其中所有的非零元素都在由主對(duì)角線及主對(duì)角線上下各b條對(duì)角線構(gòu)成的帶狀區(qū)域內(nèi),其它都為零元素。試問:
?(1) 該帶狀矩陣中有多少個(gè)非零元素?
(2) 若用一個(gè)一維數(shù)組B按行順序存放各行的非零元素,且設(shè)a11存放在B[0]中,請(qǐng)給出 45、一個(gè)公式,計(jì)算任一非零元素aij在一維數(shù)組B中的存放位置。
【解答】
(1) 主對(duì)角線包含n個(gè)非零元素,其上下各有一條包含n-1個(gè)非零元素的次對(duì)角線,再向外,由各有一條包含n—2個(gè)非零元素的次對(duì)角線,……,最外層上下各有一條包含n-b個(gè)非零元素的次對(duì)角線。則總共的非零元素個(gè)數(shù)有
n +?。玻ǎ?1) + 2(n—2) + … + 2(n-b) = n + 2( (n-1) + (n-2 ) + … + (n-b) )
(2) 在用一個(gè)一維數(shù)組B按行順序存放各行的非零元素時(shí),若設(shè)b≤n/2,則可按各行非零元素個(gè)數(shù)變化情況,分3種情況討論。
① 當(dāng)1≤i≤b+1時(shí),矩陣第1行有b+1個(gè) 46、元素,第2行有b+2個(gè)元素,第3行有b+3個(gè)元素,……,第i行存有b+i個(gè)元素,因此,數(shù)組元素A[i][j]在B[ ]中位置分析如下:
?第i行(i≥1)前面有i—1行,元素個(gè)數(shù)為 (b+1)+(b+2)+…+(b+i—1) = (i—1)*b+i*(i—1)/2,在第i行第j列(j≥1)前面有j—1個(gè)元素,則數(shù)組元素A[i][j]在B[ ]中位置為
② 當(dāng)b+1
47、步減少。當(dāng)i=n—b+1時(shí)有2b個(gè)非零元素,當(dāng)i=n—b+2時(shí)有2b-1個(gè)非零元素,當(dāng)i=n—b+3時(shí)有2b-2個(gè)非零元素,…,當(dāng)i=n時(shí)有b+1個(gè)非零元素。因?yàn)榍懊鎛—b行總共有b*(3*b+1)/2+(n—2*b)*(2*b+1)個(gè)非零元素,所以在最后各行數(shù)組元素A[i][j]在B[ ]中位置為
2-13 稀疏矩陣的三元組表可以用帶行指針數(shù)組的二元組表代替。稀疏矩陣有多少行,在行指針數(shù)組中就有多少個(gè)元素:第i個(gè)元素的數(shù)組下標(biāo)i代表矩陣的第i行,元素的內(nèi)容即為稀疏矩陣第i行的第一個(gè)非零元素在二元組表中的存放位置。二元組表中每個(gè)二元組只記錄非零元素的列號(hào)和元素值,且各二元組按行號(hào)遞 48、增的順序排列。試對(duì)右圖所示的稀疏矩陣,分別建立它的三元組表和帶行指針數(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”。試?yán)米址幕具\(yùn)算實(shí)現(xiàn)這個(gè)替換操作。
【解答】
String &?。觮ring :: Replace ( String & t, String &v) {
if ( ( int id = Find ( t ) ) == -1 ) ? //沒有找到,當(dāng)前字符串不改,返回
{ cout 〈〈 "The (replace)?。铮餰ration fai 50、led." << endl; return *this; }
String temp( ch ); ? ?//用當(dāng)前串建立一個(gè)空的臨時(shí)字符串
ch[0] = ’\0’; curLen = 0;? ???//當(dāng)前串作為結(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 ) 51、
l =?。觯甤urLen; ?? ?//確定替換串v傳送字符數(shù)l
?? else l = maxLen- curLen- id;
? for ( j = 0; j 〈 l; j++ ) ch[k++] = v。ch[j];? //連接替換串v到結(jié)果串ch后面
?? curLen += id + l;?? ? //修改結(jié)果串連接后的長(zhǎng)度
if ( curLen == maxLen ) break;????//字符串超出范圍
?? for ( j = id + t.curLen; j 〈 temp.curLen; j++?。?
temp.ch[j- id - 52、t。curLen] = temp.ch[j]; //刪改原來的字符串? temp。curLen?。?id + t.curLen;
id = temp.Find ( t );? }
return *this;
}
2—15 編寫一個(gè)算法frequency,統(tǒng)計(jì)在一個(gè)輸入字符串中各個(gè)不同字符出現(xiàn)的頻度。用適當(dāng)?shù)臏y(cè)試數(shù)據(jù)來驗(yàn)證這個(gè)算法。
【解答】
?include 53、符串,數(shù)組A[ ]中記錄字符串中有多少種不同的字符,C[ ]中記錄每
//一種字符的出現(xiàn)次數(shù)。這兩個(gè)數(shù)組都應(yīng)在調(diào)用程序中定義。k返回不同字符數(shù).
??int i, j, len = s.length( );
if ( !len ) { cout 〈〈 "The string is empty. " 〈< endl; ?。搿? 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++ )?。?? ?? /*檢測(cè)串中所有字符*/
??? j = 0;? while ( j?。?k && A[j] != s[i] ) j++;?/*檢查s[i]是否已在A[ ]中*/
?? if ( j == k )?。?A[k] = s[i]; C[k]++; k++ } ?/*s[i]從未檢測(cè)過*/
?? else C[j]++;? ? ?/*s[i]已經(jīng)檢測(cè)過*/
? ? }
???}
?}
測(cè)試數(shù)據(jù) s = "cast cast sat at a tasa\ 55、0”測(cè)試結(jié)果
A
c
a
s
?。?
b
C
2
?。?
4
5
?。?
【另一解答】
include 〈iostream。h〉
include "string。h”
const?。閚t?。鉮arnumber = 128; ? ? /*ASCII碼字符集的大?。?
void frequency( String&?。?, 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è)串中所有字符*/
C[ atoi?。ǎ螅郏椋荩。?+;?? ???/*出現(xiàn)次數(shù)累加*/
for?。ā。?= 0; i < charnumber; i++ ) ?/*輸出出現(xiàn)字符的出現(xiàn)次數(shù)*/
if ( C[i] > 0 ) cout 〈< ”( " << i << " ) : \t" << C[i] 〈〈 "\t”;
}
2—16 設(shè)串s為“aaab",串t為“abcabaa”,串r為“abcaabbabcabaacbacba",試分別計(jì)算它們的失效函數(shù)f (j)的值。
57、
【解答】
j
0
1
2
3
j
0
1
2
3
4
5
6
s
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ù)數(shù)組B[m+1][n+1]的數(shù)據(jù)在行、列方向上都按從小到大的順序排序,且整型變量x中的數(shù)據(jù)在B中存在.試設(shè)計(jì)一個(gè)算法,找出一對(duì)滿足B[i][j] == x的i, j值。要求比較次數(shù)不超過m+n.
【解答】
?算法的思想是逐次二維數(shù)組右上角的元素進(jìn)行比較。每次比較有三種可能的結(jié)果:若相 58、等,則比較結(jié)束;若右上角的元素小于x,則可斷定二維數(shù)組的最上面一行肯定沒有與x相等的數(shù)據(jù),下次比較時(shí)搜索范圍可減少一行;若右上角的元素大于x,則可斷定二維數(shù)組的最右面一列肯定不包含與x相等的數(shù)據(jù),下次比較時(shí)可把最右一列剔除出搜索范圍。這樣,每次比較可使搜索范圍減少一行或一列,最多經(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 = n;
while ( B[i][j] != x )
if ( B[i][j] < x?。?i++;
?? else j--;
?}
不足之處,敬請(qǐng)諒解
21 / 13
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國(guó)有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場(chǎng)心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會(huì)應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案