快速回顾
数组
数组地址计算
稀疏矩阵
为什么会有稀疏矩阵,有些在矩阵中存储的数据是重复数据,这时我们就可以采用稀疏矩阵来存储,比如用矩阵来存取无向图
数据结构的定义
数据结构的概念
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
数据逻辑结构
- 线性
- 非线性
树(无环路的图) 图
从广义上来看,图可以包含树,线性的树包括线性结构
线性表
- 顺序表
- 链表
- 单链表
- 循环链表
- 双向链表
单链表可以分为有头结点的单链表和无头结点的单链表,有头结点的好处是可以使所有节点的操作方式一致。
链表的基本操作
单链表删除节点
p->next = q->next
单链表插入节点
s->next = p ->next
p->next = s
双链表删除节点
双链表插入节点
顺序存储与链式存储对比
表格对比
对于查找而言,如果顺序存储的是一组有序的数据,可以采用二分法来查找
对于读运算,比如我们要取第五个元素
顺序存储:A[5]
链式存储:从第一个向后遍历到第五个
队列与栈
队列:先进先出
栈:先进后出
循环队列
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。 [1] 循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。
在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。
广义表
广义表(Lists,又称列表)是一种非连续性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。
广义表有两个操作:
- head()取表头
- tail() 取表尾
表尾是指除了首位元素外的所有元素
树与二叉树
- 结点的度:节点拥有的孩子数
- 树的度:所有节点中取节点度最多的为树的度
- 叶子节点
- 分支节点
- 内部节点:非根节点和叶子节点,夹在中间的节点
- 父节点
- 子节点
- 兄弟节点
- 层次
满二叉树
完全二叉树
除了最后一层,其他每层都是满节点,最后一层从左到右填充节点
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
非完全二叉树
二叉树遍历
- 前序遍历
- 中序遍历
- 后序遍历
- 层次遍历
反向构造二叉树
知道前序和中序,或者中序和后序都可以反向构造出二叉树
树转二叉树
- 除了最左边的孩子节点,划掉与其他节点的连线
- 兄弟节点连线
- 旋转树
查找二叉树(二叉排序树)
- 左孩子小于根
- 有孩子大于根
删除节点
最优二叉树(哈夫曼树)
需要了解的基本概念
- 树的路径长度:树中的路径累加其起来有多长
- 权:数值,代表某节点出现的频度
- 带权路径长度:权*节点路径长度
- 树的带权路径长度(树的代价):所有带权路径长度之和
构造最小树的带权路径长度即为哈夫曼树
哈夫曼编码
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)
线索二叉树
为什么要有线索二叉树?
方便遍历!!
平衡二叉树
任意节点的左右子树深度差不超过1
图
- 有向图
- 无向图
不管是无向图还是有向图,都有完全图的概念,边都连满了的图就是完全图
图的存储
邻接矩阵
邻接表
图的遍历
拓扑排序
完成一个任务后,才能完成下一个任务
图的最小生成树
树的基本原则:边数<节点数
普里姆算法
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。
克鲁斯卡尔算法
克鲁斯卡尔(Kruskal)算法从另一途径求网的最小生成树。其基本思想是:假设连通网G=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),概述图中每个顶点自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点分别在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点构成一个连通分量为止 [2] 。
算法基础
算法复杂度
查找
- 顺序查找
- 二分查找
- 散列表
散列表冲突的解决方法
- 线性探测法
- 伪随机数法
排序
- 插入类排序
- 直接插入排序
- 希尔排序
- 交换类排序
- 冒泡排序
- 快速排序
- 选择类排序
- 简单选择排序
- 堆排序
- 归并排序
- 基数排序
直接插入排序
希尔排序
缩小解决问题的规模
直接选择排序
堆排序
- 认识堆
堆排序过程
冒泡排序
快速排序
归并排序
基数排序