数据结构与算法-绪论
数据结构的基本概念
数据元素
、数据项
: 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。 一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
数据对象
:是具有相同性质的数据元素的集合,是数据的一个子集。
数据类型
:一个值的集合和定义在此集合上的一组操作的总称。
数据结构
:是相互之间存在一种或多种特定关系的数据元素的集合。
举例:
(1)人就是数据的基本单位数据元素。
(2)此时姓名,年龄,身高,体重,身价等就可以理解为数据项。
(3)每个人都具有以上的性质和属性,他们就都属于同一个数据对象。
(4)人与人之间个体之间存在差异,也有许多人之间具有某种关系,比如很多人会很有钱,可以把这些很有钱的人放在一起,形成了数据结构。
(5)不同数据元素之间可能组成相同的数据结构。比如穷人和富人。
(6)同一个数据对象里的 数据元素,可以组成 不同的数据结构。他们可能组成线性结构,也可能组成网状结构等。
数据结构的三要素
-
数据的逻辑关系
集合:
数据元素同属于一个集合,无其他关系
线性结构:
数据元素一对一关系,两大类,线性结构(线性表,栈,队列),非线性结构(树,图,集合)
树形结构:
数据元素一对多关系
图/网状结构:
数据元素多对多关系 -
数据的运算
针对于某种逻辑结构,结合实际需求,定义基本运算。
运算的定义->针对逻辑结构
运算的实现->针对存储结构 -
数据的存储(物理)结构
数据的存储结构是用计算机语言实现的逻辑结构。
主要有:
顺序存储:
逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。
链式存储:
不要求逻辑上相邻的元素在物理位置上也相邻,而是借助指示元素存储地址的指针来表示元素之间的逻辑关系。
索引存储:
存储信息的同时,还建立附加的索引表。
散列存储:
根据元素的关键字直接计算出钙元素的存储地址。
Tips:
(1) 数据的存储结构会影响存储空间分配的方便程度。
(2) 数据的存储结构会影响数据运算的速度。
算法的基本概念
算法:对特定问题的求解步骤的一种描述。
数据结构 -> 用数据正确的描述现实世界的问题,并存入计算机。
算法 -> 如何高效地处理这些数据,以解决问题。
-
5个重要特性
(1) 有穷性:算法必须在有穷时间内执行有穷步之后结束;而程序可以是无穷的,一直执行下去(比如微信)
(2) 确定性:对于相同的输入只能得出相同的输出。
(3) 可行性:基本运算执行有限次来实现。
(4) 输入:零个或多个输入。
(5) 输出:一个或多个输出。输出和输入有着某种特定关系。 -
好算法的特征
(1) 正确性
(2) 可读性
(3) 健壮性:输入非法数据是,算法能适当地做出反应或进行处理。
(4) 效率和低存储需求:空间复杂度,时间复杂度低。
效率的度量
-
时间复杂度
时间开销T(n)和问题规模n的关系。
(1) 算法中基本运算(最深层循环内的语句)的频度与T(n)同数量级。
因此通常采用算法中基本运算的频度f(n)来分析时间复杂度。
具体取f(n)中随n增长最快的项,并将其系数置为1. 如f(n) = an^3 + bn^2 + cn的时间复杂度为O(n^3).
记为:T(n) = O(f(n))
.O代表T(n)和f(n)同数量级,为同阶无穷小。
(2) 常见的渐进时间复杂度:
常数阶O(1)
<对数阶O(log2n)
<线性阶O(n)
<线性对数阶O(nlog2n)
<平方阶O(n^2)
<立方阶O(n^3)
<指数阶O(2^n)
<阶乘阶O(n!)
<N次方阶O(n^n)
口诀:常对幂指阶
(3) Notes:
① 顺序执行的代码只会影响常数项,可以忽略。
② 循环中只需要挑一个基本操作来分析它的执行次数和n的关系即可。
③ 加法规则:T(n,m) = T1(n) + T2(n) = O (max ( f(n),g(m) )
乘法规则:T(n,m) = T1(n) * T2(m) = O (f(n) * g(m))
④ 一般只考虑平均时间复杂度和最坏时间复杂度。 -
空间复杂度
(1) 程序允许时的内存需求:
程序代码:大小固定,与问题规模无关。
数据:局部变量,参数等。
(2) 算法原地工作
:算法所需内存空间为常数。
(3) 只需要关注存储空间大小与问题规模n相关的变量。
(5) 函数递归调用带来的内存开销。空间复杂度 == 递归调用深度
。特殊情况例外(例如申请了大小为n的数组)。