文章目录
《重学数据结构与算法》学习笔记
0. 概览
数据结构 | 增 | 删 | 查 | 特点 |
---|---|---|---|---|
线性表 | 变长 | |||
栈 | ||||
队列 | ||||
数组 | O(1), O(n) | O(1),O(n) | O(1), O(n) | 定长 |
字符串 | ||||
二叉树 | 一对多 | |||
哈希表 | address = hash(key) |
1. 线性表、栈和队列
2. 数组
数组是用来存放若干个相同类型数据元素的容器。
数组在内存中是连续存放的。数组内的数据可以通过索引值访问。
2.1 基本操作
1) 时间复杂度
- 增/删
- 最后位置:O(1)
- 中间位置:O(n)
- 查
- 基于位置:O(1)
- 基于数值:O(n)
2) 案例
假设数组存储了5个评委对1个运动员的打分,且各分值不相同。现在请:(1) 用数组按照连续顺序保存,并去掉最大/小值。(2) 计算3个样本平均分并打印。要求不允许再开辟 O(n) 空间复杂度的结构。
3. 字符串
字符串是由字符组成的有序结构。
3.1 存储结构
-
顺序存储
-
链式存储
3.2 基本操作
1) 时间复杂度
以顺序存储为例。
- 增/删
- 最后位置,连接等:O(1)
- 中间位置,插入等:O(n)
- 查
- 子串查找:O(nm),其中 n 是主串长度,m 是模式串长度。
2) 案例:最大公共字符串
有字符串 a=“ATGCCATT” 和 b=“CCATGCT”,求 a 和 b 的的最大公共字符串。(提示:简单匹配 vs. 动态规划)
4. 二叉树
树:由节点和边组成的,不存在环的数据结构。
节点类型:父、子、兄弟;根、叶子。
节点位置:层次;深度。
二叉树:每个节点最多有两个子节点的树。其中除叶子节点外的节点都有两个子节点的树,称为满二叉树。除最后一层外的层节点个数都达到最大、且最后一层的叶子节点都靠左排列的树,称为完全二叉树。
4.1 储存结构
- 基于指针的链式存储
每个节点有三个字段,分别存储数据和指向左右节点的指针。 - 基于数组的顺序储存
把节点存放在数组里,约定把根节点放在下标为1的位置。
4.2 基本操作
- 遍历
按照遍历父节点的顺序,分为前序,中序和后序遍历。
// 先序
public static void preOreder(Node node) {
if (node == null)
return;
System.out.print(node.data + " ");
preOrder(node.left);
preOrder(node.right);
}
// 中序
public static void inOrder(Node node){
if (node == null)
return;
inOrder(node.left);
System.out.print(node.data + " ");
inOrder(node.right);
}
//后序
public void postOrder(Node, node){
if (node == null)
return;
postOrder(node.left);
postOrder(node.right);
System.out.print(node.data + " ");
}
1) 时间复杂度
- 查
- 无特性二叉树:O(n)
- 二叉搜索树*:O(logn)
- 增/删
- 基于指针:O(1)
* 二叉搜索树具有以下特性:1) 任一节点的值大于其左子树中每个节点的值;2) 任一节点的值小于其右子树中每个节点的值;3) 尽可能避免两个节点数字相等的情况;4) 中序遍历可以输出一个升序的数据序列。
2) 案例:使用字典树判断字符串是否存在
字符串集合包含 cat, car, city, dog, door, deep, 判断某一字符串(如 home)是否在字符串集合中出现。
5. 哈希/散列表
哈希表:(利用函数映射将记录的存储位置和关键字关联起来)根据关键字直接进行访问的数据结构。
5.1 哈希函数
- 设计方法
- 直接定制法:H(key) = a*key + b
- 数字分析法:从 key 中提取若干位组成哈希地址。
- 平方取中法:求 key 的平方值后取中间若干位数字。
- 折叠法:将 key 分割为若干等长的部分后,取其叠加和。
- 除留余数法:key mod p
- 哈希冲突
哈希冲突是指不同的 key 具有相同的 hash 值。解决哈希冲突常见的方法有:- 开放定址法:通过探测(如线性探测法)在哈希表形成一个序列,遇空则插。
- 链地址法:将哈希地址相同的记录存储在一张线性链表中。
5.2 基本操作
1) 时间复杂度
- 增/删/查:O(1)
2) 案例:构建哈希表
将关键字序列 {7, 8, 30, 11, 18, 9, 14} 存储到哈希表中。哈希函数为:H(k) = (k*3)%7,处理冲突采用线性探测法。