天勤论坛_数据结构
数据结构课后习题答案详解C语言版严蔚敏

数据结构习题集答案(C语言版严蔚敏)第2章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
解:头指针是指向链表中第一个结点的指针。
首元结点是指链表中存储第一个数据元素的结点。
头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。
它可以对空表、非空表以及首元结点的操作进行统一处理。
2.2 填空题。
解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。
(2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。
单链表中逻辑上相邻的元素的物理位置不一定紧邻。
(3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。
(4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。
2.3 在什么情况下用顺序表比链表好解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。
2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。
解:2.5 画出执行下列各行语句后各指针及链表的示意图。
L=(LinkList)malloc(sizeof(LNode)); P=L;for(i=1;i<=4;i++){P->next=(LinkList)malloc(sizeof(LNode));P=P->next; P->data=i*2-1;}P->next=NULL;for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2);for(i=1;i<=3;i++) Del_LinkList(L,i);解:2.6 已知L是无表头结点的单链表,且P结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。
a. 在P结点后插入S结点的语句序列是__________________。
数据结构习题和答案及解析

第 1 章绪论课后习题讲解1. 填空⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
【解答】数据元素⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。
【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。
⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。
【解答】集合,线性结构,树结构,图结构⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。
【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系⑸算法具有五个特性,分别是()、()、()、()、()。
【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。
【解答】自然语言,程序设计语言,流程图,伪代码,伪代码⑺在一般情况下,一个算法的时间复杂度是()的函数。
【解答】问题规模⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。
【解答】Ο(1),Ο(nlog2n)【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。
2. 选择题⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。
A 线性结构B 非线性结构C 存储位置D 指针【解答】C,D【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。
⑵假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。
则表示该遗产继承关系的最合适的数据结构应该是()。
数据结构课后习题答案清华大学出版社殷人昆

(2)用返回整数函数值0, 1来实现算法,以区别是正常返回还是错误返回;
(3)在函数的参数表设置一个引用型的整型变量来区别是正常返回还是某种错误返回。
试讨论这三种方法各自的优缺点,并以你认为是最好的方式实现它。
【解答】
#include"iostream.h"
return* result;
}
friend ostream& operator<< (ostream&os, complex&ob ){
//友元函数:重载<<,将复数ob输出到输出流对象os中。
returnos << ob.Re << ( ob.Im >= 0.0 )?“+” : “-” <<fabs( ob.Im ) << “i”;
}
1-5用归纳法证明:
(1)
(2)
(3)
【证明】略
1-6什么是算法?算法的5个特性是什么?试根据这些特性解释算法与程序的区别。
【解答】
通常,定义算法为“为解决某一特定任务而规定的一个指令序列。”一个算法应当具有以下特性:
①有输入。一个算法必须有0个或多个输入。它们是算法开始运算前给予算法的量。这些输入取自于特定的对象的集合。它们可以使用输入语句由外部提供,也可以使用赋值语句在算法内给定。
complex& operator= ( complex&ob){Re = ob.Re;Im = ob.Im; }//复数赋值
complex& operator+ ( complex&ob );//重载函数:复数四则运算
《数据结构》教程c语言版

《数据结构》第五版清华大学自动化系李宛洲2004年5月目录第一章数据结构--概念与基本类型 (6)1.1概述 (6)1.1.1数据结构应用对象 (6)1.1.2学习数据结构的基础 (7)1.1.2.1 C语言中的结构体 (7)1.1.2.2 C语言的指针在数据结构中的关联作用 (8)1.1.2.3 C语言的共用体(union)数据类型 (12)1.1.3数据结构定义 (15)1.2线性表 (17)1.2.1 顺序表 (18)1.2.2 链表 (20)1.2.2.1链表的基本结构及概念 (20)1.2.2.2单链表设计 (22)1.2.2.3单链表操作效率 (29)1.2.2.4双链表设计 (30)1.2.2.5链表深入学习 (32)1.2.2.6稀疏矩阵的三元组与十字链表 (36)1.2.3 堆栈 (41)1.2.3.1堆栈结构 (41)1.2.3.2基本操作 (42)1.2.3.3堆栈与递归 (44)1.2.3.4递归与分治算法 (45)1.2.3.5递归与递推 (49)1.2.3.6栈应用 (52)1.2.4 队列 (57)1.2.4.1队列结构 (57)1.2.3.2队列应用 (59)1.3非线性数据结构--树 (64)1.3.1 概念与术语 (64)1.3.1.1引入非线性数据结构的目的 (64)1.3.1.2树的定义与术语 (65)1.3.1.3树的内部节点与叶子节点存储结构问题 (66)1.3.2 二叉树 (66)1.3.2.1二叉树基本概念 (66)1.3.2.2完全二叉树的顺序存储结构 (68)1.3.2.3二叉树遍历 (69)1.3.2.4二叉树唯一性问题 (71)1.3.3 二叉排序树 (72)1.3.3.1基本概念 (72)1.3.3.2程序设计 (73)1.3.4 穿线二叉树 (79)1.3.4.1二叉树的中序线索化 (80)1.3.4.2中序遍历线索化的二叉树 (81)1.3.5 堆 (82)1.3.5.1建堆过程 (83)1.3.5.2在堆中插入节点 (85)1.3.6 哈夫曼树 (86)1.3.6.1最佳检索树 (86)1.3.6.2哈夫曼树结构与算法 (88)1.3.6.3 哈夫曼树应用 (90)1.3.6.4哈夫曼树程序设计 (92)1.3.7 空间数据结构----二叉树深入学习导读 (95)1.3.7.1k-d树概念 (96)1.3.7.2k-d树程序设计初步 (97)1.4非线性数据结构--图 (100)1.4.1图的基本概念 (100)1.4.2图形结构的物理存储方式 (103)1.4.2.1相邻矩阵 (103)1.4.2.2图的邻接表示 (104)1.4.2.3图的多重邻接表示 (106)1.4.3图形结构的遍历 (107)1.4.4无向连通图的最小生成树(minimum-cost spanning tree:MST) (110)1.4.5有向图的最短路径 (113)1.4.5.1单源最短路径(single-source shortest paths) (113)1.4.5.2每对顶点间最短路经(all-pairs shortest paths) (116)1.4.6拓扑排序 (117)第二章检索 (123)2.1顺序检索 (123)2.2对半检索 (124)2.2.1 对半检索与二叉平衡树 (124)2.2.2对半检索思想在链式存储结构中的应用---跳跃表 (127)2.3分块检索 (133)2.4哈希检索 (134)2.4.1哈希函数 (135)2.4.2闭地址散列 (136)2.4.2.1线性探测法和基本聚集问题 (136)2.4.2.2删除操作造成检索链的中断问题 (138)2.4.2.3随机探测法 (139)2.4.2.4平方探测法 (140)2.4.2.5二次聚集问题与双散列探测方法 (141)2.4.3开地址散列 (142)2.4.4哈希表检索效率 (142)第三章排序 (145)3.1交换排序方法 (145)3.1.1直接插入排序 (145)3.1.2冒泡排序 (147)3.1.3 选择排序 (148)3.1.4 树型选择排序 (149)3.2S HELL排序 (150)3.3快速排序 (152)3.4堆排序 (154)3.5归并排序 (156)3.6数据结构小结 (159)3.6.1 数据结构的基本概念 (159)3.6.2 数据结构分类 (159)3.6.2.1数据结构中的指针问题 (160)3.6.2.2线性表的效率问题 (161)3.6.2.3二叉树 (161)3.6.3排序与检索 (161)3.7算法分析的基本概念 (162)3.7.1基本概念 (162)3.7.2上限分析 (164)3.7.3下限分析 (164)3.7.4空间代价与时间代价转换 (165)第6章高级数据结构内容--索引技术 (167)6.1基本概念 (167)6.2线性索引 (168)6.2.1 线性索引 (168)6.2.2 倒排表 (169)6.32-3树 (170)6.3.1 2-3树定义 (172)6.3.2 2-3树节点插入 (173)6.4B+树 (178)6.4.1 B+树定义 (178)6.4.2 B+树插入与删除 (180)6.4.3 B+树实验设计 (182)第一章数据结构--概念与基本类型1.1概述1.1.1数据结构应用对象计算机应用可以分为两大类,一类是科学计算和工业控制,另一类是商业数据处理。
2019中国农业大学计算机考研经验贴

考中农计算机经验贴前言首先恭喜你能在众多985高校中选到了中农这个学校,学校在北京海淀,地理位置好(周围又都是清华,北大,人大),互联网公司多,且相对于其他985来说,算是比较好考的一个(相比于其他985高校动不动就400+的一大批,恐怖如斯!),信电学院里还是有很多大牛导师的,性价比比较高,我是19届报考中国农业大学计算机(学硕)的学长,本科就读于江西师范大学软件工程,我的初试分数如下!政治:61 英语:52 数学一:106 数据结构:131 总分:350分数不是很高,特别是英语这次发挥失常,比较痛心,在此我把我准备考研的这一年(也就9个月)来的领悟和教训写下来(网上关于中农的经验贴实在是太少),希望给未来20届以后的考生一点参考,让学弟学妹们少走点弯路,助你们金榜题名。
一战成硕!思想篇首先是想清楚你自己为什么考研?就我而言,因为高中的学习比较累,收到的约束比较大,到了大学就太放飞自我了,大学期间没好好认真学习,成绩一般,代码能力一般,比较贪玩,到头来发现没学到啥东西,眼见快要毕业找工作,怕自己这样的能力找不到好工作,于是准备考研,一方面可以好好静下心来补补相关知识,另一方面也希望自己能通过这一年的努力能够进入研究生阶段继续学习深造,动力比较足,所以中途也没有出现什么想放弃的念头。
所以请大家先好好问下自己的考研是为了什么,想好再上路!准备篇数学数学今年估计比较难,我的建议是早一点进行复习,我是从3月份开始复习的,前期主要是复习高数,高数我跟的是汤家凤(前期打基础强力推荐,听完后保证让你清清爽爽),汤神总是把一些晦涩难懂的概念说的很通俗易懂,最新的公共课视频请加群:六七七二八六五七八.获取(政治,数学,英语,各大辅导机构及名师的视频都有),书本的话,我强烈推荐汤家凤的高等数学辅导讲义,听一节知识的视频,做相应的笔记,紧接着做他辅导讲义上的题目,这很重要!不然你会忘得很快,一定要做些题目巩固一下(学长当时就一直看视频,没做题目巩固,导致知识点和一些技巧忘得很快的)。
数据结构试题及答案()

1. 1.数据结构是指数据及其相互之间的______________。
当结点之间存在M对N(M:N)的联系时,称这种结构为_____________________。
2. 2.队列的插入操作是在队列的___尾______进行,删除操作是在队列的____首______进行。
3. 3.当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则表示栈满的条件是___top==0___(要超出才为满)_______________。
4. 4.对于一个长度为n的单链存储的线性表,在表头插入元素的时间复杂度为_________,在表尾插入元素的时间复杂度为____________。
5. 5.设W为一个二维数组,其每个数据元素占用4个字节,行下标i从0到7 ,列下标j从0到3 ,则二维数组W的数据元素共占用_______个字节。
W中第6 行的元素和第4 列的元素共占用_________个字节。
若按行顺序存放二维数组W,其起始地址为100,则二维数组元素W[6,3]的起始地址为__________。
6. 6.广义表A= (a,(a,b),((a,b),c)),则它的深度为____________,它的长度为____________。
7.7.二叉树是指度为2的____________________树。
一棵结点数为N的二叉树,其所有结点的度的总和是_____________。
8.8.对一棵二叉搜索树进行中序遍历时,得到的结点序列是一个______________。
对一棵由算术表达式组成的二叉语法树进行后序遍历得到的结点序列是该算术表达式的__________________。
9.9.对于一棵具有n个结点的二叉树,用二叉链表存储时,其指针总数为_____________个,其中_______________个用于指向孩子,_________________个指针是空闲的。
10.10.若对一棵完全二叉树从0开始进行结点的编号,并按此编号把它顺序存储到一维数组A中,即编号为0的结点存储到A[0]中。
数据结构课后习题答案

第 1 章绪论课后习题讲解1. 填空⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
【解答】数据元素⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。
【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。
⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。
【解答】集合,线性结构,树结构,图结构⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。
【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系⑸算法具有五个特性,分别是()、()、()、()、()。
【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。
【解答】自然语言,程序设计语言,流程图,伪代码,伪代码⑺在一般情况下,一个算法的时间复杂度是()的函数。
【解答】问题规模⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。
【解答】Ο(1),Ο(nlog2n)【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。
2. 选择题⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。
A 线性结构B 非线性结构C 存储位置D 指针【解答】C,D【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。
⑵假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。
则表示该遗产继承关系的最合适的数据结构应该是()。
数据结构(第二版)课后习题答案(王红梅主编)

第 1 章绪论课后习题讲解1. 填空⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
【解答】数据元素⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。
【解答】数据项,数据元素【分析】数据结构指的是数据元素以及数据元素之间的关系。
⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。
【解答】集合,线性结构,树结构,图结构⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。
【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系⑸算法具有五个特性,分别是()、()、()、()、()。
【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。
【解答】自然语言,程序设计语言,流程图,伪代码,伪代码⑺在一般情况下,一个算法的时间复杂度是()的函数。
【解答】问题规模⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。
【解答】Ο(1),Ο(nlog2n)【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。
2. 选择题⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。
A 线性结构B 非线性结构C 存储位置D 指针【解答】C,D【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。
⑵假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。
则表示该遗产继承关系的最合适的数据结构应该是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法复杂度综合题目专练答案
1.解
其中的基本语句是第2行的cout语句,设它的执行次数为f(n),则有2f(n)≤n, 即f(n) ≤log2n。 本程序段时间复杂度T(n)=f(n)≤ log2n =O(log2n)。 故时间复杂度为O(log2n)。
2.解
设T(n)为fac(n)的时间开销函数。显然T(1)=O(1)。①的时间开销为O(1),
//①
return 1;
else
return (n*f(n一个算法用不多于3n/2的平均比较次数,在数组A[1..n]中找出最大和最
小值的元素。 4.设A是一个线性表(a1,a2,……,an),采用顺序存储结构,则在等概率的前提下, 平均插入一个元素需要移动的元素个数是多少?若元素插入在ai与ai+1之间(0≤i≤n-1) 的概率为 ,则平均每插入一个元素所要移动的元素个数又是多少?
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
} 分析: 显然 n 为规模,基本操作为++i;s=s+i;i 与 s 都从 0 开始,假设循环执行 m 次结 束,则有 s1=1,s2=1+2=3,s3=1+2+3=6, ……,sm=m(m+1)/2(其中 sm 为执行到第 m 次的时候 s 的值),则有 m(m+1)/2+K=n,(K 为起修正作用的常数)由求根公式得:
即:
由此可知时间复杂度为: T(n)=O( )
说明:在计算时间复杂度的时候有可能会出现这种情况,即对于相同的规模,因输 入序列不同会出现不同的时间复杂度,这时我们一般取最坏的情况下的输入序列(即使 得基本操作执行次数最多的序列)来计算时间复杂度。
算法复杂度综合题目专练
1.设n为如下程序段处理的数据个数,求其时间复杂度。
int i=1,k=0,n=100; do { k+=10*i;i++; } while (i==n); } (3) void main() { int i=1,j=0,n=10; while (i+j<=n) if (i>j) j++; else i++; } (4) void main() { int n=10,x=n,y=0; while (x>=(y+1)*(y+1)) y++; } (5) void main() { int n=9,i=1; while (i<=n) i=i*3; } 6.分析以下程序段的时间复杂度。 …… i=1; while (i<=n)
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
第一章 算法复杂度相关问题专练
说明:对于算法复杂度的评估问题,已经是每年必考的重点,因此本书将其独立作为 一章,通过一些具体的例题进行针对性的讲解,来帮助对此类问题形成系统的套路,来应 对多变的考研题目。 如果你已经读过《数据结构高分笔记》绪论部分,则可以直接做算法复杂度综合 题目专练 对于这部分,要牢记住一句话:将算法中基本操作的执行次数作为算法时间复杂度的 度量。这里我们所讨论的时间复杂度,不是执行完一段程序的总时间,而是其中基本操作 的总次数。因此对于一个算法进行时间复杂度分析的要点,无非是明确算法中哪些操作是 基本操作,然后计算出基本操作所重复执行的次数。在考试中算法题目里你总能找到一个 n,可以称为问题的规模,比如要处理的数组元素的个数为 n,而基本操作所执行的次数 是 n 的一个函数 f(n)(这里的函数是数学中的函数的概念,不是 C 或 C++语言中的函数 的概念)。对于求其基本操作执行的次数,就是求函数 f(n)。求出以后我们就可以取出 f(n)中随 n 增大增长最快的项,然后将其系数变为 1 做为时间复杂度的度量,记为 O(f(n)中增长最快的项/此项的系数),比如 f(n)=2n3+4n2+100,则其时间复 T(n)= T(n)=O 杂度为 T(n)=O(2n3/2)=O(n3)。其实计算算法的时间复杂度, 就是给出相应的数量 级,当 f(n)与 n 无关时, 时间复杂度 T(n)=O(1);当 f(n)与 n 是线性关系时, T(n)=O(n);是平方关系时,T(n)=O(n2);以此类推。 说明:考研中常常要比较各种时间复杂度的大小,常用的比较关系如下:
for (i=j;i<=n;i++) if (a[i]<a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } j++; order(j,m); //递归调用 } } 10.斐波那契数列Fn定义如下:F0=0,F1=1,Fn= Fn-1+Fn-2,n=2,3,……请就 此斐波那契数列,回答下列问题。 (1)在递归计算Fn的时候,需要对较小的Fn-1,Fn-2,……,F1,F0精确计算多少 次? (2)如果用大O表示法,试给出递归计算Fn时递归函数的时间复杂度是多少? 11. 设计求解下列问题的算法,并分析其最坏情况的时间复杂度。 (1)在数组A[1…n]中查找值为K的元素,若找到则输出其位置i;否则输出0作 为标志。 (2)找出数组A[1…n]中元素的最大值和次最大值。 12. 以下算法是在一个有n个数据元素的数组A中删除第i个位置的数组元素,要 求当删除成功时数组元素个数减1,求平均删除一个数组元素需要移动的元素个数是多 少?其中,数组下标从0至n-1。 int delete(int A[],int n,int i) { int j; if (i<0 || i>n) return 0;
9.分析order函数的时间复杂度。 order(int j,int m) { int i,temp; if (j<m) {
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
for (j=i+1;j<n;j++) A[j-1]=A[j]; n--; return 1; }
5.分析以下各程序段的时间复杂度。 (1) void main() { int i=1,k=0,n=10; while (i<=n-1) { k+=10*i; i++; } } (2) void main() {
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
2 2 2
3
k
n
O(1)≤O(log (n))≤O(n)≤O(nlog (n) )≤O(n )≤O(n )≤……≤O(n )≤O(2 )
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
i=i*2; …… 7. 假设n为2的乘幂,例如n=2,4,8,16,……,试求下列程序的时间复杂度及 变量count的值(以n的函数形式表示)。 void counter() { int n,x,count; cout << "n:"; cin >> n; count=0; x=2; while (x<n/2) { x=2*x; count++; } cout << count << endl; } 8. 某算法所需时间由下述方程表示,试求出该算法的时间复杂度(以大O形式表 示)。注意,n为求解问题的规模,为简单起见,设n是2的正整数幂。
for (i=1;i<=n;i=2*i) cout << "i=" << i << endl;
2.计算n!的递归函数fac(n)如下,试分析它的时间复杂度。 int fac(int n) { if (n<=1)
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
递归调用fac(n-1)的时间开销为T(n-1),则②的时间开销为O(1)+T(n-1)。则:
) 天勤论坛( 天勤论坛( ) Ⅱ 2013 年计算机专业基础综合考试习题详解 年计算机专业基础综合考试习题详解Ⅱ 数据结构试读版
第二步:计算出 n 的函数 f(n)。 显然,n 确定以后,循环的结束与否与 i 有关,i 的初值为 1,每次自增 2,假设 i 自增 m 次后循环结束,则 i 最后的值为 1+2×m,因此有 1+2×m+K=n(其中 K 为一个常 数,因为在循环结束时 i 的值稍大于 n,为了方便表述和进一步计算,用 K 将 1+2×m 修 正成 n。因为 K 为常数,所以这样做不会影响最终时间复杂度的计算),解得 m=(n-1K)/2,即 f(n)=(n-1-K)/2,可以发现其中增长最快的项为 n/2,因此时间复杂度 T(n)=O(n)。 例题 2:分析以下算法的时间复杂度。 void fun(int n) { int i,j,x=0; for(i = 1;i < n; ++i) for(j = i+1;j <= n; ++j) ++x; } 分析: ++x;处于最内层循环,因此取++x;做为基本操作。显然 n 为规模。可以算出++x; 的执行次数为 f(n)=n(n-1)/2,变化最快的项为 n2,因此时间复杂度为 T(n)=O(n2)。 例题 3:分析以下算法的时间复杂度。 void fun(int n) { int i = 0;s = 0; while(s < n) { ++i; s = s + i; }