1. 数据结构的基本概念
定义:
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
算法:指令的有限序列,每一条指令表示一个或多个操作
– 解决问题的方法和步骤,一个问题可以用多种算法来解决,需要比较不同算法的效率 – 引入了算法代价
算法代价 – 算法效率的度量:
算法运行所需要的计算机资源的量,包括
时间代价:需要的时间资源的量
空间代价:需要的空间(即存储器)资源的量
反映算法所采用的方法的效率,与硬件、软件环境无关
数据结构:
- 逻辑结构 - 数据之间的相互关系 - 实现应用程序
- 线性结构:数据元素之间一对一的关系,包括线性表、栈、队列、串
存在唯一一个被称为第一个的数据元素
存在唯一一个被称为最后一个的数据元素
除第一个外,每个元素有且只有一个前驱
除最后一个外,每个元素有且只有一个后继 - 非线性结构
集合:结构中的数据元素同属于一种类型
树形结构:数据元素之间一对多的关系
图状/网状结构:数据元素之间存在多对多的关系
- 存储/物理结构 – 数据在计算机中的表示 – 描述数据具体在内存中的存储
- 顺序结构:用元素在存储器中的相对位置来表示数据元素间的逻辑关系
- 链式结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
- 索引结构:采用附加的索引表的方式来存储节点信息的一种存储方式
1. 索引表由若干索引项组成;
2. 索引存储方式中索引项的一般形式为(关键字、地址);
3. 其中,关键字是能够唯一标识一个节点的数据项 - 散列结构:根据节点的关键字直接计算出该节点的存储地址
算法的五个特性:
- 输入:一个算法有零个或多个输入(即算法可以没有输入),这些输入通常取自于某个特定的对象集合。
- 输出:一个算法有一个或多个输出(即算法必须要有输出),通常输出与输入之间有着某种特定的关系。
- 有穷性:一个算法必须总是(对任何合法的输入)在执行有穷步之后结束,且每一步都在有穷时间内完成。
- 确定性:算法中的每一条指令必须有确切的含义,不存在二义性。并且,在任何条件下,对于相同的输入只能得到相同的输出。
- 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现
算法设计要求:正确性、可读性、健壮性、高效性、低存储量需求
2. 渐进算法分析方法 – asymptomatic algorithm analysis – 事前分析估算的方法
估算出当问题规模变大时,一种算法及实现它的程序的效率和开销;
影响运行时间的因素:
a.算法所采用的策略
b.问题规模
c.书写程序采用的语言
d.机器速度
渐近分析:
是指当输入规模n→∞时, 对算 法运行时间函数T(n)的渐近性态的估算, 它提供了对算法资源开销进行评估的简单化的模型。
- 大O表示法 – 算法运行时间的上限
- 大Ω表示法 – 算法运行时间的下限
- Θ表示法 – 上、下限相等:如果非负函数T(n)既在O(h(n))中,又在 Ω(h(n))中,则称T(n)是Θ(h(n)),也称T(n)与h(n)同阶
四法则:
- 传递性
- 忽略常数系数
- 取大值:
若 f1 (n)在O(g1 (n))中,且 f2 (n)在 O(g2 (n)) 中,则 f1 (n)+f2 (n)在O(max(g1 (n), g2 (n)))中; - 函数相乘则复杂度相乘
例:二分法检索 – 二叉查找树
3.时间复杂度
基本操作(basic operation)数 – 衡量算法的时间性能 ,一般情况下,执行次数是问题规模的函数
规模:一般指输入量的数目;
基本操作:完成该操作所需时间与操作数的具体取值无关;
执行算法所需要的时间 T = T(n) – n为输入规模
常见时间代价:
运行时间估计:
4.空间复杂度
若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间.
时间复杂度与空间复杂度之间没有必然联系,可用时间换空间或空间换时间.