「数据结构」绪论

数据结构的研究内容

  1. 无法用数学的公式或方程来描述,是一些“非数值计算”的程序设计问题
  2. 描述非数值计算问题的数学模型的数学方程,而是诸如表、树和图之类的具有逻辑关系的数据
  3. 数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科

数据结构的基本概念

数据

  1. 定义:是能输入计算机且能被计算机处理的各种符号的集合
    1. 信息的载体
    2. 是对客观事物符号化的表示
    3. 能够被计算机识别、存储和加工
  2. 分类
    1. 数值型数据:整数、实数等
    2. 非数值型数据:文字、图形、图像、声音等

数据元素

  1. 定义:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
  2. 也简称元素,或称为记录、结点或顶点
  3. 一个数据元素可由若干数据项组成

数据项

  1. 构成数据元素不可分割的最小单位

数据、数据元素、数据项三者之间的关系:数据>数据元素>数据项
例:学生表>个人记录>学号、姓名······

数据对象

  1. 定义:是数据相同的元素的集合,是数据的一个子集

数据结构的三要素

  1. 数据结构包括以下三个方面的内容
    1. 数据结构之间的逻辑关系,也称逻辑结构
    2. 数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构
    3. 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现
  2. 数据结构的两个层次
    1. 逻辑结构
      1. 描述数据之间的逻辑关系
      2. 与数据的存储无关,独立于计算机
      3. 是从具体问题抽象出来的数学模型
    2. 物理结构(存储结构)
      1. 数据元素及其关系在计算机存储器中的结构(存储方式)
      2. 是数据结构在计算机中的表示
    3. 逻辑结构与存储结构的关系
      1. 存储结构是逻辑关系的映像与元素本身的映像
      2. 逻辑结构是数据结构的抽象,存储结构是数据结构的实现
      3. 两者综合起来建立了数据元素之间的结构关系
  3. 逻辑结构的种类
    1. 划分方法一
      1. 线性结构:有且只有一个开始和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继
        1. 例如:线性表、栈、队列、串
      2. 非线性结构:一个结点可能有多个直接前驱和直接后继
        1. 例如:树、图
    2. 划分方法二——四类基本逻辑结构
      1. 集合结构:结构中的数据元素之间除了同属一个集合的关系外,无任何其他关系
      2. 线性结构:结构中的数据元素之间存在着一对一的线性关系
      3. 树形结构:结构中的数据元素之间存在着一对多的层次关系
      4. 图状结构(网状结构):结构中的数据元素之间存在着多对多的任意关系
  4. 存储结构的种类
    1. 顺序存储结构
      1. 用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示
      2. C语言中用数组来实现顺序存储结构
    2. 链式存储结构
      1. 用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
      2. C语言中用指针来实现链式存储结构
    3. 索引存储结构
      1. 在存储结点信息的同时,还建立附加的索引表
    4. 散列存储结构
      1. 根据结点的关键字之间计算出该结点的存储地址

数据类型和抽象数据类型

  1. 数据类型的作用
    1. 约束变量或常量的取值范围
    2. 约束变量或常量的操作

数据类型

  1. 定义:数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称

抽象数据类型(ADT)

  1. 定义:是指一个数学模型以及定义在此数学模型上的一组操作
    1. 由用户定义,从问题抽象出数学模型(逻辑结构)
    2. 还包括定义在数据模型上的一组抽象运算(相关操作)
    3. 不考虑计算机内的具体存储结构与运算的具体实现算法
  2. 抽象数据类型的形式定义
    1. 抽象数据类型可用(D,S,P)三元组表示
      1. D是数据对象
      2. S是D上的关系集
      3. P是对D的基本操作集
  3. 定义格式
ADT 抽象数据类型名{
	数据对象:<数据对象的定义>
	数据关系:<数据关系的定义>
	基本操作:<基本操作的定义>
} ADT 抽象数据类型名
  1. 基本操作的定义格式
    1. 参数表:赋值参数,只为操作提供输入值
      1. 引用参数以&打头,除可提供输入值外,还将返回操作结果
    2. 初始条件:描述操作执行之前数据结构和参数应满足的条件,若不满足,则操作失败,并返回相应出错信息。若初始结果为空,则省略之
    3. 操作结果:说明操作正常完成之后,数据结构的变化状况和应返回的结果
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>

举例

  1. Circle的定义
ADT Circle{
	数据对象:D={r,x,y|r,x,y均为实数}
	数据关系:R={|r是半径,是圆心坐标}
	基本操作:
	Circle(&C,r,x,y)
		操作结果:构造一个圆
	double Area(C)
		初始条件:圆已存在
		操作结果:计算面积
	double Circumference(C)
		初始条件:圆已存在
		操作结果:计算面积
} ADT Circle

抽象数据类型的表现与实现

  1. 用已有的数据类型定义描述它的存储结构
  2. 用函数定义描述它的操作

:抽象数据类型“复数”的实现

typedef struct{
	float realpart;    /*实部*/
	float imagpart;    /*虚部*/
} Complex;             /*定义复数抽象类型*/

void assign(Complex *A,float real,float imag){
	A->realpart=real;    /*实部赋值*/
	A->imagpart=imag;    /*虚部赋值*/
}

算法和算法分析

算法的基本概念

  1. 算法的定义:对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作
  2. 算法的描述
    1. 自然语言:英文、中文
    2. 流程图:传统流程图、NS流程图
    3. 伪代码:类C语言
    4. 程序代码:C、Java
  3. 算法的特性
    1. 有穷性
    2. 确定性
    3. 可行性
    4. 输入:零个或多个输入
    5. 输出:一个或多个输出
  4. 算法效率
    1. 时间效率
    2. 空间效率
    3. 时间效率和空间效率之间有时候是矛盾的

算法的时间复杂度

  • 时间效率的度量
    • 事后统计
    • 事前统计
    • 执行一种简单操作(如赋值、比较、移动等)所需的时间与算法中进行简单操作次数的乘积
    • 算法运行时间= ∑ \sum 每条语句频度*单位时间

算法的空间复杂度

  1. 算法原地工作:算法所需内存空间为常量
  2. 函数递归调用时,空间复杂度=递归调用的深度

你可能感兴趣的:(数据结构,算法)