diff --git a/哈希原理(散列表).md b/哈希原理(散列表).md new file mode 100644 index 0000000..a6eb3af --- /dev/null +++ b/哈希原理(散列表).md @@ -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 p,(p是一个整数),取余 + 关键:如何选取合适的p? + 技巧:设表长度为m,取p<=m且为质数 ++ 随机数法 + +#### 如何解决hash冲突 ++ 开放地址法(开地址法) + 基本思想:有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入。 + 例:除留余数法H=(Hash(key)+d1)mod m,d1为增量序列 + 常用方法: + 线性探测法 d1为1,2,3,......m-1线性序列 + 二次探测法 d1为1平方,-1平方,-2平方......,二次序列 + 伪随机探测法 d1为伪随机数 ++ 链地址法(拉链法) + 基本思想:相同hash地址的记录链成一个单链表,m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构 + 步骤:step1,取数据元素的关键字Key,计算其哈希地址,若该地址对应的链表为空,则插入此链表,否则执行step2解决冲突 + step2,计算关键字Key的下一个存储地址,若该地址对应的链表不为空,则利用链表的前插法或后插法将该元素插入此链表 + 优点:非同义词不会冲突,无聚集现象 + 链表上节点空间动态申请,适合表长不确定的情况 + ![[微信截图_20221220170409.png]] + ++ 再散列法(双散列函数法) ++ 建立一个公共溢出区 + +#### 查找效率 +![[微信截图_20221220201301.png]] + ++ 哈希表技术具有很好的平均性能,优于一些传统的技术 ++ 链地址法由于开地址法 ++ 除留余数法作为哈希函数优于其他类型的函数 diff --git a/微信截图_20221219105340.png b/微信截图_20221219105340.png new file mode 100644 index 0000000..c917112 Binary files /dev/null and b/微信截图_20221219105340.png differ diff --git a/微信截图_20221219113815.png b/微信截图_20221219113815.png new file mode 100644 index 0000000..8eb66e3 Binary files /dev/null and b/微信截图_20221219113815.png differ diff --git a/微信截图_20221219121106.png b/微信截图_20221219121106.png new file mode 100644 index 0000000..4f78c3b Binary files /dev/null and b/微信截图_20221219121106.png differ diff --git a/微信截图_20221219203714.png b/微信截图_20221219203714.png new file mode 100644 index 0000000..460389e Binary files /dev/null and b/微信截图_20221219203714.png differ diff --git a/微信截图_20221220140739.png b/微信截图_20221220140739.png new file mode 100644 index 0000000..3529f8c Binary files /dev/null and b/微信截图_20221220140739.png differ diff --git a/微信截图_20221220170409.png b/微信截图_20221220170409.png new file mode 100644 index 0000000..7350e97 Binary files /dev/null and b/微信截图_20221220170409.png differ diff --git a/微信截图_20221220201301.png b/微信截图_20221220201301.png new file mode 100644 index 0000000..d9ab9b1 Binary files /dev/null and b/微信截图_20221220201301.png differ diff --git a/微信截图_20221221112416.png b/微信截图_20221221112416.png new file mode 100644 index 0000000..b6e9a8a Binary files /dev/null and b/微信截图_20221221112416.png differ diff --git a/微信截图_20221221113754.png b/微信截图_20221221113754.png new file mode 100644 index 0000000..f70dca6 Binary files /dev/null and b/微信截图_20221221113754.png differ diff --git a/微信截图_20221221130542.png b/微信截图_20221221130542.png new file mode 100644 index 0000000..f250d94 Binary files /dev/null and b/微信截图_20221221130542.png differ diff --git a/微信截图_20221221130828.png b/微信截图_20221221130828.png new file mode 100644 index 0000000..3bd0ba8 Binary files /dev/null and b/微信截图_20221221130828.png differ diff --git a/微信截图_20221221131248.png b/微信截图_20221221131248.png new file mode 100644 index 0000000..e44c763 Binary files /dev/null and b/微信截图_20221221131248.png differ diff --git a/微信截图_20221223144539.png b/微信截图_20221223144539.png new file mode 100644 index 0000000..20b7d1a Binary files /dev/null and b/微信截图_20221223144539.png differ diff --git a/微信截图_20221223162033.png b/微信截图_20221223162033.png new file mode 100644 index 0000000..cd327ac Binary files /dev/null and b/微信截图_20221223162033.png differ diff --git a/微信截图_20221223182150.png b/微信截图_20221223182150.png new file mode 100644 index 0000000..2a0d29b Binary files /dev/null and b/微信截图_20221223182150.png differ diff --git a/微信截图_20221230143349.png b/微信截图_20221230143349.png new file mode 100644 index 0000000..24cd7bf Binary files /dev/null and b/微信截图_20221230143349.png differ diff --git a/日常学习/数据结构/哈夫曼树(最优二叉树).md b/日常学习/数据结构/哈夫曼树(最优二叉树).md index 328cea9..1c90437 100644 --- a/日常学习/数据结构/哈夫曼树(最优二叉树).md +++ b/日常学习/数据结构/哈夫曼树(最优二叉树).md @@ -10,3 +10,28 @@ 树的带权路径长度越小可以认为性能越好 +### 二、哈夫曼树的特点 + ++ 具有相同带权结点的哈夫曼树不唯一 ++ 哈夫曼树中权值越大的叶子离根越近 + +![[微信截图_20221219105340.png]] + + +### 三、如何构造哈夫曼树 +口诀: + 1. 构造森林全是根 + 2. 选用两小造新树 + 3. 删除两小添新人 + 4. 重复2、3剩单根 + +![[微信截图_20221219113815.png]] + +### 四、哈夫曼树的应用 + +#### 1. 设计一个既能节省空间、有没有重码的编码 + 1.统计字符集中每个字符在电文中出现的平均概率(概率越大、要求编码越短) + 2.将每个字符的概率值作为权值,构造哈夫曼树。(利用哈夫曼树的特点:权越大的叶子离根越近;概率越大的结点,路径越短) + 3.在哈夫曼树的每个左分支标0、右分支标1,把从根到每个叶子结点路径上的标号连接起来,作为该叶子代表的字符编码,即哈夫曼编码。 + +![[微信截图_20221219121106.png]] diff --git a/日常学习/算法/DFS(深度优先搜索Depth First Search).md b/日常学习/算法/DFS(深度优先搜索Depth First Search).md new file mode 100644 index 0000000..1f1455c --- /dev/null +++ b/日常学习/算法/DFS(深度优先搜索Depth First Search).md @@ -0,0 +1,2 @@ +### 一、基本概念 +深度优先遍历类似于树的先根遍历 \ No newline at end of file diff --git a/日常学习/算法/折半插入排序.md b/日常学习/算法/折半插入排序.md new file mode 100644 index 0000000..74728e9 --- /dev/null +++ b/日常学习/算法/折半插入排序.md @@ -0,0 +1,8 @@ +可以理解为使用二分查找寻找插入位置 +![[微信截图_20221230143349.png]] ++ 折半查找比顺序查找快,所以折半插入排序平均性能比直接插入排序快 ++ 折半插入排序所需要的关键码比较次数与待排序对象序列的初始排序无关,仅依赖于对象个数。在插入对象时,需要经过[log2i]+1 次关键码比较,才能确定它插入的位置; ++ 折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列 + +时间复杂度O(n平方) +空间复杂度O(1) diff --git a/日常学习/算法/拓扑排序.md b/日常学习/算法/拓扑排序.md new file mode 100644 index 0000000..55b386b --- /dev/null +++ b/日常学习/算法/拓扑排序.md @@ -0,0 +1,29 @@ +### 一、概念 +**基于有向无环图(DAG)**:图中没有回路的有向图 +![[微信截图_20221221112416.png]] + +**AOV网**(拓扑排序) + 用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为**顶点表示活动的网**,简称AOV网。 + **特点:1. 若从i到j有一条路径,则i是j的前驱,j是i的后继 + 2. 若是网中有向边,则i是j的直接前驱,j是i的直接后继 + 3. AOV网中不允许有回路,因为如果有回路存在,则表明某项活动以自己为先决条件,这是不允许的** + **问题**: + 1. 如何用程序判断AOV网中是否存在回路(个人理解为死循环)? + 2. 有了AOV网,怎么排序? +**AOE网**(关键路径) + 用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以弧表示活动,以顶点表示活动的开始或者结束事件,称这种有向图为边表示活动的网,简称AOV网。 + +**拓扑排序** + 在AOV网没有回路的前提下,我们将全部活动排列成一个线性序列,使得若AOV网中有弧存在,则在这个序列中,i一定排在j的前面,具有这种性质的线性序列成为**拓扑有序序列**,相应的拓扑有序排列的算法成为拓扑排序。 + 步骤:1. 找到一个没有前驱的顶点,以顶点为弧尾的弧删除,并将顶点作为排序节点例如C1(找顶点可以遵循从小到大原则) + 例: + ![[微信截图_20221221130828.png]] + ![[微信截图_20221221130542.png]] +### 二、拓扑排序例子 +#### 1.排课表 +![[微信截图_20221221113754.png]] + +### 三、检测AOV网中是否存在环 + +对DAG构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。如图所示,C3,C6,C8就构成了环,所以不在拓扑序列中。 +![[微信截图_20221221131248.png]] \ No newline at end of file diff --git a/日常学习/算法/插入排序.md b/日常学习/算法/插入排序.md new file mode 100644 index 0000000..119dfad --- /dev/null +++ b/日常学习/算法/插入排序.md @@ -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]] +###### 如何寻找插入位置??? ++ 顺序法:定位插入排序 ++ 二分法:定位插入排序 ++ 缩小增量:多遍插入排序 diff --git a/日常学习/算法/直接插入排序(双指针).md b/日常学习/算法/直接插入排序(双指针).md new file mode 100644 index 0000000..748ca4c --- /dev/null +++ b/日常学习/算法/直接插入排序(双指针).md @@ -0,0 +1,4 @@ +采用顺序查找法查找插入位置 + +关键点:插入位置查找 + diff --git a/日常学习/算法/简单选择排序.md b/日常学习/算法/简单选择排序.md new file mode 100644 index 0000000..d0c007d --- /dev/null +++ b/日常学习/算法/简单选择排序.md @@ -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) + +### 三、算法稳定性 + +简单选择是不稳定排序 \ No newline at end of file diff --git a/日常学习/算法/贪心算法.md b/日常学习/算法/贪心算法.md new file mode 100644 index 0000000..2d8a749 --- /dev/null +++ b/日常学习/算法/贪心算法.md @@ -0,0 +1,2 @@ +### 定义 + 贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优。 \ No newline at end of file diff --git a/日常学习/算法与数据结构.md b/日常学习/算法与数据结构.md index eee8079..580a3ea 100644 --- a/日常学习/算法与数据结构.md +++ b/日常学习/算法与数据结构.md @@ -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. 贪心算法(使用较多,区间选点问题,区间覆盖问题) diff --git a/未命名.md b/未命名.md new file mode 100644 index 0000000..e69de29