数据结构与算法快速回顾


数组

数组地址计算

image.png

稀疏矩阵

为什么会有稀疏矩阵,有些在矩阵中存储的数据是重复数据,这时我们就可以采用稀疏矩阵来存储,比如用矩阵来存取无向图
image.png

数据结构的定义

数据结构的概念

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法索引技术有关。

数据逻辑结构

  • 线性

image.png

  • 非线性

image.pngimage.png
树(无环路的图) 图

从广义上来看,图可以包含树,线性的树包括线性结构

线性表

  • 顺序表image.png
  • 链表
    • 单链表image.png
    • 循环链表image.png
    • 双向链表image.png

单链表可以分为有头结点的单链表和无头结点的单链表,有头结点的好处是可以使所有节点的操作方式一致。

链表的基本操作

单链表删除节点

image.png
p->next = q->next

单链表插入节点

image.png
s->next = p ->next
p->next = s

双链表删除节点

image.png

双链表插入节点

image.png

顺序存储与链式存储对比

表格对比
image.png
对于查找而言,如果顺序存储的是一组有序的数据,可以采用二分法来查找
对于读运算,比如我们要取第五个元素
顺序存储:A[5]
链式存储:从第一个向后遍历到第五个

队列与栈

队列:先进先出
栈:先进后出
循环队列

循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。 [1] 循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。

image.png

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。

image.png

广义表

广义表(Lists,又称列表)是一种非连续性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。

image.png
广义表有两个操作:

  • head()取表头
  • tail() 取表尾

表尾是指除了首位元素外的所有元素

树与二叉树

  • 结点的度:节点拥有的孩子数
  • 树的度:所有节点中取节点度最多的为树的度
  • 叶子节点
  • 分支节点
  • 内部节点:非根节点和叶子节点,夹在中间的节点
  • 父节点
  • 子节点
  • 兄弟节点
  • 层次

满二叉树

image.png

完全二叉树

image.png
除了最后一层,其他每层都是满节点,最后一层从左到右填充节点

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

非完全二叉树

image.png
image.png

二叉树遍历

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 层次遍历

反向构造二叉树

知道前序和中序,或者中序和后序都可以反向构造出二叉树

树转二叉树

  1. 除了最左边的孩子节点,划掉与其他节点的连线
  2. 兄弟节点连线
  3. 旋转树

image.png

查找二叉树(二叉排序树)

  • 左孩子小于根
  • 有孩子大于根

image.png
删除节点
image.png

最优二叉树(哈夫曼树)

需要了解的基本概念

  • 树的路径长度:树中的路径累加其起来有多长
  • 权:数值,代表某节点出现的频度
  • 带权路径长度:权*节点路径长度
  • 树的带权路径长度(树的代价):所有带权路径长度之和

构造最小树的带权路径长度即为哈夫曼树
哈夫曼编码

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)

线索二叉树

为什么要有线索二叉树?
方便遍历!!
image.png

平衡二叉树

任意节点的左右子树深度差不超过1

  • 有向图
  • 无向图

不管是无向图还是有向图,都有完全图的概念,边都连满了的图就是完全图

图的存储

邻接矩阵
image.png
邻接表
image.png

图的遍历

image.png

拓扑排序

完成一个任务后,才能完成下一个任务
image.png

图的最小生成树

树的基本原则:边数<节点数

普里姆算法

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] 。

算法基础

image.png

算法复杂度

image.png

查找

  • 顺序查找

image.png

  • 二分查找

image.png

  • 散列表

image.png
散列表冲突的解决方法

  • 线性探测法
  • 伪随机数法

排序

  • 插入类排序
    • 直接插入排序
    • 希尔排序
  • 交换类排序
    • 冒泡排序
    • 快速排序
  • 选择类排序
    • 简单选择排序
    • 堆排序
  • 归并排序
  • 基数排序

直接插入排序

image.png

希尔排序

缩小解决问题的规模
image.png

直接选择排序

image.png

堆排序

  • 认识堆

image.png
堆排序过程
image.png

冒泡排序

image.png

快速排序

image.png

归并排序

image.png

基数排序

image.png

排序算法的时间复杂度和空间复杂度

image.png

猜你喜欢

转载自blog.csdn.net/weixin_45660485/article/details/124812650
今日推荐