




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章 概 述第1章 概 述本章学习要点了解数据结构的相关概念。了解并掌握数据的4种基本逻辑结构的特点。了解数据的各种基本存储结构。了解算法的相关概念,并能分析各种算法的时间复杂度和空间负责度。数据结构(Data Structures)是随着计算机科学的发展而逐步形成的一门学科,目前已成为高等院校中计算机类各专业的核心课之一,同时也是统计类、经济类和工程软件设计类各专业的必修课程。本章的主要内容是对数据结构的基本概念和基本内容作一概要介绍,为此,简单回顾一下数据结构的发展与形成过程对于理解数据结构的内容和重要性是很有必要的。1.1 数据结构的发展概况众所周知,在40年代计算机刚诞生时,计算机所能处理的数据只能是由0或1组成的二进制数,此时还谈不上什么结构。后来虽然计算机可以处理十进制整数和十进制实数,也不过是由0到9这十个数字组成的序列,或再加上小数点,其数据的结构非常简单没有研究它的必要。由于计算机技术的飞速发展和数据处理能力的不断提高,到60年代中期,各种高级程序设计语言相继出现,所能描述的数据类型逐渐丰富。例如,在FORTRAN语言中允许使用复数类型和数组类型数据。其中,复数是两个实数的有序对,而数组是同类型数据的一个有限序列,这自然是一种“结构”。在COBOL语言和PL/1语言中允许使用字符类型和记录类型数据,将计算机的应用领域由数值计算进一步扩充到非数值计算。其中,记录就是一种“结构”类型的数据,它把一组相互关联的不同类型的数据看作一个整体构成一种新的“结构类型”数据。有了“结构类型”的概念之后,各个数据之间不再孤立,这样便于表示和储存,也便于处理。后来,在LISP语言中又定义了一种带有层次性的表结构,并定义了许多相应的运算。这种层次结构是一种非线性的树型结构,也是本书中将要着重讨论的内容之一。数据结构作为一门课程的形成和发展主要是在60年代后期。首先,在1968年由美国计算机协会(ACM)颁发了建议性的计算机教学计划,其中规定数据结构作为一门独立的课程,这在世界上是第一次。同一年,美国的计算机科学家D.E.Knuth教授在他的巨著计算机程序设计的技巧详细论述了数据的逻辑结构和数据的存储结构,并对各种结构给出了典型算法,为数据结构作为一门课程奠定了理论基础。70年代初,随着大型程序以及大规模文件系统的出现,结构程序设计成为程序设计方法学的主要内容。在程序设计中,数据结构受到了极大的重视。认为程序设计的实质就是对要处理的问题选择一种最为适合的数据结构,同时在此结构上施加一种好的算法。1976年瑞士著名计算机科学家N.Wirth编著的算法+数据结构=程序一书正是这种程序设计思想的具体体现。70年代中后期,由于数据库系统和数据检索系统的不断发展,在数据结构中进一步增加了文件管理的内容以及B-树和B+树的知识,使数据结构的内容得以丰富和进一步完善。从80年代开始,在我国高等院校的教学计划中已经将数据结构课程列为计算机类各专业的核心课程之一,在许多非计算机专业也把数据结构作为必修课或选修课程。数据结构是一门介于数学、计算机硬件和计算机软件三者之间的计算机专业基础课,是程序设计方法学、数据库系统、操作系统、编译原理、软件工程学等课程的先修课程,是设计和实现大型应用软件的基础。1.2 数据结构的基本术语和相关概念数据(data)是能输入到计算机中并能被计算机处理的符号的总称,是计算机程序的加工“原料”。需要说明的是,这里的“数据”绝对不能狭义地理解为仅仅是数学中的整数或实数而已,必须作广义的理解。例如,一个有某种功能源程序,一个文件,一张图画,一段声音等等都可以通过编码而归纳为数据的范畴。数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行处理。由于数据的范围非常广泛,因此数据元素可大可小,小到一个字符;大到一本书或一张地图等等。对于较大的数据元素还能进一步分成若干个“数据项(data item)”,每个数据项也可以是由几个更小的数据项组成,这样的数据项称为“组合项”,不能再分的数据项称为“原子项”。例如,一本书的目录信息作为一个数据元素,是由各章的目录组成的,而每章的目录又是由该章中各小节的目录组成。各章的目录信息就是组合项,如果每一小节的目录不能再分成更小的单位,则称其为原子项,否则称为组合项。关键字(key)是指数据元素中能够起标识作用的数据项。其中能够起唯一标识作用的数据项称为“主关键字”,反之称为“次关键字”。例如,每个学生的信息可以看成是一个数据元素,其中的数据项有:学号、姓名、性别、年龄和班级等等,由于每个学生都有一个唯一的学号,所以数据项“学号”是主关键字,而姓名可能存在重复所以数据项“姓名”是次关键字。数据对象(data object)是具有相同性质的数据元素的集合,是数据的一个子集。例如,全体整数的集合N=0,1,2,就是一个数据对象,全体复数的集合C=|x,yR也是一个数据对象。在程序设计中,总是针对某个特定的问题处理一种或几种数据对象,不可能在一个问题中处理所有的数据。例如,在文本编辑系统中的数据对象是文件中所出现的各种文字和符号的集合;在学生成绩管理系统中的数据对象是所有学生的成绩;在电话号码查询系统中的数据对象是全体电话用户的信息所组成的集合。数据关系(dat relation)是数据对象中各元素之间的一种结构(或序),它反映了数据元素之间存在的一种固有联系。在数据处理时,通常把一个数据对象中两个元素之间的数据关系简单地用前驱和后继来描述。例如,某个数据对象中的两个元素a,b之间存在关系:a是b的前驱(或b是a的后继),则可表示为或ab。一周中的7天是一个数据对象,其中的每一天为一个数据元素,它们之间的数据关系有:,。数据的逻辑结构(data logical structure)是数据元素之间存在的逻辑(或序)关系的描述,它可以用一个数据元素的集合D,和D中各元素之间存在的所有关系的集合R来表示成DLS=(D,R)。根据数据之间存在的不同逻辑关系,通常将逻辑结构分为以下4种基本结构:(1)集合结构(Set) 在该逻辑结构中,只有数据元素集D,而关系集为空集合,即R=。如图1.1(a)所示的数据对象中,其数据的逻辑结构为集合结构。(2)线性结构(Line Structure) 在该结构中,除了第1个元素(记录)外,其它各元素(记录)都有唯一的直接前驱;除了最后1个元素(记录)外,其它各元素(记录)都有唯一的直接后继。数据中各元素之间存在一个对一个的关系,如图1.1(b)所示的数据对象中,其数据的逻辑结构为线性结构。(3)树型结构(Tree Structure) 在该结构中,除了一个根元素(结点)外,其它各元素(结点)都有唯一的直接前驱;所有数据元素(结点)都可以有多个后继。数据中各元素之间存在一个对多个的关系,如图1.1(c)所示的数据对象中,其数据的逻辑结构为树型结构也称为层次结构。(4)图结构或网结构(Graph Structure) 在该结构中,各元素(顶点)之间可以有多个直接前驱和多个直接后继。数据中各元素之间存在多个对多个的关系,如图1.1(d)所示的数据对象中,其数据的逻辑结构就是图结构。图结构和树型结构统称为非线性结构。数据的物理结构(Data Physical Structure)又称数据的存储结构,它是数据在计算机中的存储表示,包括数据本身在计算机中的存储方式,以及数据之间的逻辑关系在计算机中的表示。因此,数据的物理结构是依赖于计算机的。根据在存储器中表示数据的不同方法,通常有以下4种物理存储结构:(1)顺序存储结构(Sequential Storage Structure) 将逻辑上相邻的数据元素存储在物理位置上相邻的存储单元中,元素之间的逻辑关系由其相应的存储单元的相邻关系来表示。(2)链式存储结构(Linked Storage Structure) 在存储器中不要求将逻辑上相邻的数据元素存储到相邻的物理存储位置中,而是通过附加指针字段来表示数据元素之间的逻辑关系。(3)索引存储结构(Index Storage Structure) 在存储数据元素信息的同时,还建立一个附加的索引表,索引表中每一项称为索引项(关键字),它是能够唯一标识一个数据元素的数据项。(4)哈希存储结构(Hash Storage Structure) 能根据数据元素的关键字直接算出该数据元素的存储地址。数据结构(data structure)是具有结构(或关系)特性的数据元素的集合,它研究的是数据的逻辑结构和物理结构以及它们之间的相互关系,并在这种结构上定义相关的运算,设计并实现相应的算法,分析算法的效率。数据的逻辑结构和物理结构是数据结构的相互关联的两个方面,同一个逻辑结构可以有几种不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于数据的存储结构。1.3 应用举例【例1.1】一周中的7天的数据结构是DLS=(D,R),其中,D=Sun,Mon,Tue,Wed,Thu,Fri,Sat,R=,。可用逻辑图形表示该结构为图1.2(a);其顺序存储结构可以表示为图1.2(b);其链式存储结构可以表示成图1.2(c)。【例1.2】现有下列3种用二元组表示的数据逻辑结构,画出它们对应的逻辑图形表示,并指出它们分别属于何种类型的结构。(1)A=(K,R),其中:K=a,b,c,d,e,f,g,h,R=,(2)B=(K,R),其中:K=a,b,c,d,e,f,g,h,R=,(3)C=(K,R),其中:K=1,2,3,4,5,6,R=(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)这里的一对圆括号表示相应的两个结点是双向的。解:(1)A对应的逻辑结构图如图1.3(a)所示,它是一种线性结构。(2)B对应的逻辑结构图如图1.3(b)所示,它是一种树型结构。(3)C对应的逻辑结构图如图1.3(c)所示,它是一种图结构。【例1.3】现有如图1.4所示的逻辑结构图示,给出它的逻辑结构。解:本题的逻辑结构如下:DLS=(D,R)其中,D=A,B,C,D,E,F,G,H,I,J,R=r1,r2r1=,r2=,1.4 算法描述和算法分析如前所述,数据结构必须和研究相应的算法结合起来,才能解决实际中的应用问题。本节将给出算法的定义和算法的各种描述方法,并进一步从运行的时间开销和空间开销两个方面分析算法执行的效率。1.4.1 算 法算法(Algorithm)是对特定问题求解步骤的一种描述,是为了解决某个问题给出的一个确定的、有限长的操作序列。一个算法应具有以下5个重要特性:(1)有穷性一个算法应该包含有限个操作步骤,而不是无限的。对于合法的输入值,算法能在执行有限次操作之后得到结果。有限次操作是指操作步骤为有限个,并且每个步骤都能在规定的时间内完成。(2)确定性算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。并且在同样的条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。(3)有零个或有限个输入所谓输入是指在执行算法时需要从外界取得必要的信息或数据。一个算法可以没有输入也可以有有限个输入,这些输入应来源于某几个特定的数据对象。(4)有输出结果算法的目的是为了求解,“解”就是输出结果。一个算法应该有一个或多个输出。算法的结果可以输出到文件中,也可以打印输出或显示输出,这些输出是与输入的数据有着某种关联的量。没有输出的算法是无意义的。(5)可行性一个算法是可行的,即算法中的每一个操作都是可以通过已经实现的基本操作在规定的时间内执行有限次来实现。1.4.2 算法设计要求在通常情况下,设计算法时应该达到以下4个目标:(1)正确性 算法应该满足具体问题的需求。即算法应该满足对特定问题进行处理时,在输入、输出、数据加工等方面的要求。(2)可读性 算法除了用于编写程序在计算机上运行之外,另一个重要用处是用于阅读和交流。可读性好有助于人们对算法的理解,便于对该算法的使用与推广。(3)健壮性 当输入数据非法时,算法也能适当做出反应或进行处理,输出表示错误性质的信息并等待下一次输入或终止程序。(4)高时间效率和低存储占用量 通常情况下,求解同一个问题若有多种算法,则执行时间短的算法效率高,占用存储空间少的算法好。但是算法的时间开销和空间开销往往是相互制约的,在实际应用中对高时间效率和低存储占用的要求只能根据具体问题折中处理。1.4.3 算法的描述1算法的描述方法根据侧重点的不同对算法的描述方法通常也不一样,常用的方法有如下4种:(1)自然语言描述法 用日常使用的语言,可以是汉语、英语或其他语言,同时还使用一些高级计算机程序设计语言中的语句来描述算法。其优点是简单、易懂,但文字沉长、容易出现歧义性,且要将一个算法转换成可以上机调试并运行的计算机程序比较困难。(2)流程图描述法 该方法是用一些图框来表示各种操作。其优点是直观、易懂,但是用来描述比较复杂的算法时其“直观”和“易懂”的优点便不再显现。同时将流程图转化为可上机运行的程序也不方便。(3)计算机语言描述法 也叫程序法,即使用某一种计算机语言描述出来的算法。该方法的优点是可以在计算机上直接运行并获得结果。(4)类计算机语言描述法 采用伪码(包括高级语言的3种基本控制结构)和某一种高级语言(比如C或C+语言)相结合的一种“类高级语言”来描述算法的方法。这种算法只要经过简单的转换即可上机运行。该方法的优点是易于书写和阅读,能使读者把注意力集中于算法的实质,而不用把精力花在某个高级语言的许多具体约定之上。2类C+语言的说明尽管对数据结构的研究是不依赖于任何计算机程序设计语言的,对于算法可以采用自然语言或流程图来描述。但是这样描述有时太不精确,难以反映出算法的本质特点,所以还是要选择一种程序设计语言来描述算法。鉴于目前C+语言最为流行,本书中所有需要精确描述的算法都用“类C+语言”书写。当然,这种语言书写的程序在语法上不一定十分严格,有些程序还不能直接在计算机上运行,但是在上机时只要根据C+的语法规则对已有的算法经过简单的转换即可。以下对类C+语言进行简要说明:(1)元素的类型 在数据结构的算法描述中,基本元素的类型约定为ElemType,上机运行时由用户根据需要使用语句“typedef 实际类型 ElemType;”定义元素的具体类型。(2)算法(函数)的描述 函数返回类型 函数名(函数的形参列表) /算法说明部分/变量的定义和调用函数的声明部分语句序列函数返回语句 在调用函数时,为了通过被调函数的实参得到运行结果,在函数的形参列表中除了值传递方式外,还使用了C+的引用调用的参数传递方式。在形参列表中,以&打头的参数即为引用参数,引用参数能通过该函数本身修改主调函数中相应的实参变量的值。(3)内存的动态分配与释放 动态分配内存语句:指针变量=new 数据类型元素个数; 释放内存空间语句:delete 指针变量;new和delete是C+语言系统的两个指令而不是函数调用,可以在程序中直接使用该指令。(4)赋值语句简单赋值语句: 变量名=表达式;串联赋值语句: 变量名1=变量名2=变量名k=表达式;结构体变量整体赋值语句: 结构类型 变量名=表达式1,表达式2,表达式k; 结构体变量名1=结构体变量名2;条件赋值语句:变量名=条件表达式?表达式1:表达式2;(5)分支语句条件语句1: if(条件表达式)语句; 条件语句2: if(条件表达式1)语句1; else if(条件表达式2)语句2; else if(条件表达式k)语句k; else 语句k+1;swicth语句: switch(表达式) case 常量表达式1: 语句序列1;break; case 常量表达式2: 语句序列2;break; case 常量表达式k: 语句序列k;break; default: 语句序列k+1; (6)循环语句for语句: for(初值表达式序列;条件表达式;循环体表达式2)循环体表达式1;while语句: while(条件表达式)循环体表达;do-while语句:do循环体语句序列;while(条件表达式);(7)结束语句continue语句: 结束本次循环进入下次循环的开始。break语句: 结束循环语句或swicth语句。return语句: 结束函数运行返回到主调函数。(8)输入和输出语句输入语句: cin变量1变量2变量k;输出语句: cout表达式11)个不同值的数据元素a0,a1, ,an-1,求它们中的最大值max和最小值min。方法1 用自然语言描述其算法如下:将a0、a1中的较小者赋值给min,较大者赋值给max;把2赋值给k;当kn时,执行下面的操作,否则执行语句: 如果akmin则,minmax则,max=ak;使k=k+1;转移到语句去执行;返回最小数min和最大数max。方法2 用流程图描述算法如图1.5所示。方法3 用C+语言描述的算法如下:void function(int A,int n,int &min,int &max)/function begin/求n个整型数据元素A0,A1,An-1中的最小元素到min最大元素到max中。 int k; if(A0A1)min=A0;max=A1; else min=A1;max=A0; for(k=2;kn;k+) if(Akmax)max=Ak;/function end方法4 用类C+语言描述的算法如下:void function(ElemType A,int n,ElemType& min,ElemType& max)/begin/求n个元素A0,A1,An-1中的最小元素到min最大元素到max中。 int k; if(A0A1)min=A0;max=A1; else min=A1;max=A0; for(k=2;kn;k+) if(Akmax)max=Ak;/end1.4.4 算法效率的分析对于同一个问题(例如对n个整数进行排序)可以有许多不同的算法,那么该怎样判断算法的优劣呢?一个算,法除了它的正确性必须保证以外,主要的一个指标是它的效率。算法效率包括时间与空间两个方面,分别称为时间复杂度与空间复杂度。算法分析的目的是根据实际问题,从多种算法中选取一个最为适合的算法并从时间效率和空间效率两方面给出评价。1算法的时间复杂度时间复杂度是指一个算法所需运算次数的多少。时间复杂度不是表示为一个绝对的量,而是表示为算法中基本操作的执行次数随着问题规模(即数据元素的个数通常用整数n表示)的增长而增长的趋势。在求算法的时间复杂度时主要考虑该算法中的基本操作重复执行的次数与问题规模的函数关系。如果随着问题规模的增大,算法执行次数的增长率与的增长率相同,则算法的时间复杂度记作 其中,为问题的规模即数据元素的个数,为基本操作的执行次数也叫频度。【例1.5】分析以下程序段的时间复杂度。for(i=0;i=n;i+) y=y+1; for(j=0;j=2*n;j+)x+;该算法的规模为n,基本操作是语句“x+;”,它在内层循环中的执行次数为2n+1次,外层循环的执行次数为n+1次。基本操作的频度为。时间复杂度为。【例1.6】分析以下程序段的时间复杂度。i=s=0;while(sn)i+;s+=i;该算法的规模为,基本操作是语句“”,该语句在循环中的执行次数为次。结束循环时有关系式: 成立(其中c为常数),即。所以算法的时间复杂度为:。【例1.7】分析以下程序段的时间复杂度。i=1;while(i=m)i=i*3;该算法的规模为,基本操作是语句 “”,它在循环中的执行次数为次。退出循环时有关系式: 成立(其中c为常数),即:。时间复杂度为: 。需要说明的是:(1)一个算法中基本操作的频度的精确值有时不易求得,此时只需要求出它关于规模n的增长率或增长的阶数即可(例题1.6、例题1.7)。(2)有些情况下,算法中基本操作重复执行的次数还与问题的输入数据有关,此时我们所讨论问题的时间复杂度是在最坏情况下的时间复杂度。2算法的空间复杂度一个算法处理需要存储空间来寄存程序本身所用到的指令、常量、变量和输入输出数据外,也需要一些对数据进行操作的工作单元即为辅助空间。空间复杂度是指一个算法所需的辅助内存空间的大小。假如随着问题规模的增大,算法运行时所需要的辅助存储空间是的函数,且增加时的增长率与辅助空间的增长率相同,空间复杂度记为: 其中,为问题的规模,为辅助空间的大小。1.5 习 题一、简答题1举例说明什么叫数据、数据元素、数据项和数据结构?2数据结构研究的主要问题是什么?3算法分析的目的是什么?算法分析的两个主要方面是什么?二、填空题1数据的逻辑结构被形式地定义为(D,R),期中D是( )的有限集,R是D上( )的有限集。2数据结构在计算机内存中的表示是指数据的( )结构。3数据逻辑结构的基本类型除了集合结构类型外还有( )、( )和( ),其中( )是非线性结构。4线性结构中元素之间存在( )关系,树型结构中元素之间存在( )关系,图型结构中元素之间存在( )关系。三、解答题1设数据的逻辑结构为:B=(D,R) D=1,2,3,9R=,画出这个逻辑结构的图示,并确定逻辑关系R是何种基本类型。2分别计算下列各算法的时间复杂度。(1)求和算法:int sum1(int n) int s=0,i=1; while(i=n)s+=i+; return s; (2) 求项数算法:int sum2(int n) int s=0,i=1; while(s=n)s+=i+; return i; (3) 求阶乘算法:long fact(int n) if(n=1)return(1); else return(n*fact(n-1); (4) 求解盘片数为n的汉诺塔的算法:void Hanoi(int n,char A,char B,char C) if(n=1) cout”Move disk”n”from”A”to”Cendl;else Hanoi(n-1,A,C,B);cout”Move disk”n”from”A”to”Cendl;Hanoi(n-1,B,A,C);(5) 排序算法:void Order(int A,int m,int j=0) int i,k,t;if(jm-1) for(k=j,i=j+1;im;i+)if(AiAk)k=i; if(k!=j)t=Ak;Ak=Aj;Aj=t;j+; Order(A,m,j);3设计一个算法,求数组A0,A1,An-1中的最大元素和次小元素的值,并分析算法的时间复杂度和空间复杂度。4设计一个算法,求一元多项式的值。并分析算法的时间复杂度和空间复杂度。5已知k阶斐波那契序列的定义为:试编写求k阶斐波那契序列第m项的程序(函数形式,其中k和m为参数),并分析算法的时间复杂度和空间复杂度。1.6 上机实验本章上机实验的目的主要在于帮助学生复习高级语言的使用方法。根据问题的需要,利用高级语言中以存在的基本数据类型来定义新的结构类型,并对该类型数据定义相应的基本操作,再用基本操作的组合来实现较为复杂的操作。实验题目 复数四则运算【问题描述】设计一个可以进行复数运算的演示程序。【基本要求】实现复数的下列基本运算:(1)由分别输入的实部和虚部生成一个复数;(2)实现两个复的加法运算;(3)实现两个复的减法运算;(4)实现两个复的乘法运算;(5)实现两个复的除法运算;(6)求已知复数的实部和虚部的运算。复数运算结果以相应的复数表示形式显示输出。【测试数据】由设计者自行指定。【实现提示】定义复数为由两个相互之间存在次序关系的实数对构成复数的结构体类型,再利用对实数基本操作的组合来实现对复数的基本操作。第1章、部分习题参考答案一、简答题1举例说明什么叫数据、数据元素、数据项和数据结构?数据是能输入到计算机中并能被计算机处理的符号的总称,是计算机程序的加工“原料”。例如,一个有某种功能的源程序,一个文件,一张图画,一段声音等等都可以通过编码而归纳为数据的范畴。数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行处理。例如,一个字符;一本书或一张地图等等。数据项是组成数据元素的基本单位,例如,每个学生的信息可以看成是一个数据元素,其中的数据项有:学号、姓名、性别、年龄和班级等等。数据结构包括数据的逻辑结构和数据的物理结构,数据的逻辑结构有:集合结构、线性结构、层次结构和网结构;数据的物理结构有:顺序存储结构、链式存储结构、索引存储结构和哈希存储结构。2数据结构研究的主要问题是什么?数据结构研究的是数据的逻辑结构和物理结构以及它们之间的相互关系,并在这种结构上定义相关的运算,设计并实现相应的算法,分析算法的效率。3算法分析的目的是什么?算法分析的两个主要方面是什么?算法分析的目的是,在算法正确的前提下,对算法的时间效率、空间效率和算法的可读性进行分析和评价。算法分析的两个主要方面是,算法的时间效率分析和空间效率分析。二、填空题1数据的逻辑结构被形式地定义为(D,R),期中D是(数据元素)的有限集,R是D上(关系)的有限集。2数据结构在计算机内存中的表示是指数据的(物理)结构。3数据逻辑结构的基本类型除了集合结构类型外还有(线性结构)、(层次结构)和(网结构),其中(层次结构和网结构)是非线性结构。4线性结构中元素之间存在(一对一)关系,树型结构中元素之间存在(一对多)关系,图型结构中元素之间存在(多对多)关系。三、解答题1设数据的逻辑结构为:B=(D,R) D=1,2,3,9R=,画出这个逻辑结构的图示,并确定逻辑关系R是何种基本类型。2分别计算下列各算法的时间复杂度。(1)求和算法:int sum1(int n) int s=0,i=1; while(i=n)s+=i+; return s; (2) 求项数算法:int sum2(int n) int s=0,i=1; while(s=n)s+=i+; return i; (3) 求阶乘算法:long fact(int n) if(n=1)return(1); else return(n*fact(n-1); (4) 求解盘片数为n的汉诺塔的算法:void Hanoi(int n,char A,char B,char C) if(n=1) cout”Move disk”n”from”A”to”Cendl;else Hanoi(n-1,A,C,B);cout”Move disk”n”from”A”to”Cendl;Hanoi(n-1,B,A,C);(5) 排序算法:void Order(int A,int m,int j=0) int i,k,t;if(jm-1) for(k=j,i=j+1;im;i+)if(AiA1) max=min=A0,num=A1;else max=min=A1,num=A0;for(i=2;imax)max=Ai;else if(Ainum)min=num;num=Ai;else if(Aimin)min=Ai;void main()int M=1,8,3,2,5,9,23,11,31,41,81,12;int mm,nn;func3(M,12,mm,nn);cout最大元素=mm,次小元素=nnendl;4设计一个算法,求一元多项式的值。并分析算法的时间复杂度和空间复杂度。/*习题3.4程序代码*/#include iostream.hdouble func4(double *a,double x,int n)double s=a0,t=1;int i;for(i=1;in+1;i+)t*=x;s+=ai*t;return s;void main()int n,i;double *a,y,x;coutn;a=new doublen+1;cout输入n+1个系数:n;for(i=0;iai;coutx;y=func4(a,x,n);cout结果为:y=yendl;5已知k阶斐波那契序列的定义为:试编写求k阶斐波那契序列第m项的程序(函数形式,其中k和m为参数),并分析算法的时间复杂度和空间复杂度。/*习题3.5程序代码*/#include iostream.hvoid func5(int m,int k)int i,j,x,n;int *A=new intk;for(i=0;ik;i+)Ai=0;Ak-1=1;for(i=0;im&ik;i+)coutAi ;n=k-1;for(i=k;im;i+)x=0;n=(n+1)%k;for(j=0;jk;j+)x+=Aj;coutx ;An=x;coutendl;delete A;void main()int m,k;coutmk;func5(m,k);*1.6 上机实验复数的四则运算演示程序struct Complexdouble real;double img;Complex Add(Complex x,Complex y)Complex c=x;c.real+=y.real;c.img+=y.img;return(c);Complex Sub(Complex x,Complex y)Complex c=x;c.real-=y.real;c.img-=y.img;return(c);Complex Mult(Complex x,Complex y)Complex c;c.real=x.real*y.real-x.img*y.img;c.img=x.real*y.img+x.img*y.real;return(c);Complex Div(Complex x,Complex y)Complex c;double m;m=y.real* y.real+ y.img*y.img;c.real=(x.real*y.real+x.img*y.img)/m;c.img=(y.real*x.img-y.img*x.real)/m;return(c);void Set(Complex &c)coutc.realc.img;void Print(Complex c)cout(c.real,c.img)n;void main()Complex a=1,2,b=3,4,c;int num;while(1)cout1-输入a,b; 2-求和a+b; 3-求差a-b;n;coutnum;switch(num)case 1:coutinput complex a:;Set(a); coutinput complex b:;Set(b);break;case 2:c=Add(a,b);couta+b=;Print(c);break;case 3: c=Sub(a,b);couta-b=;Print(c);break; case 4: c=Mult(a,b);couta*b=;Print(c);break; case 5: c=Div(a,b);couta/b=;Print(c);break;case 6: couta=;Print(a); coutb=;Print(b);break;case 7:return;default:cout变量1变量2变量k;输出语句: cout表达式1表达式n;在使用输入输出语句之前,要用编译预处理命令#include iostream.h将其所在的输入输出流库的头文件包含进来。*/#include iostream.hvoid function(int A,int n,int &min,int &max)/function begin/求n个整型数据元素A0,A1,An-1中的最小元素到min最大元素到max中。 int k; if(A0A1)min=A0;max=A1; else min=A1;max=A0; for(k=2;kn;k+) if(Akmax)max=Ak;/function endvoid main_f()int AA12=12,6,8,34,67,89,90,6,4,34,11,78;int n=12,m1,m2,i;function(AA,n,m1,m2);coutmin=m1,max=m2endl;cout输入12个整数n;for(i=0;iAAi;function(AA,n,m1,m2);coutmin=m1,max=m2endl;/*min=4,max=90输入12个整数12 34 5 7 809 5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学实验室中学生学习兴趣的激发策略
- 健康教育的新方向中医养生的教育普及化研究
- 教育与办公的未来趋势科技引领下的变革
- 技术时代下的教育心理学与职业选择
- 探索未来教育的隐私保护技术与发展趋势
- 探索教育心理学在多元化教学策略中的应用
- 三标培训课件
- 90后的培训课件
- 抖音商户运营经理直播排期监管制度
- 全球铀矿资源分布现状与核能产业市场前景预测研究报告
- 2025春季学期国开电大本科《管理英语4》一平台机考真题及答案(第四套)
- DB13T 2770-2018 焊接熔深检测方法
- 网络题库财务会计知识竞赛1000题(仅供自行学习使用)
- 2023-2024学年江苏省苏州市姑苏区初一(上)道法期末试题及答案
- 仓储管理剖析
- JJF(辽) 556-2024 转速试验机校准规范
- 水电材料供货商技术方案范文
- 电信考试题目及答案
- 餐饮约束员工管理制度
- PLC基础知识课件下载
- 2023秸秆类生物质能源原料储存规范第1部分:存放
评论
0/150
提交评论