![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法学习笔记
文章平均质量分 93
97Marcus
盼望成为offer收割机的菜花
展开
-
数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配
无权图中,如何找到图中点与点之间的最短路径?(前提:有边 有权重)最大流问题是一种组合最优化问题,指的是如何充分利用装置的能力,使得运输的流量最大以取得最好的效果。1、构建残量图2、找一条简单路径,找到路径上的瓶颈值(当前路径所允许流过的最大流量),更新残量图路径权值,并将瓶颈值所在边擦除,重复该操作,直到无简单路径。1、构建残量图2、找一条简单路径,找到路径上的瓶颈值(当前路径所允许流过的最大流量),更新残量图路径权值,并将瓶颈值所在边擦除。3、添加反向路径上例左图为原图,根据原图可容易看出最大流为走s→原创 2022-06-16 17:58:30 · 525 阅读 · 0 评论 -
数据结构与算法学习笔记14:动态规划 / 位运算 / 格雷码 / 异或
将一个大问题拆解成几个子问题,分别求解这些子问题,即可推断出大问题的解。动态规划和分治法很类似,但动态规划并**不满足分治法中“子问题的解相互独立”**这一性质。空间换时间。有点暴力的剪枝的感觉,暴力是把所有的都列出来,动态规划是只要可行解。无后效性: 如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响。(未来与过去无关,一旦f(w)确定,就不关心如何凑出f(w)了)最优子结构:大问题的最优解可以由小问题的最优解推出。一个问题能否用动态规划来解决?1、分阶段(大问题->子问题)2原创 2022-06-15 14:35:50 · 166 阅读 · 0 评论 -
数据结构与算法学习笔记13:桶排序+基数排序
针对于位数相同的小数的排序,将数据分成多个组,各组之内各自排序。利用的是哈希的思想。对于待排序序列大小为 N,共分为 M 个桶,主要步骤有:N 次循环,将每个元素装入对应的桶中O(N)O(N)O(N);M 次循环,对每个桶中的数据进行排序(平均每个桶有 NM\frac{N}{M}MN 个元素),一般使用较为快速的排序算法,快速的排序算法时间复杂度为 O(NlogN)O(NlogN)O(NlogN),因此每个桶的时间复杂度为∑O(NM∗logNM)∑ O(\frac{N}{M}*log\frac{N}{M}原创 2022-06-12 17:57:22 · 135 阅读 · 0 评论 -
数据结构与算法学习笔记12:排序分析/快速排序/归并排序/堆排序/递归时间复杂度/STL及C++的Sort底层实现
T(n)={O(1),n=n0aT(nb)+f(n),n>n0T(n)=\begin{cases} O(1), n=n_0\\aT(\frac{n}{b})+f(n), n>n_0\end{cases}T(n)={O(1),n=n0aT(bn)+f(n),n>n0最好时间复杂度(理想情况下);最坏时间复杂度(时间消耗的上限)空间复杂度(有无new、malloc、递归)是否稳定(判断数值相同的两个元素在排序前后的相对位置是否发生变化)稳定性的意义:为了排序完成之后维持与原数据的相对性分治法的原创 2022-06-11 18:05:23 · 231 阅读 · 0 评论 -
数据结构与算法学习笔记11:二叉树层打印/跳表/冒泡排序/选择排序/插入排序/希尔排序/计数排序
如何将一颗二叉树按层打印,一层输出到一行上?随机结构的有序链表通过建立索引的方式,对于数据量越大的有序链表,通过建立多级索引,查找效率提升会非常明显。一般高度都设定为log2nlog_2 nlog2n!二分法也是log2nlog_2 nlog2n,那么为什么要用跳表呢?核心思想:比较相邻的元素。如果第一个比第二个大,就交换他们两个。若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:Cmin=n−1,Mmin=0C_{min}=n-1,M_{min}=0C原创 2022-06-10 19:10:33 · 209 阅读 · 0 评论 -
数据结构与算法学习笔记10:图/深度广度遍历/最小生成树/最短路径算法/拓扑排序
**有向图:**图中的边有次序性且有方向性 和 两条边**无向图:**图中的边无次序性且无方向性 (v1,v3)和(v3,v1) 同一条边**有向完全图:**图中所有顶点间所有可能的边均存在,其数量为An2A_n^2An2,即为n(n−1)n(n-1)n(n−1)**无向完全图:**图中所有顶点间所有可能的边均存在,其数量为Cn2C_n^2Cn2,即为n(n−1)2\frac{n(n-1)}{2}2n(n−1)**有向连通图:**图中所有相异的成对顶点均有路径可通(1能............原创 2022-06-09 14:49:48 · 306 阅读 · 0 评论 -
数据结构与算法学习笔记9:哈夫曼树和字典树
需要明晰定义:权值/带权节点/路径长度/带权路径长度WL/树的所有叶结点的带权路径长度之和WPL路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为原创 2022-06-07 15:10:59 · 223 阅读 · 0 评论 -
数据结构与算法学习笔记8:B树和B+树
适合做索引的要求是搜索速度快,主要有以下三种结构:多路平衡搜索树B-Tree 是B树 中间是杠 不是B减树 别犯傻!!几阶就是几叉的意思~对于m阶的B树来说:1、每个节点最多有m-1个关键字2、根节点最少有1个关键字3、每个节点最少有ceil(m-2)-1个关键字(ceil是向上取整的意思)4、每个节点的关键字都按照从小到大的顺序排列,每个关键字的左子树的所有关键字都小于它,右子树的所有关键字都大于它5、所有叶子节点都位于同一层插入的键值对也成为记录;如果要插入的记录已经存在,需要将插入的value替换掉旧原创 2022-06-02 20:29:34 · 167 阅读 · 0 评论 -
数据结构与算法学习笔记7:红黑树
数据结构与算法学习笔记7:红黑树红黑树特点红黑树的创建查找(节点添加的位置)节点添加(新来节点是红色的)代码删除分析代码应用红黑树优势红黑树在Linux底层应用:Linux中的epoll模型红黑树AVL 绝对平衡(高度差)红黑树 相对平衡(颜色)红黑树是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 可以在O(log2n)O(log_2n)O(log2n)时间内做查找,插入和删除,这里的原创 2022-05-10 13:16:13 · 131 阅读 · 0 评论 -
数据结构与算法学习笔记6:BST二叉搜索树
数据结构与算法学习笔记6:BST二叉搜索树 BSTBST的创建BST的删除如何将一棵排序二叉树转变为有序的双向链表?BST的旋转右旋(左的左引起的不平衡时进行)父子关系:左旋(右的右引起的不平衡时进行)父子关系:左右旋VS右左旋二叉搜索树 BSTBST的创建创建思路:如果树为空,那么来了就是根非空,新结点和父节点比较,比父节点大进右子树,比父节点小进左子树创建代码void AddNode(BinaryTree **pTree,int nNum){ //数值放入节点原创 2022-05-05 17:07:31 · 481 阅读 · 0 评论 -
数据结构与算法学习笔记5:二叉树
数据结构与算法学习笔记6树二叉树**二叉树的特性:****满二叉树 vs 完全二叉树**完全二叉树的特性:二叉搜索树 / 排序二叉树 (Binary Search Tree)二叉树的创建(粗暴版)遍历深度**前序遍历:****中序遍历:****后序遍历:**广度层序遍历:二叉树的创建(前序递归版)如何创建完全二叉树树树:一对多[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TNn0JnUX-1651567717166)(https://cdn.jsdelivr.n原创 2022-05-03 16:49:23 · 781 阅读 · 0 评论 -
数据结构与算法学习笔记4:递归+分治法
数据结构与算法学习笔记4递归斐波那契数列青蛙跳台阶问题链表倒序打印分治法二分查找/折半查找 Binary Search题目1:快速幂题目2:如何判断一个数是否为2的次幂递归指在函数的定义中使用函数自身的方法。(在栈区消耗空间)特点:① 必须可以分解成若干个规模较小,但是与原问题形式相同的子问题。并且这些子问题可以用完全相同的解决思路来进行解决。② 递归问题的演化过程是一个把原问题从大到小进行拆解的过程,并且会有一个明确的终点。最后从这个临界点开始,把小问题的答案原路返回,原问题便得以解决。原创 2022-04-23 16:54:46 · 1262 阅读 · 0 评论 -
数据结构与算法学习笔记3:字符串+哈希表
数据结构与算法学习笔记3字符串常见函数题目1 替换空格2 单词倒置3 字符移位KMP 字符串匹配算法前缀 后缀概念KMP 算法分析代码Sunday 算法分析代码哈希表 HashTable/散列表哈希表创建散列函数解决哈希冲突的方法代码(基础版~)字符串C++中有string本文暂讨论C语言中char,下为两种定义方式char *str = “Haha”; // 字符常量区 , 不能重新赋值str这个指针指向"Haha"这个字符串(位于字符常量区,只能读,不能写),str是指针,占用4个字节,原创 2022-04-19 23:00:02 · 482 阅读 · 0 评论 -
数据结构与算法学习笔记2:栈和队列
数据结构与算法学习笔记2栈 stack堆和栈的区别静态变量tips跨文件使用tips:关键字extern指针传递队列 queue队列类型:单端队列:循环队列:**r+1%n**?**循环队列如何判断队列为空or为满?**栈和队列 相关题目括号匹配问题约瑟夫环问题队列和栈的相互转换栈 stack受限线性表先进后出 FILO题外话:堆和栈是内存区域的问题,栈和队列是数据结构的问题,两者没有任何关系。堆和栈的区别申请空间的方式和回收不一样。堆区的空间要向系统申请,malloc和new,原创 2022-04-18 18:12:36 · 379 阅读 · 0 评论 -
数据结构与算法学习笔记1:数组+链表
数据结构与算法学习笔记1效率时间复杂度(Time Complexity)空间复杂度(Space Complexity)一对一:线性结构数组查找增加/删除: O(n)数组元素的跨界访问题1链表增加/删除倒置链表折叠顺序链表合并回文链表链表形式的加法复杂/随机链表的复制单向链表相交问题单向链表是否有环效率时间复杂度(Time Complexity)最好/最坏/平均遵循的原则:复杂度与其具体的常系数无关。多项式级复杂度相加的时候,把其高项作为结果。O(1)含义为,某个任务通过有限可数的资源原创 2022-04-17 15:02:10 · 428 阅读 · 0 评论