该笔记内容根据浙江大学陈越、何钦铭老师的公开课
《数据结构》整理得到。
基本概念
抽象数据类型(Abstract Data Type)
仅描述数据对象集和相关操作集“是什么”,而不涉及“如何做到”。
- 数据类型
- 抽象:描述数据类型的方法不依赖于具体实现
- 与存放数据的机器无关
- 与数据存储的物理结构无关
- 与实现操作的算法和编程语言无关
算法(Algorithm)
算法包括:
- 一个有限指令集
- 接收一些输入(有些情况下不需要输入)
- 产生输出
- 一定在有限步骤之后终止
- 每一条指令必须
- 有充分明确的目标,不可以有歧义
- 计算机能处理的范围之内
- 描述应不依赖于任何一种计算机语言以及具体的实现手段(指令的伪代码描述)
算法复杂度
好的算法需要考虑:
分析算法效率时,考虑两方面:
- 最坏情况复杂度
Tworst(n)
- 平均复杂度
Tavg(n)(因为不同情况运行复杂度不一样,平均复杂度很难衡量)
算法复杂度的渐进表示法:
-
T(n)=O(f(n))表示存在常数
C>0,n0>0,使得当
n≥n0时,有
T(n)≤C⋅f(n)
-
T(n)=Ω(f(n))表示存在常数
C>0,n0>0,使得当
n≥n0时,有
T(n)≥C⋅f(n)
-
T(n)=Θ(f(n))表示同时满足
T(n)=O(f(n))和
T(n)=Ω(f(n))
复杂度关系:
O(1)<O(log(n))<O(n)<O(nlog(n))<O(n2)<O(n3)<O(2n)<O(n!)
复杂度分析的运算法则:
- 若两段算法的复杂度分别为
T1(n)=O(f1(n))和
T2(n)=O(f2(n)),则
- 当两段算法相接时,
T1(n)+T2(n)=max(O(f1(n)),O(f2(n)))
- 当两段算法嵌套时,
T1(n)×T2(n)=O(f1(n)×f2(n))
线性结构
线性表满足:
顺序存储:
链表存储:
广义表:
- 广义表是线性表的推广
- 广义表中的元素,可以是单元素,也可以是另一个广义表
多重链表:
- 链表中的节点可能同时隶属于多个链
- 节点的指针域会有多个,不同的指针域指向不同的链
- 包含两个指针域的链表并不一定是多重链表,例如双向链表中的不同指针域指向的是同一个链
- 多重链表可以描述树、图等复杂的数据结构
堆栈(Stack):
- 特点:后入先出,逐个堆积
- 具有一定约束的线性表,所谓约束即只在一端(栈顶,Top)做插入(入栈Push)、删除(出栈Pop)