数据结构习题与解析C语言篇) 5.指出下列各算法的时间复杂度 (1) prime (int n)/*n为一个正整效 int j=23 whe((n%)!=088i1.0< sqrt(n))+; if(i“1.0>sqrt(n) printi("%d是一素数vn",n) prnt%不是一素数vn,n); (2)sum(ntn)/*n为一↑正整数,/ int p=l, sum=0.; for(|=1;i<=ni++) p*= sum+= return(sum); (3)sum2(lotn)/*n为一个正整数*/ int sun=0,i小 for(=1;<=ni++) p=1; for(=1<=l;++)p*; sum+=p+ return(sum)+ 解:算法的时间复杂度是由嵌套最深层语句的频度决定的。 (1) prime的嵌套最深层语句 i++ 它的频度由条件(n%i)!=088i*1.0<sqrt(n))决定,显然i*1,0<sqrt(n),即执 行频度小于sgrt(n),所以其时间复杂度是O(√n)。 (2)sum1的嵌套最深层语句: p*=issum+=p 它的频度为n次,所以其时间复杂度是O(n) (3)sum2的嵌套最深层语句:
它的频度为1+2+3+.+n=n(n+1)/2次,所以其时间复杂度是O(n2) 6.求两个n阶矩阵的乘法C=A×B其算法如下: define MAX 100 void maxtrixmult( int n float a[MAX[MAX J b[MAX][MAX] float cLMAX ILMAX] int i-jk+ float x s for(i=14<=n:i++) o(=1=n;++) ② or(k=1:k<=nk++) x+=a[i]k]*b[kcI]; ci]门=x; 分析该算法的时间复杂度。 解:该算法中主要语句的频度分别是 2n(n+1) C n(n ⑤ 则时间复杂度为所有语句的频度之和T(n)=2n3+3n2+2n+1=0(n3)
数据结构习题与解析C语言簡) 第2章顺序表 线性结构中的所有结点按它们之间的关系可以排成一个线性序列: 其中k1是开始点k,是终端结点k,是k+的前驱结点,而k+1是k,的后续结点(i=1 通常把上述线性序列称为“线性表”把线性结构中的结点称为元素或“表目”将一个线 性表存放到计算机中,可以采用不同的方法,其中最简单而自然的就是顺序的方法,即把表 目按其索引值从小到大一个接一个地存放在相邻的单元里顺序方法存储的线性表简称“顺 序表”顺序表是一种紧凑结构 2.1基本概念和运算 最简单也是最常用的顺序表有向址找和队列,下面分别讨论这些基本顺序表的概念和 运算 2.1.1向量 1.定义 向量指的是所有元素都是同一类型结点的线性表 向量的定义如下: typedef Elem Type vector[n0] 这里的 Elem Type可以是任何相应的数据类型如int, float或char等,在算法中,我们规 定 Elem Type缺省是int类型。向量中的元素个数n小于或等于某一整数n0 说明在C语言中,数组的下标是从0开始的,但为了描述算法简洁,本书中的向量 与文献[2]中一致,规定从下标1开始,这样,读者可不必考虑下标0的数组值。 2向量的建立 输入n个整数,产生一个存储这些整数的向量A的函数如下: void create(A,n) vector A for (i=l gi<=n:i++ scanf("%d.A[]);
第2章颛序表 3向量的存储方法 向怔邇常的存储方法悬顺序存储,每个元泰在存储器中占用的空间大小相同,若第个 菸存放的位是L〔Xk1),每个元素占用的空间大小为s则元素k的存放位置为: 10X(k.)=L.0X(k1)+N“(i-1) 任给个便可以很快计算岀I〔κˆ(k),因此,对順序存储的向址要查找任何·个元素 都很方使 .向量的插人 在-个有n个元素的向址A中的第i个元素之前插入一个元素x的函数如下 vector A: ifi<I|: i n1 printf!"i镨误!n") else for (j=n: j.itj A」·1A[;、将第j个元东及其后的元桁移x 问址长度增」 5.向量的删除 在…个有n个儿索的址A中删除第i个元素的函数如下 int ju if(i-.1:i.n) printf"值错误!n"1; else forj=i;-n:··)A|=A」·1;*将第1个元素之后的元前移*1 y向量长度减1* 6.向量的查找 在一个有n个元素的向量A中査找元素值为x的元素的函数如下:
数据结构习题与解析C语言篇) oid find(An.x) vector Al t nx: whe(<=n88.A[i<>x)|++; i(ij<〓n) rnt("找到了!vn"); printi("未找到vn") 2.1.2栈 找是限定仅在找顶一端进行压入(push)或弹出(pop)操作的线性数据结构。栈的主要特 点是“后进先出”,即后进栈的元素先处理。通常栈可以用顺序方式存储分配一块连续的存 储区域存放栈中的表,并用一个变量指向当前的栈顶。 I栈的定义 假设栈的元素个数最大不超过整数m0,所有的元素都具有同一数据类型 ElemType,则 可用下列方式来定义栈类型 stack ElemType s[mo] int top; s stack+ 这里的 Elem Type可以是任何相应的数据类型如int, float或char等,在算法中,我们规 定 Elem Type f缺省是int类型。其中变量top指向栈的栈顶称为栈指针。m0是一个正整数, 表示栈中可容纳的最多元素数例如用以下宏定义设置其值为100: t define mo 100 一般栈的形式如图2.1所示。 2栈的压人push(STx) 将整数x插入到ST栈中的函数如下 void push(ST.X) stack美ST int x: t(ST->p==mo)prht("栈上溢出!w"),/*若梭满则显示相应信息“ else /*否则栈指针top增1,将x赋给栈顶的元素*/