第一章 绪论
课程背景
计算机=软件 硬件\r软件=程序 文档(软件工程的观点)\r程序=算法 数据结构(Niklaus Wirth,图灵奖获得者)\r‘数据结构’=‘计算机程序设计技巧|acute;(Kunth,图灵奖获得者)\r熟悉c语言≠写出‘好’的程序\r学习数据结构=编写高水平的程序\r《数据结构》:计算机类专业8大核心课程之一 \r注:教育部计算机教指委认定的8大核心课程:计算机语言、数据结构、离散数学、计算机网络、计算机组成原理、操作系统、数据库、软件工程\r 图灵奖:1966年设置,每年奖励1-2名杰出的计算机科学家,被誉为计算机领域的诺贝尔奖\r
基本学习方法
\r课前预习、上课认真听讲\r\r课后多做习题\r\r多上机编程(熟练掌握c、c )\r
勤学勤练
教材和参考书
教材\r数据结构(c语言版)秦锋编著 \r 中国科技大学出版社\r主要参考书\r《数据结构例题详解及课程设计指导》\r 秦锋、袁志祥等 中国科技大学出版社\r《数据结构C语言版》严蔚敏、吴伟民 \r 清华大学出版社\r《C程序设计》谭浩强 清华大学出版社
本章主要内容
什么是数据结构\r基本概念和术语\r算法
1.1 什么是数据结构
早期的计算机主要用于数值计算\r现在的计算机更多地是用于非数值数据处理(字符、表格、图像)\r对非数值数据的处理:分析数据的逻辑特征→抽象出合适的数学模型→合理地存储到计算机→设计出算法→编写出程序\r \r
请看例1~3
例1 学生信息查询系统
首先要构造学生信息表,表1-1表达出学生数据的逻辑关系,它就是一个数学模型,这张表如何构造、在计算机内如何存储将直接影响查找算法的设计以及算法的效率
表1-1
学生信息表的特点
\r每个学生的信息占据一行,所有学生的信息按学号顺序依次排列构成一张表格\r表中每个学生的信息依据学号的大小存在着一种前后关系,这就是我们所说的线性结构,现实中这类关系的数据有很多。。\r通常的操作\r插入某个学生的信息\r删除某个学生的信息\r更新某个学生的信息\r按条件查找某个学生的信息
中国象棋、国际象棋的人机大战,核心技术是人编写的对弈程序。对弈步骤和过程可以用树型结构表达出来(数学模型)
例2 人机对弈
图 1-1 井子棋对弈树
树形应用
\r\r
树型结构的特点\r\r所处理的数据之间具有层次关系,这是我们所说的树形结构,还有如:基因遗传关系等,它是一种非线性结构。\r对它的操作有:建立树形结构、存储树、访问树中的每个结点
例3 排课子系统
\r 排课系统中各门课程的先后关系可以用一个图表达出来,这个图表达了数据的逻辑关系(数学模型)\r 在制定教学计划时,需要考虑各门课程的开设顺序。有些课程需要先导课程,有些课程则不需要,而有些课程又是其他课程的先导课程。如何安排每学期的课程?\r 计算机专业课程的开设情况如下表所示:
课程先后关系的图型描述
图结构的特点
\r关系比较复杂,用例1和例2的结构表达不出来,必须用图结构描述(离散数学中的图论)\r通过实施创建图结构,存储图结构,可以对图结构中的顶点进行线性排序,从而找出每学期应该上的课程。 \r现实中,这类关系的数据非常多。如:网络规划、交通、通讯规划等,这里典型的非线性关系。
\r操作对象的关系复杂多样\r操作不再是单纯的数值计算,更多的是非数值问题求解,需要对数据(不是数值)进行分析、组织及管理。\r必须对数据进行有效的组织、存储,才能对数据进行有效的操作
返回
结论
1.2 基本概念和术语
数据 \r是对客观事物的符号表示。在计算机科学中其含义是指所有能够输入到计算机中并被计算机程序处理的符号集合\r数据元素\r是数据集合中的一个实体,是计算机程序中加工处理的基本单位(记录、结构体)
数据元素的分类
简单型数据元素\r由一个数据项组成,数据项就是数据中不可再分割的最小单位\r复杂型数据元素\r复杂型数据元素由多个数据项组成,它通常携带着一个概念的多方面信息
数据结构是相互之间存在一种或多种特定\r 关系的数据元素的集合。\r常见的数据结构\r线性结构\r树形结构\r图形结构\r数据结构主要研究\r数据的逻辑结构\r数据的存储结构\r对数据的操作(运算算法)
数据结构的定义
数据结构的定义
逻辑结构\r数据结构中所说的“关系”实际上是指数据元素之间的逻辑关系,又称此为逻辑结构 \r存储结构(物理结构)\r是指数据结构在存储器中的具体实现。与孤立的数据元素表示形式不同,数据结构中的数据元素不但要表示其本身的实际内容,还要表示清楚数据元素之间的逻辑结构\r数据运算\r对数据施加的操作。运算的定义依赖于逻辑结构,但运算的实现必依赖于存储结构(真正理解)\r
\r顺序存储结构:\r特点是借助于数据元素的相对存储位置来表示数据元素之间的逻辑结构\r链式存储结构:\r特点是借助于指示数据元素地址的指针表示数据元素之间的逻辑结构
返回
常见的存储结构
1.3 什么是算法
算法的定义\r 算法是解决某个特定问题的一种方法或一个过程,是指令的有限序列。\r 算法具有五大特性:\r 1)有穷性:\r 一个算法必须在执行有穷步之后结束\r 2)确定性:\r 算法中的每一步,必须有确切的含义,在他人理解时不会产生二义性\r
3)可行性:\r 算法中描述的每一步操作都可以通过已有的基本操作执行有限次实现\r 4)输入:\r 一个算法应该有零个或多个输入\r 5)输出:\r 一个算法应该有一个或多个输出\r\r 思考:烹调过程、程序、操作系统等是不是算法?
算法的5大特性
\r使用自然语言。用自然语言来描述算法的优点是简单且便于人们对算法的阅读,缺点是不够严谨,容易产生二义性。\r可以使用程序流程图、N-S图等算法描述工具。其特点是描述过程简洁、明了。\r用一种伪语言(类pascal、类c )\r用c、c 等标准的程序设计语言\r
如何描述算法
正确性:\r要求算法能够正确地执行预先规定的功能,并达到所期望的性能要求(有四个层次的正确)\r可读性:\r为了便于理解、测试和修改算法,算法应该具有良好的可读性(注意程序设计风格,如:空行、伸缩、注释、命名、对齐等)\r健壮性:\r当输入数据非法运行环境改变时,算法能恰当地作出反应或进行处理,不会产生慕名其妙的输出结果\r时间与空间效率:\r算法对应的程序在计算机上运行时所花费的时间及所占据空间(辅助数据所占)的度量
如何评价算法
\r硬件的速度\r例如使用486机还是使用586机。\r书写程序的语言\r实现语言的级别越高,其执行效率就越低\r编译程序所生成目标代码的质量。\r对于代码优化较好的编译程序其所生成的程序质量较高\r问题的规模\r例如,求100以内的素数与求1000以内的素数其执行的时间必然是不同的\r算法设计的好坏\r 结论:不能用实际的时间来考量、应该用指令执行的总次数。
影响算法运行所需时间的因素
求两个N阶方阵的乘积C=A*B的算法\r#define N 100\rvoid MatrixMultiply(int A [N][N],int B[N][N],int C[N][N])\r{\r① for(i=0;i 例1: \r语句1是循环控制语句,它的循环次数决定,故是n 1,但是它的循环体却只执行n次\r语句2作为语句1的循环体内的语句应执行n次,但每次执行时它本身又要执行n 1次, 故语句2的频度为n(n 1)。\r 3、4、5语句的频度可类似得到。\r 综合分析,可以确定上述算法的执行时间(即语句的频度之和)是 T(n)=2n3 3n2 2n 1;它是方阵阶数n立方的函数。 例1的时间效率分析 例1的时间效率分析 算法的执行时间是求解问题的规模n(如矩阵的阶数,线性表的长度)的函数,我们考察它的数量级量度,即它与什么简单函数f(n)是同一数量级的,即T(n)=O(f(n))。\r 对于前例,当n→∞时\r T(n)/n3 = (2n3 3n2 2n 1)/ n3→2 \r 按“O”的定义我们可知T(n)=O(n3)\r 特别说明:算法的空间效率度量定义和时间效率一样,不过一个算法的空间效率是对算法运行中所需的辅助空间的度量,操作对象所占的空间不计入空间效率的度量之中。具体可见例2\r 数量级递增排序有\r常数阶O(1)\r对数阶O(log2n)\r线性阶O(n)\r平方阶O(n2)\r立方阶O(n3)\r指数阶O(2n)\r指数阶算法的执行时间(辅助空间)随n 的增大而迅速地放大,其时间(空间)性能很差 常见的时间空间复杂度 例2 \r 本例主要说明用牺牲空间\r代价换取时间效率上的提高 矩阵Amxn中存在某个元素aij满足:aij是第i行中最小值且是第j行列中的最大值,则称该元素为矩阵A的一个鞍点,试编写算法找出A中的所有鞍点。 算法一:穷举法 \r 算法思想:对每一个元素aij进行判别\r若aij是第i行的最小数,则继续判别,看它是否也是第j列的最大数,如果成立则是鞍点。\r当aij不是第i行的最小数或者不是第j列的最大数则选择下一个元素继续。\r #define m 10\r #define n 10\r void saddle ( int A[m][n]) /*求m行n列矩阵的鞍点*/\r { int i,j,k,smin,smax;/* smin 为true时表示A[i][j]是第i行最小\r 数,smax 为true时表示A[i][j]是第j列的最大数 */\r for (i=0;i 算法的C语言描述 while ( k