第五章1 数组

上传人:hy****d 文档编号:141614868 上传时间:2022-08-24 格式:DOC 页数:13 大小:192KB
返回 下载 相关 举报
第五章1 数组_第1页
第1页 / 共13页
第五章1 数组_第2页
第2页 / 共13页
第五章1 数组_第3页
第3页 / 共13页
点击查看更多>>
资源描述
第5章 数组作为抽象数据类型数组的类声明。#nud ioreah/在头文件“arrayh”中incudestdbhcost it DeaultSize = 30;template clas pe cassArray /数组是数据类型相同的n(size)个元素的一个集合,下标范围从0到1.对数组中元素/可按下标所指示位置直接访问。private: T *lens;/数组 in AaySiz;/元素个数ublc: Array( itSze = DefultSze );/构造函数 Aray(con rrayTy x );/复制构造函数 Array( ) dete elemts; /析构函数 rayTyp & prator=( cot ArrayType A);/数组整体赋值 (复制) Typ oeraor ( int i );/按下标访问数组元素 inLenth ( ) const returnrraySiz; /取数组长度vdReSiz(in sz );/修改数组长度顺序表的类定义includ trem.h/定义在头文件“seqist.h”中#iclude sdlb.hemplate 0 ? &ata-uent : NLL; /取当前表项的前驱表项的值,置为当前表项 it IsEmp ( ) rtu as 1; /判断顺序表空否,空则返回;否则返回0 int sFull ( ) returnlast= MxSze;/判断顺序表满否,满则返回1; 否则返回02-1 设个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,如此反复直到所有的人全部出局为止。下面要解决的Josphus问题是:对于任意给定的n, s和m,求出这个人的出局序列。请以n 9, s =1, = 5为例,人工模拟Jephu的求解过程以求得问题的解.【解答】出局人的顺序为5, 1, 7, 4, 3, , 9, 2,。22试编写一个求解Joshs问题的函数。用整数序列1, 2, 3, ,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构.然后使用n 9, s 1, m = 5,以及 = 9, s=, m 0,或者n =9, 1, m = 0作为输入数据,检查你的程序的正确性和健壮性.最后分析所完成算法的时间复杂度。【解答】函数源程序清单如下:void Joseus( int A, n n, s, m ) int , j, k, tm;if ( m = 0 ) cout 0是无效的参数!” enl; retrn;or ( = 0; i ; i+) Ai = + 1;/初始化,执行n次*/i = s - 1;报名起始位置/for(= n; 1; i-) *逐个出局,执行n-1次*/if( i =k) i= 0; = (i + m 1 ) k;/*寻找出局位置/i ( ! k1) tmp =A;/*出局者交换到第-1位置/ for ( j = ; k-;j+ ) Aj = j+; k1 =tmp;fr (k= ; k /2;+ ) *全部逆置, 得到出局序列/tmp k; k k+1; n-+1 tmp;例:n = , s= 1,m =5 0 12 3 4 56 7 8k = 9 1 2 3 5 67 8第5人出局, i = 4k = 7 8 9 5第1人出局, =0k = 72 3 4 6 7 15第7人出局, i = 4k = 62 3 4 6 897 15第4人出局, = 2k = 2 3 8 9 471 5第3人出局, i = k = 4 8 9 3 4 第6人出局, i = = 2 86 3 4 7 5第9人出局,i 2 = 22 8 9 6 3 71 5第2人出局, i = 8 2 9 6 3 47 1 5第人出局, i = 0逆置5 17 4 3 69 8最终出局顺序例:n =9, s , m 报错信息 m =是无效的参数!例:n=9, = 1, 10 0 3 4 5 7 8k= 9 1 2 3 4 56 8 9第1人出局, i=k =82 4 5 6 7 89 1第3人出局, = 1k =72 4 6 8 93第6人出局, i= k =6 2 4 57 8 1第2人出局, i= k =5 5 7 6 3 第9人出局, 4k 4 5 2 6 1第5人出局, i = 1 = 3 78 5 9 2 3 1第7人出局,= 1k=2 8 7 5 9 6 1第4人出局, i= 08 7 5 9 231第8人出局, i = 0逆置 3 2 9 7 48最终出局顺序当m = 1时,时间代价最大。达到( n ) + ( n- ) + = n(-1)/2 O(2)。设有一个线性表(e0, e1, n, e1) 存放在一个一维数组Arraize中的前n个数组元素位置。请编写一个函数将这个线性表原地逆置,即将数组的前个原址内容置换为(n,e2, , 1,e)。【解答】mltelassTypod invere( Typ A ,i n) ype t;fo (int i = 0; i= ( n1 ) ; i+) mp Ai; Ai = A-1; An1 t;2-4 假定数组AaraySiz中有多个零元素, 试写出一个函数, 将中所有的非零元素依次移到数组A的前端A(0 i rySize)。【解答】因为数组是一种直接存取的数据结构,在数组中元素不是像顺序表那样集中存放于表的前端,而是根据元素下标直接存放于数组某个位置,所以将非零元素前移时必须检测整个数组空间,并将后面变成零元素的空间清零。函数中设置一个辅助指针free,指示当前可存放的位置,初值为0。tempate :copact( ) intree = 0; fr ( int i= 0; i ArraySize; i+ )/检测整个数组f (elementI != )/发现非零元素 elemtfr=elmentsi; fre+; elemns= 0; /前移 25 顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下, 对有27个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素, 又平均需要移动多少个元素?【解答】若设顺序表中已有n las+1个元素,las是顺序表的数据成员,表明最后表项的位置。又设插入或删除表中各个元素的概率相等,则在插入时因有n+1个插入位置(可以在表中最后一个表项后面追加),每个元素位置插入的概率为1/(n+1),但在删除时只能在已有n个表项范围内删除,所以每个元素位置删除的概率为n。插入时平均移动元素个数AN(verag Mov umer )为删除时平均移动元素个数AM为26 若矩阵Amn中的某一元素Aij是第行中的最小值,同时又是第列中的最大值,则称此元素为该矩阵的一个鞍点.假设以二维数组存放矩阵,试编写一个函数,确定鞍点在数组中的位置(若鞍点存在时),并分析该函数的时间复杂度。【解答】it inmx ( int , cost it , const in ) /在二维数组Amn中求所有鞍点, 它们满足在行中最小同时在列中最大 int *row =new nm; in clnei; int i,j; fr ( i = 0; ; i+ )/在各行中选最小数组元素, 存于ro o = Ai0; for(j = 1;j n; + ) f ( Ai rw ) rwi= Aj; for ( = 0; ; j+ )/在各列中选最大数组元素,存于coljli = A0j; fo (i = 1;i m; i+ ) f( A olj ) colj =Aj; for (i 0; i m; +) /检测矩阵,寻找鞍点并输出其位置for( j =0; j n;j+) ( owi colj ) cou “The a oint is:(” “, “)” endl; det row;eete cl; 此算法有3个并列二重循环,其时间复杂度为O(mn).7 设有一个二维数组Am,假设0存放位置在644(10),A2存放位置在76(0),每个元素占一个空间,问3(10)存放在什么位置?脚注(10)表示用10进制表示.【解答】设数组元素Aij存放在起始地址为Loc ( i, ) 的存储单元中。 Loc ( ,2 ) = Loc ( , 0 ) 2 * n+ = 644 +2 n2 n =( 676 - 2 644 )/= 15 o (3, 3 )= Loc ( 0, 0) + 3* 1+3 =644 +45+ 3 692-8 利用顺序表的操作,实现以下的函数。(1)从顺序表中删除具有最小值的元素并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。(2) 从顺序表中删除第i个元素并由函数返回被删元素的值。如果i不合理或顺序表为空则显示出错信息并退出运行。(3) 向顺序表中第个位置插入一个新的元素x。如果i不合理则显示出错信息并退出运行。(4)从顺序表中删除具有给定值的所有元素。(5) 从顺序表中删除其值在给定值s与t之间(要求s小于t)的所有元素,如果s或t不合理或顺序表为空则显示出错信息并退出运行。() 从有序顺序表中删除其值在给定值s与t之间(要求小于)的所有元素,如果s或t不合理或顺序表为空则显示出错信息并退出运行。(7)将两个有序顺序表合并成一个新的有序顺序表并由函数返回结果顺序表。(8) 从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。【解答】() 实现删除具有最小值元素的函数如下:templte :: DlMin ( ) if( last -1 ) /表空, 中止操作返回 crr “ Lt i Et! ” ndl; i(); int m = 0;/假定号元素的值最小 fr ( int 1; i :: DelNoi(it ) i( as = -1 | 0 | last )/表空,或i不合理,中止操作返回 cer “ Lit Empty aameris out rne! ” endl; eit(1); Type temp = datai;/暂存第个元素的值 or ( int ji;j last;+ )/空出位置由后续元素顺次填补 dat =ta+1; st-; /表最后元素位置减1 retn tmp;() 实现向第i个位置插入一个新的元素x的函数如下(设第i个元素在dti, i0,1,last):elateTyp i SeqLisType :: Noi(ini, ype ) f( last =Maxize-1 i las+ ) /表满或参数i不合理,中止操作返回 crr “ List is Ful or Parmeter iout range!” i;- ) /空出位置以便插入, 若=last, 此循环不做ataj1 = dataj; atai = x;/插入 las+; /表最后元素位置加1(4) 从顺序表中删除具有给定值x的所有元素。tmpatTpe void qistTy : DelValue ( Tp x ) int i = 0, j; while( i = ast ) /循环, 寻找具有值x的元素并删除它 if ( aai = x ) /删除具有值x的元素, 后续元素前移for ( j = i;j ::elNoo# (ye&, Tye& t ) if (lst= -1| = t ) rr “Lis empy or paraetr areillega! n; eit(1); nt i = 0, j; ile( i st) /循环,寻找具有值x的元素并删除它 i( da = s& dat ) /删除满足条件的元素, 后续元素前移for(j = i; = ) cerr “Lit s empty or parameters ar lega!” e; exit(1); or ( it i =0; i lat; + ) /循环,寻找值 s 的第一个元素 if ( dat s ) bre; /退出循环时, i指向该元素 if ( i =last ) for ( intj =1; i+ = last; j+ )循环, 寻找值 t 的第一个元素if ( atai+ t) brea;/退出循环时, +j指向该元素 fo (it k = +j; k = last; k+ ) /删除满足条件的元素, 后续元素前移datak datk; lst- j; /表最后元素位置减j (7) 实现将两个有序顺序表合并成一个新的有序顺序表的函数如下:tmpltye SqListTye& eqList:erge (eLitTp,qListTye& B) /合并有序顺序表A与成为一个新的有序顺序表并由函数返回 f( ALength() + B.Lengt()MaSie ) crr “The mmarof he nt fiss s out MaxSize!” end; e(); Typ vlu = A.Fist (), va B.Frt ( ); n i , j= , k=; hile ( i Angth ()&j B.length ( ) ) /循环,两两比较, 小者存入结果表 ( value = lue2 )datak = vale1; vu1 = A。Next( ); i+; els dtak = vale2; value = BNxt (); j+; +; wil ( i A.Lngth( ) /当A表未检测完,继续向结果表传送 datak = value1; value1 = Nt ( ); i+; +; we ( j B.Legt ( ) ) /当B表未检测完, 继续向结果表传送 atk vlue2; vu = B。Next (); j+; k+; last = ; reurn his;() 实现从表中删除所有其值重复的元素的函数如下:temple vd SqLitype:: DlDle( ) ( ls = -1 ) cr “Lit pty!” el; xit(1); t = , j, k; e temp; wile ( i las ) /循环检测 j = i + 1; temp daa; while(j = lat ) /对于每一个, 重复检测一遍后续元素i( emp = atj) 如果相等,后续元素前移 for ( k = ; k j时,= (2n- 1) * j / 2+ (3)只存下三角部分时,若i j,则数组元素Ai前面有i行(1-1,第0行第0列不算),第1行有1个元素,第2行有2个元素,,第i1行有i1个元素。在第i行中,第j号元素排在第个元素位置,因此,数组元素Aij在数组B中的存放位置为1 + +(i1) + j ( i1)*i/ 2+j若i j,数组元素i在数组B中没有存放,可以找它的对称元素ji。在数组B的第 (j-1)j i位置中找到。如果第0行第列也计入,数组B从号位置开始存放,则数组元素ij在数组B中的存放位置可以改为当i j时,= i*(i1)/ 2 + j当i j时,= j(1) / 2 i 210 设A和B均为下三角矩阵,每一个都有n行。因此在下三角区域中各有n(n+)2个元素。另设有一个二维数组,它有n行n1列。试设计一个方案,将两个矩阵A和B中的下三角区域元素存放于同一个C中.要求将的下三角区域中的元素存放于C的下三角区域中,B的下三角区域中的元素转置后存放于的上三角区域中。并给出计算A的矩阵元素ai和B的矩阵元素b在中的存放位置下标的公式。【解答】计算公式21 在实际应用中经常遇到的稀疏矩阵是三对角矩阵,如右图所示。在该矩阵中除主对角线及在主对角线上下最临近的两条对角线上的元素外,所有其它元素均为。现在要将三对角矩阵A中三条对角线上的元素按行存放在一维数组B中,且a1存放于B0.试给出计算A在三条对角线上的元素i(1i n,i1 i1)在一维数组B中的存放位置的计算公式.【解答】在B中的存放顺序为11,a12, ,a22,a3, a32, , a4, , an n-, ann ,总共有3n2个非零元素。元素a在第行,它前面有3(i-1)1个非零元素,而在本行中第j列前面有ji个,所以元素ij在B中位置为2*ij-.2-12设带状矩阵是n阶的方阵,其中所有的非零元素都在由主对角线及主对角线上下各b条对角线构成的带状区域内,其它都为零元素。试问:(1) 该带状矩阵中有多少个非零元素?(2)若用一个一维数组按行顺序存放各行的非零元素,且设1存放在B0中,请给出一个公式,计算任一非零元素aij在一维数组B中的存放位置。【解答】() 主对角线包含个非零元素,其上下各有一条包含n-1个非零元素的次对角线,再向外,由各有一条包含n2个非零元素的次对角线,最外层上下各有一条包含-个非零元素的次对角线。则总共的非零元素个数有 +(-1)+2(n2) + + 2(n-b) = n+ 2( (n-1)+ (n2 ) + () )()在用一个一维数组B按行顺序存放各行的非零元素时,若设bn/,则可按各行非零元素个数变化情况,分3种情况讨论。当1b+1时,矩阵第1行有+个元素,第2行有b+2个元素,第3行有b3个元素,第i行存有b+i个元素,因此,数组元素Aij在B 中位置分析如下:第行(1)前面有i1行,元素个数为 (b+1)+(b+2)+(+1)= (i1)b+i(i)/,在第i行第j列()前面有j1个元素,则数组元素Aij在B中位置为 当b+1in-+时,各行都有b1个元素.因为数组 前b行共有*b+(b+1)b/2= (b+1)/2个元素,所以数组元素A在B 中位置为 当nb1in时,各行元素个数逐步减少。当i=nb+1时有2b个非零元素,当i=b+2时有2b-1个非零元素,当i=nb+3时有2-个非零元素,,当=n时有b个非零元素。因为前面n行总共有(3b+1)/2+(n2*b)(2b+)个非零元素,所以在最后各行数组元素Aij在B 中位置为 1 稀疏矩阵的三元组表可以用带行指针数组的二元组表代替。稀疏矩阵有多少行,在行指针数组中就有多少个元素:第i个元素的数组下标i代表矩阵的第i行,元素的内容即为稀疏矩阵第i行的第一个非零元素在二元组表中的存放位置。二元组表中每个二元组只记录非零元素的列号和元素值,且各二元组按行号递增的顺序排列。试对右图所示的稀疏矩阵,分别建立它的三元组表和带行指针数组的二元组表。 二元组表 tacvaue00212112513361441455363879842行指针数组row00134364757【解答】14 字符串的替换操作rpla (ring &, Strngt,Stri v)是指:若是s的子串,则用串v替换串t在串中的所有出现;若t不是s的子串,则串s不变.例如,若串s为“abbabcbaabaaacba”,串t为“bab,串v为“abdc,则执行rpa操作后,串s中的结果为“ababdcabaaab”。试利用字符串的基本运算实现这个替换操作。【解答】Sting trin ::Replace ( trin , String v) if( ( nt i Find( t ) ) = 1 ) /没有找到,当前字符串不改,返回 cout he (replace)eratin filed end; retur *ths; Strngtemp( ch );/用当前串建立一个空的临时字符串 ch =0; curLen ;/当前串作为结果串,初始为空 int j, k= 0, l;/存放结果串的指针 while (id != 1) r ( j = 0; j i; j+) chk = temp.chj;摘取temp.ch中匹配位置i(crLen+ id 。curLen = maxLen) =curLen;/确定替换串v传送字符数lels = aLen cLen- i; for ( j =0; j ; j+ ) chk+ =。cj;/连接替换串到结果串ch后面curLen id l;/修改结果串连接后的长度 f (curLen = axLen )bek;/字符串超出范围 for ( j= id t.cren;j tmp.curen; j+)em.cj- i t。crLen =tem.hj;/删改原来的字符串emp。cuLn i .curLen; = teFind (t); rturn this;215 编写一个算法requecy,统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法。【解答】clde iosrinclud trnhvod fquenc( Srng s, char& A,int , & ) /s是输入字符串,数组 中记录字符串中有多少种不同的字符,C中记录每/一种字符的出现次数。这两个数组都应在调用程序中定义。k返回不同字符数.i i,j, len = sength( );if ( !le ) out e ting s empt. e; = 0; reun; else A0 = ; 0 = ; k = ; /语句si是串的重载操作* fr ( i = 1;i len;i+ ) i =0; *初始化 fr(i 1; i e; i+ ) /检测串中所有字符*/ ; hle( k & Aj ! s ) +;/检查si是否已在A 中/ if ( j = k ) Ak = si;Ck+; + /si从未检测过*/ eCj+; /si已经检测过*/ 测试数据 s cat castsat a aa0”测试结果 Ac s b C 2 4 5【另一解答】nude ioram。hincue str。h”constntharnumber = 18;/ASI码字符集的大小/voi freqecy( tin,intC) / s是输入字符串,数组C 中记录每一种字符的出现次数。o( it i = 0; i cnmbe;i+ )Ci 0; /*初始化/o ( i =0; s.legt(); i+)/检测串中所有字符/ atoi()+;/出现次数累加/fr( = 0;i canbr; +)*输出出现字符的出现次数*/ i ( ) cout ”( i ) : t i t”;6设串s为“aab,串t为“ca”,串r为“cababaacacba,试分别计算它们的失效函数f (j)的值。【解答】 j123j0123456aa tcabaaf(j)-10f (j)1-101002-17 设定整数数组Bm+11的数据在行、列方向上都按从小到大的顺序排序,且整型变量中的数据在中存在.试设计一个算法,找出一对满足Bj = 的, j值。要求比较次数不超过m+n.【解答】算法的思想是逐次二维数组右上角的元素进行比较。每次比较有三种可能的结果:若相等,则比较结束;若右上角的元素小于x,则可断定二维数组的最上面一行肯定没有与相等的数据,下次比较时搜索范围可减少一行;若右上角的元素大于x,则可断定二维数组的最右面一列肯定不包含与x相等的数据,下次比较时可把最右一列剔除出搜索范围。这样,每次比较可使搜索范围减少一行或一列,最多经过m+n次比较就可找到要求的与x相等的数据。oi fnd ( in B , in m, itn, int x, int& i, int ) /在二维数组Bn中寻找与x相等的元素, 找到后, 由i与j返回该数组元素的位置 = ; j =; whie( Bj != ) if ( j x) i+; ele j-;不足之处,敬请谅解21 / 13
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!