190 likes | 378 Views
数 据 结 构. 演讲稿. 教学安排: 总学时数: 72 学时. 严蔚敏,吴伟民,数据结构( C 语言版),清华大学出版社,2003年7月再版; 中国计算机学会教育委员会,全国高等院校计算机教育研究会,计算机学科教学计划 2000 ,内部资料; 傅清祥,王晓东,算法与数据结构,电子工业出版社, 2001 ; 吴文虎,王建德,实用算法的分析与程序设计,电子工业出版社, 1998 ; William F . , William T . , Data Structures with C++ , Prentice Hall , Inc . , 1996 ;
E N D
数 据 结 构 演讲稿
教学安排: 总学时数:72学时 • 严蔚敏,吴伟民,数据结构(C语言版),清华大学出版社,2003年7月再版; • 中国计算机学会教育委员会,全国高等院校计算机教育研究会,计算机学科教学计划2000,内部资料; • 傅清祥,王晓东,算法与数据结构,电子工业出版社,2001; • 吴文虎,王建德,实用算法的分析与程序设计,电子工业出版社,1998; • William F.,William T.,Data Structures with C++,Prentice Hall,Inc.,1996; • Clifford A.S.,Data Structures and Algorithm Analysis,Prentice Hall,Inc.,1997。 教学对象: • 计算机科学与工程专业的学生; • 计算机软件专业的学生; • 计算机辅修专业的学生; • 电类联合班的学生; • 网络教育学院计算机专业的学生; • 各类成人教育及自学考试人员; • 工程技术人员。 主要参考资料:
课程内容: • 第一章 绪论 • 第二章 线性表 • 第三章 栈和队列 • 第四章 串 • 第五章 数组和广义表 • 第六章 树和二叉树 • 第七章 图 • 第八章 动态存储管理 • 第九章 查找 • 第十章 内部排序 • 第十一章 外部排序 • 第十二章 文件
第一章 绪论 £1.1 背景 自第一台计算机1946年在美国问世以来,计算机的应用范围大大地扩展,已深入到人类社会的各个领域。与此相应的,计算机加工处理的对象也从纯粹的数值发展到字符、图像、声音等各种具有一定结构的复杂的数据。例如,从数值计算到卫星发射等等。因此要设计出一个好的程序(程序执行时间最短,占内存空间最小),必须研究数据的特性以及数据之间存在的关系。这就形成了《数据结构与算法》这门课程。 “数据结构与算法”作为一门独立的课程,在国外是从1968年开始,而国内是在80年代初才开始。它不仅是计算机科学中的一门专业基础课,而且也是设计和实现编译程序、操作系统、数据库系统及其它系统程序和大型应用程序的重要基础。在计算机专业的教学计划中,它是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。 值得注意的是,“数据结构与算法” 的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型的观点来讨论数据结构,已成为一种新的趋势,越来越被人们所重视。
£1.2 什么是数据结构 例一:图书馆的书目检索系统自动化问题。 在图书馆内有各种名目的卡片:有按书名编排的,有按作者编排的,还有按分类编排的,等等。若利用计算机实现自动检索,则计算机处理的对象便是这些目录卡片上的书目信息。列在一张卡片上的一本书的书目信息可由登录号、书名、作者名、分类号、出版单位和出版时间等若干项组成,每一本书都有唯一的一个登录号,但不同的书目之间可能有相同的书名,或者有相同的作者,或者有相同的分类号。由此,在书目自动检索系统中可以建立一张按登录顺序排列的书目文件和3张分别按书名、作者名和分类号顺序排列的索引表,如下图所示。 数学模型—线性表
例二:计算机和人对弈问题。数学模型-树。 (课本P2) 例三:多叉路口交通灯的管理问题。数学模型-图。 (课本P3) 由上述例子可见,描述这类非数值计算问题的数学模型不再是数学方程,而是诸如表、树和图之类的数据结构。因此,简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科。
£1.3 基本概念和术语 1)数据:是对客观事物的符号表示,在计算机科学中是 指所有能输入到计算机中并被计算机程序处理的符号的总称。 例如,整数、实数、字符串、图像和声音等。 2)数据项:是数据不可分割的最小单位。 3)数据元素:是数据的基本单位。有时,一个数据元素可由若干个数据项组成。 例如,例一中一本书的书目信息为一个数据元素,而书目信息中的每一项(如书名、作者名等)为一个数据项。 4)数据对象:是性质相同的数据元素的集合,是数据的一个子集。 例如,字母字符数据对象集合C={‘A’, ‘B’, … ,’Z’}。
5)数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。5)数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 其形式定义为:(一个二元组) Data_Structure = (D, S) 其中:D是数据元素的有限集,S是D上关系的有限集。 根据数据元素之间关系的不同特性通常有下列 4 类基本结构: ①集合:结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系。 ②线性结构:结构中的数据元素之间存在一个对一个的关系。 ③树形结构:结构中的数据元素之间存在一个对多个的关系。 ④图状结构或网状结构:结构中的数据元素之间存在多个对多个的关系。 集合 线性 树 图 图1.2 4类基本结构关系图
6)数据的物理结构(又称存储结构):是数据结构在计算机6)数据的物理结构(又称存储结构):是数据结构在计算机 中的表示。它包括数据元素的表示和关系的表示。 数据元素之间的关系在计算机中又有两种不同的表示方法: ①顺序映像 特点:借助元素在存储器中的相对位置来表示数据 元素之间的逻辑关系。 ②非顺序映像 特点:借助指示元素存储地址的指针表示数据元素之间的逻辑关系。 例如:假设用两个字长的位串表示一个实数,则可以用地址相邻的4个字长的位串表示一个复数,如图1.3(a)为表示复数 z1 = 3.0 - 2.3 I 和 z2 = - 0.7 + 4.8 I 的顺序存储结构。图1.3(b)为表示复数 z1 的链式存储结构,其中实部和虚部之间的关系用值为 “0415” 的指针来表示(0415是虚部的存储地址)。 … 3.0 … -2.3 … 0415 0611 0613 0300 0302 0632 0634 -2.3 … 3.0 -0.7 0415 … 4.8 … (a)顺序存储结构 (b)链式存储结构 图1.3 复数存储结构示意图
7)数据类型:是一个值的集合和定义在这个值集上的一组7)数据类型:是一个值的集合和定义在这个值集上的一组 操作的总称。 按“值”的不同特性,在高级程序语言中可分为: ①原子类型:其值不可分解。 例如,C语音中的基本类型(整型、实型、字符型 和枚举类型)、指针类型和空类型。 ②结构类型:其值是由若干成分按某种结构组成的,故可分解,并且其 成分可以是非结构的,也可以是结构的。 例如,数组的值由若干分量组成,每个分量可以是整数,也可以是数 组等。 8)抽象数据类型(ADT):是指一个数学模型以及定义在该模型上的一组操作。 抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部 如表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不 变,都不影响其外部的使用。 其形式定义为:(一个三元组) (D, S, P) 其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
按“值”的不同特性,可细分为: ①原子类型:属原子类型的变量的值是不可分解的。 ②固定聚合类型:属该类型的变量,其值由确定数目的 成分按某种结构组成。 例如,复数是由两个实数依确定的次序关系构成。 ③可变聚合类型:和固定聚合类型相比较,构成可变聚 合类型“值”的成分数目不确定。 例如,可定义一个“有序整数序列”的抽象数据类型,其中序列的长度是可变的。 我们采用以下格式定义抽象数据类型: ADT 抽象数据类型名{ 数据对象:<数据对象的定义> 数据关系:<数据关系的定义> 基本操作:<基本操作的定义> }ADT 抽象数据类型名 其中,数据对象和数据关系的定义用伪码描述,基本操作的定义格式为: 基本操作名(参数表) 初始条件:<初始条件描述> 操作结果:<操作结果描述> 9)多形数据类型:是指其值的成分不确定的数据类型。
£1.4 抽象数据类型的表示与实现 1)预定义常量和类型: //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status 是函数的类型,其值是函数结果状态代码 typedef int Status; 2)数据结构的表示(存储结构)用类型定义(typedef)描述。数据元素类型约定为ElemType,由用户在使用该数据类型时自行定义。 3)基本操作的算法都用以下形式的函数描述: 函数类型 函数名(函数参数表){ //算法说明 语句序列 } //函数名 除了函数的参数需要说明类型外,算法中使用的辅助变量可以不作变量说明,必要时对其作用给予注释。
4)赋值语句: 简单赋值 变量名=表达式; 串联赋值 变量名1=变量名2=…=变量名k=表达式; 成组赋值 (变量名1,… ,变量名k)=(表达式1,… ,表达式k) 结构名=结构名; 结构名=(值1,… ,值k); 变量名[ ] =表达式; 变量名[起始下标…终止下标]=变量名[起始下标…终止下标]; 交换赋值 变量名 变量名; 条件赋值 变量名=条件表达式?表达式T:表达式F; 5)选择语句: 条件语句1 if(表达式)语句; 条件语句2 if(表达式)语句; else语句; 开关语句1 switch(表达式){ case值1:语句序列1;break; … case值n:语句序列n;break; default:语句序列n+1; } 开关语句2 switch{ case条件1:语句序列1;break; … case条件n:语句序列n:break; default:语句序列n+1; }
6)循环语句: for语句 for(赋初值表达式序列;条件; 修改表达式序列)语句; while语句 while(条件)语句; do-while语句 do{ 语句序列; }while(条件); 7)结束语句: 函数结束语句 return表达式; return; case结束语句 break; 异常结束语句 exit(异常代码); 8)输入和输出语句: 输入语句 scanf([格式串],变量1,…,变量n); 输出语句 printf([格式串],表达式1,…,表达式n); 9)注释 单行注释 // 文字序列
10)基本函数: 求最大值 max(表达式1,…,表达式n) 求最小值 min(表达式1,…,表达式n) 求绝对值 abs(表达式) 求不足整数值 floor(表达式) 求进位整数值 ceil(表达式) 判定文件结束 eof (文件变量)或eof 判定行结束 eoln(文件变量)或eoln 11)逻辑运算约定 与运算 &&:对于A && B,当A的值为 0 时,不再对B求值。 或运算 | |:对于A | | B,当 A 的值为非 0 时,不再对B求值。
£1.5 算法和算法分析 £1.5.1 算法的描述 算法(algorithm):是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 一个算法还具有以下 5 个重要特性: 1)有穷性 一个算法必须总是(对任何合法的输入值)在执行有穷步之后 结束,且每一步都可在有穷时间内完成。 2)确定性 算法中每一条指令必须有确切的含义,读者理解时不会产生二 义性。并且,在任何条件下,算法只有唯一的一条执行路径, 即对于相同的输入只能得出相同的输出。 3)可行性 一个算法是可行的,即算法中描述的操作都是可以通过已经实 现的基本运算执行有限次来实现的。 4)输入 一个算法有零个或多个的输入,这些输入取自于某个特定的对 象的集合。 5)输出 一个算法有一个或多个的输出,这些输出是同输入有着某些特 定关系的量。
£1.5.2 算法设计的要求 1)正确性(correctness) 大体可分为4个层次: ①程序不含语法错误; ②程序对于几组输入数据能够得出满足规格说明要求的结果; ③程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出 满足规格说明要求的结果。 ④程序对于一切合法的输入数据都能产生满足规格说明要求的结果。 2)可读性(readability) 算法重要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对 算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调试和修改。 3)健壮性(robustness) 当输入数据非法时,算法也能适当的做出反应或进行处理,而不会产生莫名其妙的输出结果。 4)效率与低存储量需求 效率:指算法执行的时间。 存储量需求:指算法执行过程中所需要的最大存储空间。 高效率与低存储量需求这两者都与问题的规模有关。
£1.5.3 算法效率的度量 频度和时间复杂度是衡量一个算法时间性能的指标。 频度(frequency count):一个语句在算法中重复执行的次数。 一般情况下,算法中基本操作重复执行的次数是问题规模 n 的某个函数f(n),算法的时间量度记作: T(n)=O(f(n)) 它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称做算法的渐进时间复杂度(asymptotic time complexity),简称时间复杂度。 例如,在两个N ×N矩阵相乘的算法中,已知算法如下: for (i=1; i<=n; ++i) n+1 for (j=1; j<=n; ++j){ n × (n+1) c[i][j]=0; n × n for(k=1; k<=n; ++k) n ×n × (n+1) c[i][j]+ = a[i][k] * b[k][j]; n × n × n } T(n) = n+1 + n × (n+1)+n × n + n × n × (n+1)+ n × n × n = 2n3 + 3 n2 + 2n + 1 由T(n)可以看出,当 n →∞时, T(n) ∝ 2n3 ∝ n3 . 即该算法执行时间的数量级是 n3。简记为O(n3)。
£1.5.4 算法的存储空间需求 空间复杂度(space complexity):算法所需存储空间的量度,记作: S(n)=O(f(n)) 其中 n 为问题的规模(或大小)。