数据结构——第一章 绪论

数据结构——第一章 绪论

  • 数据结构的研究内容
  • 基本概念和术语
    • 数据
    • 数据元素和数据项
    • 数据对象
    • 数据结构
      • 数据结构的两个层次
        • 逻辑结构
        • 存储结构
    • 数据类型和抽象数据类型
      • 数据类型
      • 抽象数据类型
  • 算法和算法分析
    • 算法
    • 算法分析
      • 算法的时间效率
      • 空间效率——空间复杂度
  • 小结

数据结构的研究内容

数据结构——第一章 绪论_第1张图片

通常,用计算机解题的的步骤:

  • 具体问题抽象为数学模型
  • 设计算法
  • 编程、调试、运行

其中抽象为数学模型的实质为分析问题,提取操作对象,找出操作对象之间的关系,用数学语言描述操作对象之间的关系即为数据结构

最早,计算机主要用于数值计算,其特点为数据元素间的关系简单,计算复杂。

随着计算机应用领域的扩展,计算机被越来越多的应用于非数值计算。非数值计算的数学模型不再是数学方程,而是具有逻辑关系的数据。

  • 例1:学生学籍管理系统 操作对象:每位学生的信息(学号、姓名、性别、籍贯等),即若干行数据记录 操作算法:查询、插入、修改、删除等 操作对象之间的关系:线性关系

  • 例2:人机对弈问题
    操作对象:各种棋局状态,即描述棋局的格局信息 操作算法:走棋,即选择一种策略使棋局状态发生变化 操作对象之间的关系:树

  • 例3:地图导航——求最短路径 操作对象:各地点及路的信息 操作算法:设置信号灯,求出各个可同时通行的路的集合 操作对象之间关系:图

综上所述,数据结构是一门研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系和操作的学科

基本概念和术语

数据结构——第一章 绪论_第2张图片

数据

  1. 数据的概念:
    数据是能输入计算机且能被计算机处理的各种符号的集合。数据是信息的载体,是对客观事物符号化的表示,能够被计算机识别、储存和加工。

  2. 数据包括:数值型数据和非数值型数据。

数据元素和数据项

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

数据、数据元素、数据项三者之间的关系:
数据由数据元素组成,数据元素由数据项组成。
例:学生表由个人记录组成,个人记录由学号、姓名等组成。

数据对象

  1. 数据对象是性质相同的数据元素的集合,是数据的一个子集。
    例:整数数据对象是集合N={0,±1,±2,……}

  2. 数据元素与数据对象的关系
    数据元素失足成数据的基本单位,是集合的个体
    数据对象是性质相同的数据元素的集合,是集合的子集

数据结构

  1. 数据元素不是孤立存在的,它们之间存在着某种关系,数据元素互相之间的关系成为结构
  2. 数据结构是指互相之间存在一种或多种特定关系的数据元素集合。或者说,数据结构是带结构的数据元素的集合。
  3. 数据结构包括一下三个方面的内容:
    1)数据元素之间的逻辑关系也称为逻辑结构
    2)数据元素及其关系在计算机内存中的表示/映像,称为数据的物理结构/存储结构
    3)数据的运算和实现,即对数据元素可以施加操作以及这些操作在相应的存储结构上的实现。

数据结构的两个层次

  1. 逻辑结构:
    1)描述数据元素之间的逻辑关系。
    2)与数据的存储无关,独立与计算机
    3)是从具体问题抽象出来的数学模型。

  2. 物理结构:
    1)数据元素及其关系在计算机存储器中的结构(存储方式)。
    2)是数据结构在计算机中的表示。

  3. 逻辑结构与存储结构的关系
    1)存储结构是逻辑关系的映像与元素本身的映像。
    2)逻辑结构是数据结构的抽象,存储结构是数据结构的实现。
    3) 二者综合起来建立了数据元素之间的结构关系。

逻辑结构

  1. 逻辑结构的种类
    1)划分方法一:
    ①线性结构(有且即有一个开始和一个终端结点,并且所有节点最多只有一个直接前驱和一个直接后继)
    ②非线性结构
    2)划分方式二:
    集合关系:结构中的数据元素之间除了同属于一个集合的关系外,无任何其他关系。
    线性结构:结构中的数据元素之间存在着一对一的线性关系。
    树形结构:结构中的数据元素之间存在着一对多的层次关系。
    图(网)状结构:结构中的数据元素之间存在着多对多的任意关系。

存储结构

  1. 四种基本的存储结构:
    1)顺序存储结构
    ①用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系有元素的存储位置来表示。
    ②C语言中用数组来实现顺序存储结构。
    2)链式存储结构
    ①用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系有元素的指针来表示。
    ②C语言中用指针来实现链式存储结构。(指针即地址)
    3)索引存储结构
    4)散列存储结构

数据类型和抽象数据类型

数据类型

  1. 在使用高级程序设计语言编写程序时必须对程序中出现的每个变量、常量或表达式,明确说明它们所属的数据类型。高级语言中的数据类型规定了在程序执行期间变量和表达的所有可能的取值范围,以及在这些数值范围上所允许进行的操作
  2. 定义:数据类型是一组性质相同的值的集合以及定义与这个值集合上的 一组操作的总称。
    数据类型=值的集合+值集合上的一组操作

抽象数据类型

  1. 是指一个数学模型以及定义在此数学模型上的一组操作
  2. 由用户定义,从问题抽象出的数学模型(逻辑结构)
  3. 定义在数据模型上的一组抽象运算(相关操作)
  4. 不考虑计算机内的具体存储结构与运算的具体实现算法。
  5. 抽象数据类型的形式定义
    抽象数据类型可用(D,S,P)三元组表示
    D:数据对象
    S:D上的关系集
    P:对D的基本操作集

算法和算法分析

算法

  1. 算法的定义:对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。
    总而言之,算法就是解决问题的方法和步骤

  2. 算法的描述:自然语言、流程图、伪代码、程序代码

  3. 算法与程序:
    -算法是解决问题的一种方法或一个过程,一个问题可以有多个算法。
    -程序是用某种程序设计语言对算法的具体实现。
    程序=数据结构+算法

  4. 算法的特性
    1)有穷性(有穷步、有穷时间)
    2)确定性:每一条指令必须有确切的含义,没有二义性,即对于相同的输入只能得到相同的输出。
    3)可行性
    4)有零个或多个输入
    5)有一个或多个输出

  5. 算法设计的要求
    1)正确性:对于精心挑选的、典型的、苛刻且带有刁难性的几组输入数据能够得出满足要求的结果。
    2)可读性
    3)强壮性(鲁棒性):当输入非法数据时,能做出反应或进行相应处理,而不是产生莫名其妙的输出结果。
    4)高效性

算法分析

一个好的算法首先要具备正确性,然后是健壮性,可读性,在几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来判断不同算法的优劣程度。
算法效率从以下两个方面来考虑:
1.时间效率:指的是算法所耗费的时间。
2.空间效率:算法执行过程中所耗费的存储空间。

算法的时间效率

一个算法的运行时间是指一个算法在计算机上运行所耗费的时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需要的时间与算法中进行的简单操作次数乘积。
算法运行时间=一个简单操作所需的时间×简单操作次数
也即算法中每条语句的执行时间之和
算法运行时间=∑每条语句的执行次数×该语句执行一次所需时间
其中,每条语句的执行次数又称为语句频度
算法运行时间=∑每条语句频度×该语句执行一次所需时间
假设该语句执行一次所需时间为单位时间,就可以脱离硬件考虑算法的时间效率。因此,我们把算法所耗费的时间定义为该算法中每条语句的频度之和。
例1:两个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=0;k<n;K++)       //执行n×n×(n+1)次
            c[i][j]=c[i][j]+a[i][k]*b[k][j];//执行n×n×n次
    }

由上述得该算法的时间消耗T(n)=2n³+3n²+2n+1

为了便于比较不同算法的时间效率,我们仅比较数量级。
若有某个辅助函数f(n),使得当n趋近于近无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)时T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度O是数量级的符号),简称时间复杂度
由例1知,该算法的时间消耗T(n)=2n³+3n²+2n+1,当n→∞时,T(n)/n³→2,这表示n充分大时,T(n)与n³是同阶或同数量级,则T(n)=O(n³)。
[注]:若f(m)是n次多项式,则T(m)=O(mⁿ),即忽略所有低次幂项和最高次幂系数。

[总结]分析算法时间复杂度的基本方法
1.找出语句频度最大的那条语句作为基本语句
2.计算基本语句的频度得到问题规模n的某个函数f(n)
3.取其数量级用符号“O”表示。

时间复杂度分为最坏时间复杂度、平均时间复杂度以及最好时间复杂度,一般情况下,我们考虑最坏时间复杂度及平均时间复杂度。

空间效率——空间复杂度

空间复杂度是算法所需存储空间的度量,记作S(n)=O(f(n)),其中n为问题的规模或大小。
例1:将一维数组a中的n个数逆序存放到原数组总
算法1

for(i=0;i<n/2;i++){
    t=a[i];
    a[i]=a[n-i-1];
    a[n-i-1]=t;
}

该算法从首尾依次交换,一共交换n/2次,需要辅助空间为1,S(n)=O(1)即为原地工作。
算法2

for(i=0;i<n;i++)
    b[i]=a[n-i-1];
for(i=0;i<n;i++)
    a[i]=b[i];

该算法另寻一数组逆制后再放置于原数组,需要辅助空间为n,S(n)=O(n)。

小结

本章介绍了数据结构的基本概念和术语,以及算法和算法时间复杂度的分析方法。主要内容如下。
(1)数据结构是一门研究非数值计算程序设计中操作对象,以及这些对象之间的关系和操作
的学科。
(2)数据结构包括两个方面的内容:数据的逻辑结构和存储结构。同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。
①逻辑结构是从具体问题抽象出来的数学模型,从逻辑关系上描述数据,它与数据的存储无关。根据数据元素之间关系的不同特性,通常有四类基本逻辑结构:集合结构、线性结构、树形结构和图状结构。
②存储结构是逻辑结构在计算机中的存储表示,有两类存储结构:顺序存储结构和链式存储结构。
(3)抽象数据类型是指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合,以及对数据对象的基本操作的集合。
(4)算法是为了解决某类问题而规定的一个有限长的操作序列。算法具有五个特性:有穷性、确定性、可行性、输人和输出。一个算法的优劣应该从以下四方面来评价:正确性、可读性、健壮性和高效性。
(5)算法分析的两个主要方面是分析算法的时间复杂度和空间复杂度,以考察算法的时间和空间效率。一般情况下,鉴于运算空间较为充足,故将算法的时间复杂度作为分析的重点。算法执行时间的数量级称为算法的渐近时间复杂度,T(n)=O(An)),它表示随着问题规模n的增大,算法执行时间的增长率和fn)的增长率相同,简称时间复杂度。
学完本章后,要求掌握数据结构相关的基本概念,包括数据、数据元素、数据项、数据对象数据结构、逻辑结构、存储结构等;重点掌握数据结构所含两个层次的具体含义及其相互关系;了解抽象数据类型的定义、表示与实现方法;了解算法的特性和评价标准;重点掌握算法时间复杂度的分析方法。

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