【数据结构和算法】绪论
一、概念
数据结构就是数据元素之间存在一种或多种特定关系的集合;数据结构是带 “结构” 的数据元素的集合,“结构” 就是指数据元素之间存在的关系
数据结构主要研究非数值计算的问题(无法用数学方程建立数学模型),学生学籍管理系统、最短路径问题等
二、数据结构的分类
在传统上我们把数据结构分为抽象的逻辑结构和在计算机上实现的存储结构。我们少有研究数据,因为数据在计算机中的表现形式都是以二进制方式存储
- 逻辑结构
逻辑结构有两种要素,一是数据元素、二是数据元素之间的关系。由于前文提到数据在计算机中都是以二进制形式存储,所以不多做考究;而数据元素之间的关系大体上有四种基本类型,如列表:
名称 |
图示 |
关系 |
集合结构 |
除了结构中元素同 属于一种外无其他关系 |
|
线性结构 |
数据元素之间一对一关系 |
|
树结构 |
数据元素之间一对多关系 |
|
图结构 |
数据元素之间多对多关系 |
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。所以可以把逻辑结构看成是抽象的数学模型。
从逻辑上可以分为线性结构和非线性结构
- 存储结构
数据在计算机中的存储方式。
数据元素在计算机中有两种基本的存储结构,是顺序存储结构和链式存储结构。
顺序存储结构:用元素在存储器中物理位置来表示数据元素的逻辑位置,一般用数组来实现顺序存储结构
特点:存储空间必须连续 ;
链式存储结构:用结点来表示数据元素,用结点中的指针来表示数据元素之间的关系。
特点:存储空间不必连续;
结构导图:
三、算法和算法分析
算法是为了解决某类问题而规定有限长的一个的操作序列。如果想构造一个程序的话,数据结构和算法正是程序中不可缺少的支柱。
一个算法必须满足的五个特性:
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
当我们写出一个程序后,如何去评估程序所用算法的优劣呢?
以下是评估算法优劣标准
- 正确性:在合理的输入下,在有限时间内得到合理的输出
- 可读性:好的算法首先就要便于人们的理解
- 健壮性:当有非法的输入时,优秀的算法会准确的指出错误和进行相应的处理
- 高效性:包括时间和空间两个方面,下面会详细的讲解
好了,现在你已经知道评估标准了,让我们进行对高效性的下一步学习
高效性包括时间和空间两个部分,分别对应着时间复杂度和空间复杂度
- 时间复杂度:随着问题规模的扩大,所需要时间变化的规律
计算时间复杂度步骤
(1)找出算法的基本语句:执行次数最多的那条语句
(2)计算基本语句的执行次数的数量级:基本语句执行次数中最高次幂
(3)用大O表示法表示算法的时间性能:eg: O(最高次幂)
时间复杂度有分为:
算法在最好情况下的时间复杂度,指的是算法计算量可能达到的最小值;算法在最坏情况下的时间复杂度为最坏时间复杂度,指的是算法计算量可能达到的最大值;而平均时间复杂度是指算法在所有可能的情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。
对于时间复杂度的度量,人们通常说的是最坏时间复杂度。
算法运行时间并不以秒为单位,而是从其增速的角度量算
- 空间复杂度:随着问题规模的扩大,所需要额外空间变化的规律(当一个程序在运行时,出来本身用到指令、常数、变量和输入数据外,还需要一些对数据进行操作的辅助存储空间)
表示空间复杂度用的是大O表示法
由于材料和工艺上的提升,现在的存储空间用来跑程序已经较为充足,所以人们都以算法的时间复杂度作为算法优劣的衡量指标。对于空间复杂度不再进行过多的描述。
2020-06-27