1、1,第一章 绪论,教学内容: 1.1数据结构的原则 1.2抽象数据类型和数据结构 1.3问题、算法和程序 学习要求:理解、掌握算法的基本概念和简单的算法分析、数据和数据结构的基本概念、数据的逻辑结构和存储结构的基本概念及其性质和两种结构之间的关系。,2,引 言,二十一世纪是科学技术高速发展的信息时代,而计算机是处理信息的主要工具,因此,人们已经认识到,计算机知识已成为人类当代文化的一个重要组成部分。,3,计算机科学技术以惊人的速度向前发展,它的广泛应用已从传统的数值计算领域发展到各种非数值计算领域。在非数值计算领域里,数据处理的对象已从简单的数值发展到一般的符号,进而发展到具有一定结构的数据。
2、,4,在这里,面临的主要问题是:针对每一种新的应用领域的处理对象,如何选择合适的数据表示(结构),如何有效地组织计算机存贮,并在此基础上又如何有效地实现对象之间的“运算”关系。数据结构就是研究和解决这些问题的重要基础理论。因此,“数据结构”课程已成为计算机类专业的一门重要专业基础课。美国IEEE和ACM的教学计划CC2001把算法与数据结构列入计算机以及信息技术相关学科专业的本科必修基础课程,5,1.1 数据结构的原则,数据结构:一类数据的表示及其相关操作 学习数据结构的必要性计算机功能强大更复杂的问题更复杂的问题更大的计算量工作越复杂越偏离人们的日常经验 故:必须有一种数据结构来组织各种复杂
3、的数据。任何一种数据项集合都必须具备查询、排序、修改的功能,如果选择一个好的数据结构和算法将会对程序的运行时间产生巨大的影响。,一、为什么要学习数据结构?1、什么是程序、软件?N.沃思(Niklaus Wirth)教授提出:程序=算法+数据结构,7,程序的主要目标是存储信息和检索信息,而基础是信息表示.程序设计核心目标:()设计一种容易理解、编码和调试的算法 (软件工程原理)()设计一种能有效利用计算机资源的算法 (数据结构和算法)程序简明清晰(简洁),程序=算法+数据结构 以上公式说明了如下两个问题: (1)数据上的算法决定如何构造和组织数据(算法数据结构)。 (2)算法的选择依赖于作为基础
4、的数据结构(数据结构算法)。 软件=程序+文档(软件工程的观点),2、电子计算机的主要用途: 早期:主要用于数值计算。 后来:处理逐渐扩大到非数值计算领域(能处理多种复杂的具有一定结构关系的数据)。,(1)数值计算解决问题的一般步骤: 数学模型选择计算机语言编出程序测试最终解答。 数值计算的关键是:如何得出数学模型(方程)? 程序设计人员比较关注程序设计的技巧。,(2)非数值计算问题: 数据元素之间的相互关系一般无法用数学方程加以描述,12,例1 书目自动检索系统,书目文件,13,例2 人机对奕问题,14,例3 多叉路口交通灯管理问题,例4: 电话号码查询问题: (1)按顺序存储方式:须遍历表
5、 (2)按姓氏索引方式:建立索引 要写出好的查找算法,取决于这张表的结构及存储方式。 电话号码表的结构和存储方式决定了查找(算法)的效率。,例5: 田径赛的时间安排问题(无向图的着色问题) : 设有六个比赛项目,规定每个选手至多可参加三个项目,有五人报名参加比赛(如下表所示)设计比赛日程表,使得在尽可能短的时间内完成比赛。,田径赛的时间安排问题,跳高,跳远,标枪,铅球,200M,100M,1、任一选手所选中的项目中应该两两有边相连; 2、任一两个有边相连的顶点颜色(时间)不能相同。,(1)设用如下六个不同的代号代表不同的项目: 跳高 跳远 标枪 铅球 100米 200米 A B C D E F
6、 (2)用顶点代表比赛项目 不能同时进行比赛的项目之间连上一条边。 (3)某选手比赛的项目必定有边相连(不能同时比赛)。,解法如下:,A,E,B,F,D,C,只需安排四个单位时间进行比赛,小结:求解非数值计算的问题主要考虑的是设计出合适的数据结构及相应的算法。即:首先要考虑对相关的各种信息如何表示、组织和存储?因此,可以认为:数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科。,二、数据结构课程的形成和发展: 形成阶段:60年代初期,“数据结构”有关的内容散见于操作系统、编译原理和表处理语言等课程。1968年,“数据结构”被列入美国一些大学计算机科学系的
7、教学计划。 发展阶段:数据结构的概念不断扩充,包括了网络、集合代数论、关系等“离散数学结构”的内容。70年代后期,我国高校陆续开设该课程。,数据结构课程所处的地位:,23,1.2抽象数据类型和数据结构 一、名词解释,类型:是一组值的集合。如:整数 数据项:一条信息或其值属于某种类型的一条记录。如:学生记录里的姓名项 数据类型:一种类型和定义在该类型上的一组操作。如整型变量是整数数据类型的一个成员,而加法是定义在整数类型上的一种操作,24,抽象数据类型(ADT):指数据结构作为一个软件组件的实现 每个ADT的操作由它的输入和输出定义 每个ADT的操作细节是封装的 数据结构:是ADT的实现 与AD
8、T联系的操作都是由一个成员函数来实现 “数据结构”常指计算机内存中的数据 “文件结构”常指外存储器中数据的组织,25,二、什么是数据结构? 基本概念和术语 数据(data)所有能输入到计算机中去的描述客观事物的符号 数据元素(data element)数据的基本单位,也称节点(node)或记录(record) 数据项(data item)有独立含义的数据最小单位,也称域(field) 数据结构(data structure)数据元素和数据元素关系的集合,26,逻辑形式与物理形式,数据项包括逻辑与物理形式 逻辑形式是由ADT给出的数据项的定义 物理形式是数据结构中对数据项的实现,27,数据的逻辑
9、结构只抽象反映数据元素的逻辑关系 数据的存储(物理)结构数据的逻辑结构在计算机存储器中的实现,28,29,1536,元素2,1400,元素1,1346,元素3,元素4,1345,h,链式存储,h,30,三、数据结构的定义 定义1-数据元素之间的相互关系称为结构,带有结构的数据元素的集合称为数据结构。 定义2- 按某种逻辑关系组织起来的一批数据(或称带结构的数据元素的集合)应用计算机语言并按一定的存储表示 方式把它们存储在计算机的存储器中,并在其上定义了一个运算的集合。,32,数据结构定义: 是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科,数据结构的三个方面的
10、含义: 逻辑结构- 数据元素间抽象化的相互关系(简称为数据结构)。 与数据的存储无关,独立于计算机,它是从具体问题抽象出来的数学模型。 存储结构(物理结构)- 数据元素及其关系在计算机存储器中的存储方式。 是逻辑结构用计算机语言的实现,它依赖于计算机语言。 运算(算法),(1)逻辑结构- 线性结构-有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个后继。 例如:线性表、栈、队列、串 非线性结构-一个结点可能有多个直接前趋和直接后继。 例如:树、图、多维数组、广义表等。,(2)存储结构 存储结构两方面的内容: 数据元素自身值的表示(数据域) 该结点与其它结点关系的域(链域)
11、 四种基本的存储方法: 顺序存储方法(结构) 链接存储方法(链式存储结构) 索引存储方法 散列存储方法同一种逻辑结构可采用不同的存储方法(以上四种之一或组合),这主要考虑的是运算方便及算法的时空要求。,逻辑结构存储结构小结: (1)数据的逻辑结构、存储结构和数据的运算(算法)构成了数据结构三个方面的含义。 (2)程序设计的实质是对实际问题选择一个好的数据结构,加之设计一个好的算法。而好的算法在很大程度上取决于描述实际问题的数据结构。,效率:如果能在所要求的资源限制(resource constraint)内将问题解决好,则称该算法是有效率(efficient)的。 代价:解决一个问题所耗费的关
12、键资源(如时间、空间)。,代价与效益,每一个问题都有可利用空间和时间的限制 只有对问题特性进行仔细分析后才能得到解决问题的最好的数据结构 银行例子: 开户:几分钟 交易:几秒钟 销户:月末(更长时间),39,代价与效益,每一个数据结构都与代价与效益联系在一起 很难说一种算法在所有情况下都比其他算法好 一个数据结构必须要求: 空间存储数据项 时间执行单个操作 程序设计工作,40,学习的目的,对每个数据结构加强对存在代价与效 益的观念 掌握常用的数据结构将常用的数据结构放入你的工具包 理解怎样去衡量一个数据结构或程序的代价评价标准,41,1.3 问题、算法和程序,问题:需要完成的任务 一组输入必有
13、一组相应的输出 问题的定义应包括对任何行为可行方案所需资源的限制,42,问题,问题 函数 函数是输入(定义域domain)和输出(值域range)的一种映射关系 函数的输入可是一个值或一个实例 这些值组成的输入称为函数的参数 对于一个给定的输入,函数每次计算所得的输出应必然相同,43,算法和程序,算法:解决一个问题的方法或过程 处方 对于一个问题的算法给定一输入,必然会转化为一个输出 输入输出的映射 一个问题可用多种算法来解决 程序:用某种程序设计语言对一种算法的实现,算法的概念和描述: 一、算法的概念:所谓算法(Algorithm)是描述计算机解决给定问题的操作过程(解题方法),即为解决某一
14、特定问题而由若干条指令组成的有穷序列。,1.算法-求解一个特定任务的指令的有限序列。例 求a0an-1中n个数的平均值(假定n0)。float average(float a ,int n) int i;float s=0.0; /累加器赋初值for (i=0;in;i+)s=s+ai; /ai累加到s中s=s/n; /计算平均值printf(“ave=%f”,s); /输出return(s); /返回 其中:a,n为输入量;s为输出量。,2.算法的5个特征,(1)有穷性:在有限步(或有限时间)之后算法终止。例 i=0;s=0;while (i=10)s+=i;i+;/使i趋于10,(2)确定
15、性:无二义性。例 x=5;y=10; z=x+y;printf(“%d,%d,%d”,x,y,z); x+y 解释为:x + (+y)?还是 (x+)+ y? 例 int x=0; 表达式:x+ +x+ 的值,(3)可行性:可以在计算机上实现。 for( i=1,s=0;i1000000000000;+i)s+;? (4)输入:有0或多个输入量。 (5)输出:至少有一个输出量。,3.算法设计要求(1)正确性a.无语法错误;b.对n组输入产生正确结果;c.对特殊输入产生正确结果;d.对所有输入产生正确结果。(2)可读性:“算法主要是为了人的阅读与交流”。(3)健壮性 scanf(“%d”,&x)
16、; y/=x;?(4)高效与低存储量,50,二、算法的描述和实现 算法的描述工具:,(1) 自然语言; (2) 程序设计语言; (3) 流程图(框图); (4) 伪语言;是一种包括高级程序设计语言的三种基本结构(顺序、选择、循环)和自然语言成分的“面向读者”的语言。,51,如 like C+或like C介于伪码语言和程序设计语言之间的一种表示形式。保留了C+或语言的精华;不拘泥与C+或C语言的语法细节;同时在C中也添加了一些C+的成分。特点:便于理解、阅读;能方便的转换成C+或C语言。目的:便于简明扼要的描述算法;突出算法的思路。,算法描述举例,问题:设一维数组a0n-1中已有n个整数, 其
17、中n为个常数,试设计算法:求a中的最大值。算法基本思想:1.maxai=a0;2.i=1;3.若imaxai,则 maxai=ai;3.2 i+;3.3 转34.maxai为最大值。,函数(算法),/求数组a中n个元素的最大值 int a_maxint(int a,int n) int j,maxai=a0; /最大值的初值for (j=1;jmaxai) /比较元素大小maxaiaj; /新的最大值 printf(“maxai%dn“,maxai); /输出 return maxai; ,54,例 运用伪码编写:顺序查找某一特定值的算法。 Procedure S_Search(data,ke
18、yvalue) 设I为1;while( ) if(欲查找值等于dataI)printf(“找到数据”);else if(I数据个数)printf(“未能找到数据”);I+; ,三、 算法的简单分析 1 算法的评价准则(首先,算法必须是“正确”的) (1)执行算法所耗费的时间(效率 要高)。 (2)执行算法所耗费的存储空间(主要考虑辅存空间;低存储要求)。 (3)算法的可读性、易维护性要好(易于理解,易于编码,易于调试)。,56,算法效率用依据该算法编制的程序在计算机上执行所消耗的时间来度量,A.事后统计利用计算机内记时功能,不同算法的程序可以用一组或多组相同的统计数据区分 缺点:必须先运行依据
19、算法编制的程序所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣,57,B.事前分析估计一个高级语言程序在计算机上运行所消耗的时间取决于:依据的算法选用何种策略问题的规模程序语言编译程序产生机器代码质量机器执行指令速度同一个算法用不同的语言、不同的编译程序、在不同的计算机上运行,效率均不同,所以使用绝对时间单位衡量算法效率不合适,58,时间复杂度:基本操作重复执行的次数的阶数 T(n)=o(f(n) 空间复杂度:s(n)=o(f(n),例15:N N矩阵相乘 for(i=1;i=n;i+)/n+1for(j=1;j=n;j+)/n(n+1)cij=0;/n*n for(k=1;k=n
20、;k+)/n*n(n+1)cij=cij+aik*bkj;/n*n*n,2 算法的简单分析: 1、程序正确性的四个层面: (1)不含语法错误 (2)程序对于n组输入数据能够得出满足规格说明要求的结果。 (3)程序对于精心选择的典型、边界性的n组输入数据能得出满足规格说明要求的结果。 (4)程序对于一切合适的输入数据都能得出满足规格说明要求的结果(穷举)。,2、算法效率的度量 (1)程序运行所耗费的时间(由下列因素决定):算法所选用的策略问题的规模书写程序所采用的语言编译程序所产生的机器代码的质量机器执行指令的速度 一个算法耗费的时间=算法中每条语句的执行时间之和。 若不考虑机器硬、软件因素,可
21、以认为算法“运行工作量”的大小是问题规模的函数。,算法的时间复杂度-,算法(或程序)中基本操作(或语句)重复执行的次数的总和。设n为求解的问题的规模,基本操作(或语句)执行次数 总和称为语句频度,记作f(n);时间复杂度记作T(n),有:T(n)=O(f(n) 例 int s; scanf(“%d”,&s);s+;printf(“%d”,s);其中:语句频度为:f(n)=f(1)=3时间复杂度为:T(n)=O(f(n)=O(3)=O(1)O(1)称成为常量阶/常量数量级,例 分析下面的算法,void sum(int a,int n) int s=0,i; / 1次for(i=0;in;i+)
22、/ n次(严格为2*(n+1)次) s=s+ai; / n次printf(“%d”,s); / 1次其中:语句频度为:f(n)=1+n+n+1时间复杂度为:T(n)=O(f(n)=O(2n+2)=O(n)O(n)称成为线性阶/线性数量级,例 分析下面的算法,1. void sum(int m,int n)2. int i,j,s=0; / 1次 3. for(i=1;i=m;i+) / m次 4. for(j=1;j=n;j+) / m*n次5. s+; / m*n次6. printf(“%d”,s); / m次7. 8. 其中:f(m,n)=1+m+2*m*n+m=2mn+2m+1当m=n时
23、,f(n)=2n2+2n+1T(n)=O(f(n)=O(2n2+2n+1)=O(n2)O(n2 ) 称成为平方阶/平方数量级,例 分析下面的算法;当n=5,指出输出结果,1. void sum(int n)2. int i,j,s=0; / 1次 3. for(i=1;i=n;i+) / n次4. for(j=1;j=i;j+) / ?次5. s+; / ?次6. printf(“%d”,s); / n次7. 8. 其中:第4行的次数为 1+2+.+n=n(1+n)/2第5行的次数为 1+2+.+n=n(1+n)/2 f(n)=1+n+n(n+1)+n=n2+3n+1T(n)=O(f(n)=O
24、(n2)O(n2)称成为平方阶/平方数量级,65,例 求解:S=1!+2!+n! 算法1:long sum_of_fac(int n)long s=0,t,i,j;for(i=1;i=n;i+) /n次t=1; /n次for(j=1;j=i;j+) /n*(n+1)/2次t*=i; /n*(n+1)/2次s+=t; /n次return (s); /1次 f(n)=n+n+n*(n+1)/2+ n*(n+1)/2+n+1=n2+4n+1 T(n)=O(f(n)=O(n2),求i!,66,例 (续): 求解:S=1!+2!+n! 算法2:long sum_of_fac(int n)long s=0
25、,t,i;t=1; /1次for(i=1;i=n;i+) /n次t*=i; /n次s+=t; /n次return (s); /1次 f(n)=1+n+n+n+n+1=3n+2 T(n)=O(f(n)=O(n),求i!,(2)问题的规模(size)-算法求解问题的输入量(或初始数据量)。 (3)不考虑机器软硬件环境时算法的时间耗费: 设:执行每条语句所需时间为单位时间,则: 一个算法耗费的时间=所有语句的频度之和。 时间复杂度T(n)- 即:时间耗费,它是算法求解问题n的函数。 渐近时间复杂度- 即当问题的规模n时的时间复杂度T(n)的数量级(阶),记作:T(n)=O(f(n) 评价一个算法的时
26、间性能,主要标准是算法的渐近时间复杂度(Time Complexity),68,例 x=1; for (I=1;I=n;I+)for (j=1;j=n;j+)for (k=1;k=n;k+)x+; 分析:从内层向外层循环看执行次数,为n3+1,则T(n)= O(n3+1),取T(n)数量级,得最后结果为: T(n)= O(n3),69,例 x=1; for (I=1;I=n;I+)for (j=1;j=I;j+)for (k=1;k=j;k+)x+; 由于内循环的执行次数虽与规模n无直接关系,但与外循环的变量取值有关。因此从内层向外层循环分析执行次数。,70,71,72,73,74,即: T(
27、n)=n(n+1)(2n+1)/6+n(n+1)/2/2 所以: T(n)=O(n3/6+低次项) 取T(n)的数量级阶,得最后结果为: T(n)=O(n3),75,常见函数的时间复杂度按数量递增排列及增长率常数阶O(1) 对数阶O(log2n) 线性阶O(n) 线性对数阶O(nlog2n) 平方阶O(n2) 立方阶O(n3) k次方阶O(nk) 指数阶O(2n),76,Growth Rate Graph,77,换一台更快的计算机,还是换一种更快的算法?,结论:换一种更快的算法,而不要换一台更快的计算机,78,本章总结数据、数据结构等基本概念 数据结构的三个方面的内容 线性和非线性结构的逻辑特
28、征 数据存储的四种基本方法 算法、算法的时间复杂度及其分析的简易方法,教材及主要参考书,唐宁九,游洪跃,朱宏,杨秋辉编著,数据结构与算法设计,四川大学出版社 A.V.Aho,J.E.Hopcroft and J.D.Ullman,Data Structures and Algorithms,by AddisonWesley Publishing Company,Inc.,1983 美Cliford A. Shaffer著,A Practical Introduction to Data Structures and Algorithm Analysis(数据结构与算法设计C+版),电子工业出版社 殷人昆,陶永雷,谢若阳,盛绚华编著数据结构(用面向对象方法与C+描述)清华大学出版社,Knuth Donald E. The Art of Computer Programming AddisonWesley Publishing Company,Inc.,1973 Volume 1: Fundamental Algorithms, Volume 2: Seminumerical Algorithms, Volume 3: Sorting and Searching.,81,Thank you very much!,