第一章 绪论

1.1、数据结构的研究内容

数据结构(Data Structure):是一门研究非数值计算程序设计中操作对象,以及这些对象之间的关系(数据与数据之间的关系)和操作的学科。

1.2、基本概念和术语

1.2.1、基本概念

  1. 数据(Data):数据是信息的载体,是描述客观事物属性的字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
  2. 数据元素(Data Element):是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。是数据集合中的一个个体,是数据结构中讨论的基本单位。在有些情况下,数据元素也称为元素结点顶点记录等。
  3. 数据项(Data Item):是组成数据元素的,有独立含义的,不可分割的最小单位。一个数据元素可以由若干个数据项组成。数据项是数据结构中讨论的最小单位。
  4. 数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集
  5. 数据结构:是相互之间存在一种多种特定关系的数据元素的集合。可以表示为一个二元组(D,R),其中D为数据元素的集合,R为元素间的关系。

1.2.2、数据结构的三要素

1.逻辑结构:是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

​ 数据的逻辑结构有两个要素:一是数据元素;二是关系

按逻辑结构可分为:

  • 线性结构(一对一的关系)

  • 集合结构(同属于一个集合)

  • 树形结构(一对多的关系)

  • 图结构或网状结构(多对多关系)

2.存储结构:数据对象在计算机中的存储表示称为数据的存储结构,也称物理结构

​ 数据元素在计算机中有两种基本存储结构,分别是顺序存储结构链式存储结构

​ 1)顺序存储结构:将逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来提现。

        > 优点:可以实现随机存取,每个元素占用最少的存储空间。
        > 缺点:只能使用相邻的一整块存储单元,会产生较多外部碎片。增加、删除一个元素的效率不高。

​ 2)链式存储结构:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。

        > 优点:不会出现碎片现象,能够充分利用存储单元。增加、删除一个元素的效率较高。
        > 缺点:每个元素因存储指针会额外占用存储空间,只能实现顺序存储,访问效率较低。

​ 3)索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每项为索引项,索引项一般形式为:(关键字,地址)。

        > 优点:检索速度快。
        > 缺点:增加附加的索引表后会占用较多的存储空间,在增加和删除数据是要修改索引表,因此要花费较多时间。

​ 4)散列存储:根据元素的关键字直接计算出该元素的存储地址,又称为Hash存储。

        > 优点:检索、增加、删除节点的操作都很快。
        > 缺点:若散列函数不好,则会出现元素存储单元的冲突,而解决冲突会增加时间和空间的开销。效率较大的依赖于散列函数的选择。

3.数据的运算:施加在数据上的运算,包括运算的定义和实现。

1.2.3、数据类型和抽象类型

  1. 数据类型:

数据类型(Data Type):是一个值的集合和定义在这个值上的一组操作的总称。

  • 原子类型。值不可再分的数据类型。例如int、char、float等。值的集合+操作。
  • 结构类型。值可以再分解为若干成分的数据类型。例如list、map、stack等。结构的集合+操作。
  • 抽象数据类型。抽象数据组织及与之相关的操作。ADT。数据对象+数据关系+操作。
  1. 抽象数据类型:

抽象数据类型(Abstract Data Type,ADT):一般指由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象,数据对象上关系的集合以及对数据对象的基本操作的集合。

1.3、算法和算法分析

1.3.1、算法的定义及特性

算法(Algorithm):是为了解决某类问题而规定的一个有限长的操作序列。

一个算法必须满足以下五个重要特性

(1)有穷性:一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成

(2)确定性:对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义以及如何执行

(3)可行性:算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现

(4)输入:一个算法有一个多个输入。当函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值

(5)输出:一个算法有一个多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义

1.3.2、评价算法优劣的基本标准

一个算法的优劣应该从以下几方面来评价:

1)正确性:在合理的数据输入下,能够在有限的运行时间内得到正确的结果

2)可读性:一个好的算法,首先应便于人们理解和相互交流,其次才是机器可执行性

3)健壮性:当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果

4)高效性:高效性包括时间空间两个方面。时间高效是指算法设计合理执行效率高,空间高效是指算法占用存储容量合理

1.3.3、算法效率的度量

算法效率的度量是通过时间复杂度空间复杂度来描述的。我们描述一个算法,通常使用最坏情况下的算法的时间复杂度。

衡量算法效率的方法主要有两类:事后统计法事前分析估算法

  1. 时间复杂度:

    ​ 影响算法时间代价的最主要因素是问题规模。问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。

    ​ 一般情况下,算法中基本语句重复执行的次数是问题规模n和某个函数f(n),算法的时间量度记作:T(n)=O(f(n))。

    它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度(Time Complexity)。

  • 加法规则:

    T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n),g(n)))

  • 乘法规则:

    T(n) = T1(n) * T2(n) = O(f(n)) * O(g(n)) = O(f(n)*g(n))

2.空间复杂度:

​ 我们采用渐近空间复杂度(Space Complexity)作为算法存储所需空间的量度,简称空间复杂度。

​ 它也是问题规模n的函数,记作:S(n)=O(f(n))

3.最好,最坏和平均时间复杂度:

  1. 称算法在最好情况下的时间复杂度为最好时间复杂度,指的是算法计算量可能达到的最小值
  2. 称算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值
  3. 算法的平均时间复杂度是指算法在所有可能的情况下,按照输入实例以等概率出现时,算法计算量的加权平均值

参考资料:

数据结构 C语言版|第二版 严蔚敏 李冬梅 吴伟民 编著
王道论坛B站视频:https://www.bilibili.com/video/BV1b7411N798

posted @ 2021-08-06 22:40  NotYourferry  阅读(132)  评论(0编辑  收藏  举报