1、时间复杂度计算时间复杂度计算时间复杂度计算时间复杂度分析时间复杂度分析空间复杂度本章的本章的是了解数据结构的是了解数据结构的、三方面的概念及相三方面的概念及相互关系,互关系,是是的分析方法。的分析方法。 需要达到需要达到层次的内容有:层次的内容有:、算法的、算法的和和、最坏的和平均时间复杂度等概念,最坏的和平均时间复杂度等概念,和算法分析的方法、对一般的算法要能和算法分析的方法、对一般的算法要能分析出时间复杂度。分析出时间复杂度。 需要达到需要达到层次的基本概念和术语有:层次的基本概念和术语有:数据数据、。特别。特别是数据结构的逻辑结构、存储结构及数据运是数据结构的逻辑结构、存储结构及数据运算
2、的含义及其相互关系。数据结构的两大类算的含义及其相互关系。数据结构的两大类逻辑结构和四种常用的存储表示方法。逻辑结构和四种常用的存储表示方法。 1.1 简述下列概念:数据、数据元素、数据简述下列概念:数据、数据元素、数据类型、数据结构、逻辑结构、存储结构、类型、数据结构、逻辑结构、存储结构、线性结构、非线性结构。线性结构、非线性结构。 数据:数据:指能够被计算机识别、存储和加工处理的信指能够被计算机识别、存储和加工处理的信息载体。息载体。 数据元素:数据元素:就是数据的基本单位,在某些情况下,数就是数据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。据元素也称为元素、结点、顶点
3、、记录。数据元素有时可以由若干数据项组成。数据元素有时可以由若干数据项组成。 数据类型:数据类型:是一个值的集合以及在这些值上定义的一是一个值的集合以及在这些值上定义的一组操作的总称。组操作的总称。 数据结构:数据结构:指的是数据之间的相互关系,即数据的组指的是数据之间的相互关系,即数据的组织形式。一般包括三个方面的内容织形式。一般包括三个方面的内容:数据的数据的逻辑结构、存储结构和数据的运算。逻辑结构、存储结构和数据的运算。 逻辑结构:逻辑结构:指各数据元素之间的逻辑关系。指各数据元素之间的逻辑关系。 存储结构:存储结构:就是数据的逻辑结构用计算机语言的实现。就是数据的逻辑结构用计算机语言的
4、实现。 线性结构:线性结构:数据逻辑结构中的一类,它的特征是若结构数据逻辑结构中的一类,它的特征是若结构为非空集,则该结构有且只有一个开始结点为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所有结点都最多只有和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。线性表就是一个直接前趋和一个直接后继。线性表就是一个典型的线性结构。一个典型的线性结构。 非线性结构:非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接前趋和直接后继。一个结点可能有多个直接前趋和直接后继。1.2 试举一个数据结构的例子、叙述其逻辑试举
5、一个数据结构的例子、叙述其逻辑结构、存储结构、运算三个方面的内容。结构、存储结构、运算三个方面的内容。 例如有一张学生成绩表,记录了一个班例如有一张学生成绩表,记录了一个班的学生各门课的成绩。按学生的姓名为一行的学生各门课的成绩。按学生的姓名为一行记成的表。这个表就是一个数据结构。每个记成的表。这个表就是一个数据结构。每个记录记录(有姓名,学号,成绩等字段有姓名,学号,成绩等字段)就是一个就是一个结点,对于整个表来说,只有一个开始结点结点,对于整个表来说,只有一个开始结点(它的前面无记录它的前面无记录)和一个终端结点和一个终端结点(它的后面它的后面无记录无记录),其他的结点则各有一个也只有一,
6、其他的结点则各有一个也只有一个直接前趋和直接后继个直接前趋和直接后继(它的前面和后面均它的前面和后面均有且只有一个记录有且只有一个记录)。这几个关系就确定了。这几个关系就确定了这个表的这个表的。 那么我们怎样把这个表中的数据存储到计算那么我们怎样把这个表中的数据存储到计算机里呢机里呢? 用高级语言如何表示各结点之间的用高级语言如何表示各结点之间的关系呢关系呢? 是用一片连续的内存单元来存放这是用一片连续的内存单元来存放这些记录些记录(如用数组表示如用数组表示)还是随机存放各结点还是随机存放各结点数据再用指针进行链接呢数据再用指针进行链接呢? 这就是这就是的问题。的问题。 最后,我们有了这个表最
7、后,我们有了这个表(数据结构数据结构),肯定要,肯定要用它,那么就是要对这张表中的记录进行查用它,那么就是要对这张表中的记录进行查询,修改,删除等操作,对这个表可以进行询,修改,删除等操作,对这个表可以进行哪些操作以及如何实现这些操作就是哪些操作以及如何实现这些操作就是问题了。问题了。 1.3 常用的存储表示方法有哪几种常用的存储表示方法有哪几种? 常用的存储表示方法有四种常用的存储表示方法有四种: 顺序存储方法:顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来
8、体现。由此得到的存储表单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构。示称为顺序存储结构。 链接存储方法:链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存段表示的。由此得到的存储表示称为链式存储结构。储结构。 索引存储方法:索引存储方法:除建立存储结点信息外,还建立附加的索引除建立存储结点信息外,还建立附加的索引表来标识结点的地址。表来标识结点的地址。 散列存储方法:散列存储方法:就是根据结点的关键字直接计算出该结点的就是根据结点
9、的关键字直接计算出该结点的存储地址。存储地址。 1.4 设三个函数设三个函数f, g, h分别为分别为f(n)=100n3+n2+1000 , g(n)=25n3+5000n2 , h(n)=n1.5+5000nlgn请判断下列关系是否成立:请判断下列关系是否成立:(1) f(n)=O(g(n) (2) g(n)=O(f(n) (3) h(n)=O(n1.5)(4) h(n)=O(nlgn)渐近时间复杂度的表示法的严格定义渐近时间复杂度的表示法的严格定义:“若若T(n)和和f(n)是定义在正整数集合上的两个函是定义在正整数集合上的两个函数,则数,则T(n)=O(f(n)表示存在正的常数表示存在
10、正的常数C和和n0 ,使得当使得当nn0时都满足时都满足0T(n)Cf(n)。” (1)成立。成立。 (2)成立。)成立。 (3)成立。)成立。 (4)不成立。)不成立。 。1.5 设有两个算法在同一机器上运行,其设有两个算法在同一机器上运行,其执行时间分别为执行时间分别为100n2和和2n,要使前者快于要使前者快于后者,后者,n至少要多大至少要多大? 最简单最笨的办法就是拿自然数去最简单最笨的办法就是拿自然数去代呗。假定代呗。假定n取为取为10,则前者的值是,则前者的值是10000,后者的值是,后者的值是1024,小于前者,小于前者,那我们就加个那我们就加个5,用,用15代入得前者为代入得前
11、者为22500,后者为,后者为32768,已经比前者大,已经比前者大但相差不多,那我们再减个但相差不多,那我们再减个1,用,用14代代入得,前者为入得,前者为19600,后者为后者为16384,又,又比前者小了,所以结果得出来就是比前者小了,所以结果得出来就是n至至少要是少要是15。1.6 设设n为正整数,利用大为正整数,利用大O记号,将下列记号,将下列程序段的执行时间表示为程序段的执行时间表示为n的函数。的函数。 1.7 算法的时间复杂度仅与问题的规模相关吗算法的时间复杂度仅与问题的规模相关吗? No,事实上,算法的时间复杂度不仅与问事实上,算法的时间复杂度不仅与问题的规模相关,还与输入实例
12、中的元素取值题的规模相关,还与输入实例中的元素取值等相关,但在最坏的情况下,其时间复杂度等相关,但在最坏的情况下,其时间复杂度就是只与求解问题的规模相关的。我们在讨就是只与求解问题的规模相关的。我们在讨论时间复杂度时,一般就是以最坏情况下的论时间复杂度时,一般就是以最坏情况下的时间复杂度为准的。时间复杂度为准的。 1.8 按增长率由小至大的顺序排列下列各函数:按增长率由小至大的顺序排列下列各函数:2100, (2/3)n,(3/2)n, nn, n! ,2n ,lgn, nlgn, n(3/2), n(1/2) 分析如下:分析如下:2100 是常数阶;是常数阶; (2/3)n和和 (3/2)n
13、是指数阶是指数阶,其中前者是随其中前者是随n的增大而减小的增大而减小的;的; nn是指数方阶;是指数方阶; n(1/2) 是方根阶是方根阶, n! 就就是是n(n-1)(n-2). 就相当于就相当于n次方阶;次方阶;2n 是指是指数阶,数阶,lgn是对数阶是对数阶 ,nlgn是对数方阶是对数方阶, n(3/2)是是3/2次方阶。根据以上分析按增长率由小至大次方阶。根据以上分析按增长率由小至大的顺序可排列如下:的顺序可排列如下: (2/3)n 2100 lgn n n(3/2) nlgn (3/2)n 2n n! nn 1.9 有时为了比较两个同数量级算法的优劣,有时为了比较两个同数量级算法的优劣,须突出主项的常数因子,而将低次项用大须突出主项的常数因子,而将低次项用大“O”记号表示。记号表示。例如,设例如,设T1(n)=1.39nlgn+100n+256=1.39nlgn+O(n), T2(n)=2.0nlgn-2n=2.0lgn+O(n), 这两个式子表示,当这两个式子表示,当n足够大时足够大时T1(n)优于优于T2(n),因为前者的常数因子小于后者。请用,因为前者的常数因子小于后者。请用此方法表示下列函数,并指出当此方法表示下列函数,并指出当n足够大时,足够大时,哪一个较优,哪一个较劣哪一个较优,哪一个较劣?