feat: 新增截图及插入排序

master
old-tom 3 years ago
parent 77521ffa48
commit 05102e138e

@ -0,0 +1,71 @@
### 一、基本概念
数据的存储位置与关键字之间存在对应关系(hash函数)简言之数据存储的位置与hash函数计算结果相关
Loc(i)=H(key)
散列方法根据hash函数计算元素存储位置在查找时也按照相同hash函数进行计算并查找
哈希函数计算hash值的函数
哈希表按照hash值构造的表
哈希冲突不同的Key计算出来的hash值相同
同义词通过hash函数计算出来值相同的key
![[微信截图_20221219203714.png]]
### 二、hash函数构造
##### 使用哈希表要解决2个问题
1. 构造好的哈希函数
1. 所选函数尽可能简单,以便提高转换效率
2. 所选函数对关键码计算出的地址,应在散列地址集中致均匀分布,以减少空间浪费
2. 制定一个好的解决冲突的方案
查找时,如果从哈希函数计算出的地址中查不到关键码,则应当依据解决冲突的规则,有规律地查询其他相关单元
##### 构造哈希函数考虑的因素
+ 执行速度(即计算哈希函数所需时间)
+ 关键字长度
+ 哈希表大小
+ 关键字的分布情况
+ 查找频率
##### 根据元素集合的特性构造:
一、N个数据源仅占用n个地址虽然哈希表查找是以空间换时间但仍希望散列的地址空间尽量小。
二、无论用什么方法存储,目的都是尽量均匀地存放元素,以避免冲突
#### 构造的6种方法
+ 直接定址法H(key)=key或H(key)=a*key+b 其中a和b是常数它适合关键字的分布基本连续的情况
优点:计算简单、不会产生冲突
缺点:占用连续地址空间,空间效率低
![[微信截图_20221220140739.png]]
+ 数字分析法
+ 平均取中法
+ 折叠法
+ 除留余数法H(key)=key mod pp是一个整数,取余
关键如何选取合适的p
技巧设表长度为m取p<=m且为质数
+ 随机数法
#### 如何解决hash冲突
+ 开放地址法(开地址法)
基本思想:有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入。
除留余数法H=Hash(key)+d1mod md1为增量序列
常用方法:
线性探测法 d1为123......m-1线性序列
二次探测法 d1为1平方-1平方-2平方......,二次序列
伪随机探测法 d1为伪随机数
+ 链地址法(拉链法)
基本思想相同hash地址的记录链成一个单链表m个散列地址就设m个单链表然后用一个数组将m个单链表的表头指针存储起来形成一个动态的结构
步骤step1取数据元素的关键字Key计算其哈希地址若该地址对应的链表为空则插入此链表否则执行step2解决冲突
step2计算关键字Key的下一个存储地址若该地址对应的链表不为空则利用链表的前插法或后插法将该元素插入此链表
优点:非同义词不会冲突,无聚集现象
链表上节点空间动态申请,适合表长不确定的情况
![[微信截图_20221220170409.png]]
+ 再散列法(双散列函数法)
+ 建立一个公共溢出区
#### 查找效率
![[微信截图_20221220201301.png]]
+ 哈希表技术具有很好的平均性能,优于一些传统的技术
+ 链地址法由于开地址法
+ 除留余数法作为哈希函数优于其他类型的函数

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

@ -10,3 +10,28 @@
树的带权路径长度越小可以认为性能越好
### 二、哈夫曼树的特点
+ 具有相同带权结点的哈夫曼树不唯一
+ 哈夫曼树中权值越大的叶子离根越近
![[微信截图_20221219105340.png]]
### 三、如何构造哈夫曼树
口诀:
1. 构造森林全是根
2. 选用两小造新树
3. 删除两小添新人
4. 重复2、3剩单根
![[微信截图_20221219113815.png]]
### 四、哈夫曼树的应用
#### 1. 设计一个既能节省空间、有没有重码的编码
1.统计字符集中每个字符在电文中出现的平均概率(概率越大、要求编码越短)
2.将每个字符的概率值作为权值,构造哈夫曼树。(利用哈夫曼树的特点:权越大的叶子离根越近;概率越大的结点,路径越短)
3.在哈夫曼树的每个左分支标0、右分支标1把从根到每个叶子结点路径上的标号连接起来作为该叶子代表的字符编码即哈夫曼编码。
![[微信截图_20221219121106.png]]

@ -0,0 +1,2 @@
### 一、基本概念
深度优先遍历类似于树的先根遍历

@ -0,0 +1,8 @@
可以理解为使用二分查找寻找插入位置
![[微信截图_20221230143349.png]]
+ 折半查找比顺序查找快,所以折半插入排序平均性能比直接插入排序快
+ 折半插入排序所需要的关键码比较次数与待排序对象序列的初始排序无关,仅依赖于对象个数。在插入对象时,需要经过[log2i]+1 次关键码比较,才能确定它插入的位置;
+ 折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列
时间复杂度O(n平方)
空间复杂度O(1)

@ -0,0 +1,29 @@
### 一、概念
**基于有向无环图DAG**:图中没有回路的有向图
![[微信截图_20221221112416.png]]
**AOV网**(拓扑排序)
用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为**顶点表示活动的网**简称AOV网。
**特点1. 若从i到j有一条路径则i是j的前驱j是i的后继
2. 若<i,j>是网中有向边则i是j的直接前驱j是i的直接后继
3. AOV网中不允许有回路因为如果有回路存在则表明某项活动以自己为先决条件这是不允许的**
**问题**
1. 如何用程序判断AOV网中是否存在回路个人理解为死循环
2. 有了AOV网怎么排序
**AOE网**(关键路径)
用一个有向图表示一个工程的各子工程及其相互制约的关系其中以弧表示活动以顶点表示活动的开始或者结束事件称这种有向图为边表示活动的网简称AOV网。
**拓扑排序**
在AOV网没有回路的前提下我们将全部活动排列成一个线性序列使得若AOV网中有弧<i,j>存在则在这个序列中i一定排在j的前面具有这种性质的线性序列成为**拓扑有序序列**,相应的拓扑有序排列的算法成为拓扑排序。
步骤1. 找到一个没有前驱的顶点以顶点为弧尾的弧删除并将顶点作为排序节点例如C1找顶点可以遵循从小到大原则
例:
![[微信截图_20221221130828.png]]
![[微信截图_20221221130542.png]]
### 二、拓扑排序例子
#### 1.排课表
![[微信截图_20221221113754.png]]
### 三、检测AOV网中是否存在环
对DAG构造其顶点的拓扑有序序列若网中所有顶点都在它的拓扑有序序列中则该AOV网必定不存在环。如图所示C3,C6,C8就构成了环所以不在拓扑序列中。
![[微信截图_20221221131248.png]]

@ -0,0 +1,18 @@
#### 一、基本思想:
每一步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
即边插入边排序,保证子序列中随时都是排好序的。
#### 二、基本操作:
在有序序列中插入一个元素,保持序列有序,有序长度不断增加
+ a[0] 是长度为1的子序列然后逐一将a[1]至a[n-1]插入到有序子序列中;
+ 在插入a[i]前数组a的前半段{a[0]~a[i-1]}是有序段,后半段{a[i]~a[n-1]}是停留于输入次序的“无序段”;
+ 插入a[i]使a[0]~a[i-1]有序也就是要为a[i] 找到有序位置j(0<=j<=1)将a[i] 插入在a[j] 的位置上
![[微信截图_20221223162033.png]]
#### 三、寻找插入位置
![[微信截图_20221223182150.png]]
###### 如何寻找插入位置???
+ 顺序法:定位插入排序
+ 二分法:定位插入排序
+ 缩小增量:多遍插入排序

@ -0,0 +1,4 @@
采用顺序查找法查找插入位置
关键点:插入位置查找

@ -0,0 +1,23 @@
### 一、概念
基本概念:在待排序的数据中选出最大(小)的元素放在其最终的位置上
基本操作:
1. 首先通过n-1次关键字比较从n个记录中找出关键字最小的记录将它与第一个记录交换
2. 再通过n-2次比较从剩余的n-1个记录中找出关键字次小的记录将它与第二个记录交换
3. 重复上述操作共进行n-1趟排序后排序结束
![[微信截图_20221223144539.png]]
当i=1取21与后面的元素进行比较取小当遇到16时21与16进行交换此时还剩余一个元素再将16与8进行比较后将8最为最小排在前此时第一轮排序结束。
### 二、时间复杂度
+ 记录移动次数 O(n)
最好情况(已经有序)0
最坏情况(逆序)3(n-1)
+ 比较次数:无论待排序序列处于什么状态,选择排序所需进行的比较次数都相同
O(n*n)
### 三、算法稳定性
简单选择是不稳定排序

@ -0,0 +1,2 @@
### 定义
贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优。

@ -11,12 +11,13 @@
10. 哈希(散列表)原理概念理解(几种解决哈希冲突方式)
11. 并查集/不相交集合(优化和路径压缩)
12. 图论拓扑排序
13. 图论dfs深度优先遍历、bfs广度优先遍历
14. 最短路径Dijkstra算法、Floyd算法、spfa算法
15. 最小生成树prim算法、kruskal算法
16. 其他数据结构线段树、后缀数组等等
**待学习**
14. 图论dfs深度优先遍历、bfs广度优先遍历
15. 最短路径Dijkstra算法、Floyd算法、spfa算法
16. 最小生成树prim算法、kruskal算法
17. 其他数据结构线段树、后缀数组等等
## 二、经典算法
1. 递归算法(求阶乘、斐波那契、汉诺塔问题)
1. 递归算法(求阶乘、斐波那契、汉诺塔问题)
2. 二分查找
3. 分治算法(快排、归并排序、求最近点对等问题)
4. 贪心算法(使用较多,区间选点问题,区间覆盖问题)

Loading…
Cancel
Save