目录
1.1数据结构的研究内容
1.分析问题、提取操作对象后找出操作对象之间的关系,用数学模型加以描述,建立相应的数学方程
2.这些问题都是非数值计算的程序设计问题
3.描述非数值计算问题的数学模型不是数学方程,而是诸如表,树和图之类的具有逻辑关系的数据
4.数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科
1.2基本概念和术语
1.2.1数据、数据元素、数据项和数据对象
数据(Data)
- 是能输入计算机且能被计算机处理的各种符号的集合
- 信息的载体
- 对客观事物符号化的表示
- 能够被计算机识别、存储和加工
- 包括
- 数值型数据:整数、实数
- 非数值型数据:文字、图像、声音
数据元素(Data Element)
- 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
- 也称为元素、记录、结点或顶点
- 下面”学生表“一行为一个数据元素
- 一个数据元素可以由若干个数据项构成
数据项(Data Item)
- 构成数据元素的不可分割的最小单位
- 上面“学生表”一个元素为一个数据项
数据、数据元素、数据项三者之间的关系:
数据>数据元素>数据项
像上面“学生表”:学生表>个人记录>学号、姓名…
数据对象(Data Object)
- 是性质相同的数据元素的集合,是数据的一个子集
- 例子
- 整数数据对象的集合N={0,1,2,-1,-2…}
- 字母字符数据对象是集合C={'A','B','C'…'Z'}
数据元素与数据对象
数据元素——组成数据的基本单位
- 与数据的关系:是集合的个体
数据对象——性质相同的数据元素的集合
- 与数据的关系:集合的子集
1.2.2数据结构(Data Structure)
数据结构
- 数据元素不是孤立存在的,它们之间存在某种关系,数据元素相互之间的关系称为结构
- 是指相互之间存在一种或多种特定关系的数据元素集合
- 数据结构是带结构的数据元素的集合
数据结构包括三方面内容
- 数据元素之间的逻辑关系,称为逻辑结构
- 数据元素及其关系在计算机内存中的表示(映像),称为数据的物理结构或者数据的存储结构
- 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
数据结构的两个层次
- 逻辑关系
- 描述数据元素之间的逻辑关系
- 与数据的存储无关,独立于计算机
- 是从具体问题抽象出来的数学模型
- 物理结构(存储结构)
- 数据元素及其关系在计算机存储器中的结构(存储方式)
- 是数据结构在计算机中的表示
- 逻辑结构和存储结构的关系
- 存储结构是逻辑关系的映像与元素本身的映像
- 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
- 两者结合起来建立了数据元素之间的结构关系
逻辑结构的种类
- 划分一:线性结构和非线性结构
- 划分二:四种基本逻辑结构(集合、线性、树形、图形)
存储结构的种类
- 四种基本的存储结构
- 顺序存储结构
- 用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系是由元素的存储位置来表示
- C语言用数组来实现顺序存储结构
- 链式存储结构
- 用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
- C语言用指针来实现链式存储结构
- 顺序存储结构
- 索引存储结构
- 在存储结点信息的同时,还建立附加的索引表
- 散列存储结构
- 根据结点的关键字直接计算出该结点的存储地址
1.2.3数据类型和抽象数据类型
数据类型的作用
- 约束变量或常量的取值范围
- 约束变量或常量的操作
数据类型
- 数据类型=值的集合+值集合上的一组操作
抽象数据类型(ADT)
- 从问题抽象出数据模型(逻辑结构)
- 包括定义在数据模型的一组抽象运算(相关操作)
- 不考虑具体存储结构和具体实现算法
1.3抽象数据类型的表示和实现
将一个问题抽象为一个抽象数据类型,将抽象的变成具体的。利用C语言实现抽象数据类型
- 用已有数据类型定义描述它的存储结构
- 用函数定义描述它的操作
C语言真正实现抽象数据结构
一些伪代码,就是用typedef写的结构体和函数而已
1.4算法和算法分析
算法的描述
自然语言:英语、中文
流程图:传统流程图、NS流程图
伪代码:类语言:类C语言
程序代码:C、Java
算法与程序
- 算法是解决文体的一种方法或一个过程,考虑如何将输入转换成输出,一个问题有多个算法
- 程序是用某种程序设计语言对算法的具体实现
算法特性:一个算法必须具备以下五个重要特征
- 有穷性:有穷步后结束,有穷时间内完成
- 确定性:没有二义性
- 可行性:可执行的
- 输入:零个或多个
- 输出:一个或多个
算法设计的要求
- 正确性
- 可读性
- 健壮性
- 高效性
算法效率以下两方面来考虑
1.时间效率:指的是算法所耗费的时间
2.空间效率:指的是算法执行过程中所耗费的存储空间
(时间效率和空间效率有时候是矛盾的)
算法时间效率的度量
- 算法时间效率可以用依据算法编制的程序在计算机上执行所消耗的时间来度量
- 两种度量方法
- 事后统计
- 事前统计
事前分析
- 算法运行时间=一个简单操作所需的时间*简单操作次数
- 即算法中每条语句的执行时间之和
- 算法运行时间=(每条语句的执行次数*该语句执行一次所需要的时间)的总和(语句频度)
- 我们假设执行每条语句的所需时间均为单位时间
算出算法中每条语句的频度之和:
算法时间复杂度的渐近表示法
我们比较他们的数量级
O为数量级的符号,我们简称这个为时间复杂度
在上面的表达式
当n达到∞时,T(n)/n3 ——>2,表明n充分大时,T(n)与n3是同阶或者是同数量级的。
一般情况下,不必计算所有操作的执行次数,而只考虑算法中的基本操作执行的次数
算法时间复杂度定义
算法中基本语句重复执行的次数是问题规模n的某个函数f(n)
- 算法中执行次数最多
- n越大算法的执行时间越长
- 忽略所有低次幂项和最高次幂系数,体现出增长率的含义
- 下面就是简单的计算时间复杂度
算法时间复杂度
- 最坏时间复杂度:指在最坏的情况下,算法的时间复杂度
- 平均时间复杂度:等概率下出现的情况
- 最好时间复杂度:最好情况下
- 有两个法则
- 加法法则:
- 乘法法则:
- 加法法则: