数据结构笔记

数据结构笔记

[TOC]

写在前面

​ 寒假看看数据结构的网课当作复习吧,随便写了一些笔记

概念小结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
graph LR;
数据--个体-->数据元素;
数据元素--性质相同的构成的集合-->数据对象;
数据元素--加上数据元素之间的关系-->数据结构;
数据结构--映像到内存-->存储结构;
数据结构--加上操作-->抽象数据类型;
数据结构--逻辑模型-->逻辑结构;
逻辑结构-->集合结构;
逻辑结构-->线性结构;
逻辑结构-->树形结构;
逻辑结构-->图形结构;
抽象数据类型-->数据对象;
抽象数据类型-->数据类型;
抽象数据类型-->基本操作;
存储结构-->顺序结构;
存储结构-->链式结构;
存储结构-->索引结构;
存储结构-->散列结构;

逻辑结构:研究对象之间的特性和关系;

存储结构:有效组织计算机进行存储

算法五个特性:

  • 有穷性:经过有穷步可以结束
  • 确定性:每一条指令必须有确切的含义,没有二义性
  • 可行性:可以执行的
  • 输入
  • 输出

算法设计要求:

  • 正确性
  • 可读性
  • 健壮性
  • 高效性

栈和队列

定义和特点

  • 栈特点:后进先出(LIFO)

  • 队列特点:先进先出(FIFO

使用案例

进制转换

将十进制数159转换成八进制数

短除法余数分别依次是$7,3,2$,每一次得到余数的时候放入栈中,然后将栈中元素依次弹出可以得到八进制数$237$

括号匹配

假设表达式中有[],()两种括号,括号可以嵌套,但是顺序不可以出错。比如([] ())是合法的,但是([)]不合法

按照顺序依次push进入栈中,如果和下面的匹配就弹出,如果出现交叉的情况说明不匹配。

表达式求值

算法有限算法

把表达式分为:

  • 操作数: 常数,变量
  • 运算符: 算术运算符,逻辑运算符,关系运算符
  • 界限符: 左右括号和表达式结束符

设置两个栈,一个是算符栈,另一个是操作数栈

从左至右开始扫描表达式:

  • 如果是数:压入操作数栈

  • 如果是运算符:

    • 优先级高于运算符栈顶的优先级,入栈并继续向后扫描
    • 优先级低于运算符栈顶的优先级,从操作数栈弹出两个运算数,弹出栈顶运算符,并进行运算,并将结果压栈进入操作数栈
  • 继续进行扫描

舞伴问题

舞会上男女各自拍成一列,开始时从队头出来配对跳舞,跳完了过后自己排到后面去。

  • 二叉树和树是两个概念,因为树的结点的孩子不分左右
  • 假设二叉树叶子节点个数为$N_0$,有两个孩子的节点个数为$N_2$,则$N_0=N_2+1$

$$
设节点数为N,两个孩子的节点数为N_2,一个的为N_1,没有的为N_0\
边数:\
N-1=N_2+N_1+N_0-1=2*N_2+N_1\
化简可得
$$

  • 满二叉树:一个深度为$k$且有$2^k-1$个结点的二叉树

  • 完全二叉树:深度为$k$的具有$n$个节点的二叉树,当且仅当每一个节点都与深度为$k$的满二叉树从上到下,从左到右编号1到$n$对应的时候,称作完全二叉树。其深度为$\lfloor log_2n\rfloor+1$

  • 完全二叉树节点$ib $的父亲$\lfloor i/2\rfloor$,儿子$2i,2i+1$

  • 先序遍历:根左右;中序遍历:左根右;后序遍历:左右根

  • 如果二叉树各节点均不同,则三种遍历的序列都唯一

  • 如果知道先序遍历和中序遍历,或者后序遍历和中序遍历,则可以确定唯一的二叉树。已知先序/后序,中序,确定子树的时候,通过先序/后序确定子树的根,通过中序确定左右。

  • 线索二叉树:我选择把这篇文章贴上来#图解 数据结构:轻松搞定线索二叉树 - 知乎

  • 树转换成二叉树:从上到下,当前节点孩子放在该节点的左子树,兄弟放在右子树

  • 二叉树转换成树:左孩子的的右孩子连接到双亲,删除原来的右孩子的线

  • 二叉树转换成森林:从根节点开始,顺着将和右孩子的连线抹掉,再把每一个二叉树再进行还原。

  • 哈夫曼树:最优二叉树,带权路径长度最短的树

    • 构造方法:先构造N个二叉树,每个都只有一个节点,选择权值最小的两个节点作为左右子树构成一个新的树,权值设为两个节点权值之和,然后在森林之中删除掉原来的两个节点,再把新的树放入到森林当中
    • 特点:经过$N-1$次合并形成,有$2N-1$条边,且每个分支节点度都为2。

定义和术语

  • 图:G=(V,E)

    • V(Vertex):顶点(数据元素)的非空有穷集合
    • E(Edge):边的有穷集合
  • 根据是否每条边有方向分为有向图,无向图

  • 任意两个点都有边叫做完全图(有向图是两个点之间有两条边)

  • 有向图的边也叫做弧

  • 边的数目很少($\leq nlogn$)叫做稀疏图

  • 边较多的叫做稠密图

  • 网:边带权的图

  • 邻接:有边相连的两个顶点之间联系

  • $(v_i,v_j)表示无向边,v_i邻接v_j,<v_i,v_j>表示有v_i到v_j的一条有向边,称作v_i邻接到v_j或者v_j邻接于v_i$

  • 关联(依附):边和顶点的关系

  • 顶点的度:和顶点相关联的边的数目(有向图称出度入度)

  • 路径:连续的边构成的顶点序列

  • 路径长度:路径上的边的权值之和

  • 回路:第一个顶点和最后一个顶点相同的路径

  • 简单路径:除了起点终点可以相同外,其他顶点均不相同

  • 连通图:在图中,任意两个顶点之间存在路径成为连通图(有向图则成为强连通图)

  • 连通分量:无向图的极大连通子图称为其的连通分量(有向图叫做强连通分量)

  • 生成树:包含无向图所有顶点的极小连通子图

  • 生成森林:对于非连通图,由各个连通分量的生成树的集合