数据结构(算法)

news2024/11/24 5:42:31

总结,建议看EXCEL的《算法》页签,不然感觉有点乱

   备注原理/步骤时间复杂度空间复杂度
串的应用模式匹配简单/暴力O(mn)
 KMP  O(m+n) 
树的应用哈夫曼树
1、带权路径长度WPL
2、外部排序-最佳归并树
1、哈夫曼树的度,只有0和m(m叉树)(王道P176
2、哈夫曼编码,是从根结点到叶子结点的路径上的01组合(
王道P180.T4
3、同一组编码/权值,构造出来的哈夫曼树可以不同【自己举个例子就知道了】(
王道P180.T6A
4、路径长度指:Σ(叶子结点的值 x 到根的长度数),之和【领悟:哈夫曼树的构造,除了第一次用m个数据(如0、2、3),其他每次只用m-1个数据(因为有1个数据是来自下一层的和)】

王道.P359.T07
  并查集
1、Kruskal,克鲁斯卡尔(王道.P182.T10)
2、无向图的连通性判断
    
 图的存储邻接矩阵O( |V|2 )
 邻接表删除,某个顶点相关的所有边
有向图:O( |V| + |E| )
无向图:O( |V| + 2|E| )
有向图:O( |V| + |E| )
 十字链表(有向图)顶点表:[data,edge1,edge2]
边表:[弧尾点,弧头点,弧头指针,弧尾指针,info]
O( |V| + |E| )
  邻接多重表(无向图)顶点表:[data,edge]
边表:[点1,点2,指针1,指针2,info]
  O( |V| + |E| )
 图的遍历BFS,广度优先1、队列
2、相当于树的层次遍历
像波纹一样推开遍历邻接矩阵:O( |V|2 )
邻接表:O( |V| + |E| )
O( |V| )
  DFS,深度优先1、栈
2、相当于树的先序遍历
3、可用于判断有向图是否有回路
4、逆拓扑排序(王道P210.T11
1、一条路走到黑
2、再退一步,再走到黑
图的应用I 最小生成树
1、权值的和为最小
2、
没有权值相同的边,生成树的树形唯一
3、最小生成树的代价一定是唯一的(王道P228.T18
Prim,普利姆
只与有关
贪心算法
1、n个结点,时间复杂度,与边无关(因为是选n-1边,没选到的边,再多也无用),适合稠密图
2、n个结点,1个最小的,其余n-1个相等的值,从不同的顶点开始Prim算法,则会得到n-1种不同的最小生成树
(王道.P228.T18.III)
1、一个顶点选连接的最小的边(最小边:将已经连接的点,作为整体,看与未连接的边的权重/值,最小的一个),选完:若构成环,则去掉刚选的边,退到上一个顶点
2、结束:所有顶点都连接时
O( |V|2 )
 普克(扑克)Kruskal,克鲁斯卡尔
只与有关
贪心算法
适合边稀疏1、所有边从小到大排序,依次选择:若构成环,去掉继续选下一个
2、结束:所有顶点都连接时
 O( nlog2n ),n是边
 II 最短路径
简单路径
BFS,广度优先1、无权单源(点到点)
2、只能无向图(权值为1或相同)
/邻接矩阵:O( |V|2 )
邻接表:O( |V| + |E| )
 广迪弗(甘道夫)Dijkstra,迪杰斯特拉
贪心算法
1、带权单源(点到点)
2、负权值、负回路不适用
1、主要3个元素:标记、距离、前驱
2、选一个点先初始化
3、①选中距离最小未标记的点,标记置为True;②更新由点到其他未标记的距离、前驱
4、结束:所有结点标记都为True
O( |V|2 )
  Floyd,弗洛伊德1、带权所有顶点
2、负回路不适用
1、A[i][j] > A[i][*] + A[*][j],选择一个"点*"作为转中点,到其他点的距离更新
2、每次选择都需要更新邻接矩阵
O( |V|3 )O( |V|2 )
 III 有向无环图描述表达式
DAG,Directed Acyclic Graph
 最底层的元素都只有一个1、先按顺序写出所有的字母,作为最底层的元素
2、依次往上连接符号,表示一个小的运算
 IV 拓扑排序
AOV,Activity On Vertex Network
1、有拓扑序列就不存在回路
∵要选入度为0,回路是环,不存在入度为0的结点
2、每个顶点出现仅有一次
3、可能排序不唯一
4、A排在B前面,则不存在 B —>A 的路径
依次选择入度为0的点
       逆拓扑排序·DFS,深度优先,出栈时读出DFS,可得逆拓扑顶点有序序列依次选择出度为0的点
 V 关键路径
AOE,Activity On Edge Network
 1、缩短所有关键路径上共有的任意一个关键活动的时间,才可以缩短关键路径长度
2、
e(i):事件最早发生时间
l(i):事件最迟发生时间
ae(i):活动最早发生时间
al(i):活动最迟发生时间
d=ae(i)-al(i),为0就是关键活动
从起点到结束点,长度最大的路径  平均查找长度 ASL
类似EX数学期望
查找线性结构顺序查找1、数组、链表均可
2、每个元素查找成功的比较次数只与位置有关,与是否有序无关,王道.P253.T2
O(n)一般:ASL成功 = ΣPi(n-i+1)
等概率:
ASL
成功 = (n+1)/2
ASL
不成功 = n+1
王道.P250推导
 折半查找
二分查找
1、必须有序,且只能用顺序存储(数组)
2、平衡二叉树
3、(low+high)/2 结果:向上取整或向下取整,但一棵树只能二选一王道.P254.T12/T21
查找:O(log2n)
插入删除:O(n)
等概率:ASL成功 ≈log2(n+1)-1
王道P252例子
P254T13/T18
 分块查找1、块内随意,块间有序;折半查找索引表,顺序查找块内表
2、索引表:一个块的最大的关键字,和第一个元素的位置
3、最理想的块长:√n,且平均查找长度为 (√n) +1
1、先查索引表(顺序查找/(数组时)二分查找)
2、块内顺序查找
  (b+1)/2 + (s+1)/2
分为 b 块,每块有 s 个记录,王道.P254.T16
 树形结构二叉排序树BST
 - 二叉查找树
 - 左 < 根 < 右
0、空树也是二叉排序树
1、可以形成单支树,查找长度为 n,时间复杂度是O(nlogn)
2、中序遍历,会得到一个递增的序列
3、
叶结点,删除后插入,与原树一定相同
非叶结点,删除后插入,与原树一定不同
王道.P276.T21
左子树结点的值 < 根结点的值 < 右子树结点的值查找:O(log2n)/O(n)
插入删除:O(log
2n)
平衡二叉树AVL
-
发明者G. M. Adelson-Velsky和E. M. Landis
 - 是特殊的二叉排序树
0、
 - 空树也是平衡二叉树
 - 平衡因子:左子树高度-右子树高度
 - LL、RR、LR、RL 4种破坏平衡的方式
1、左右子树高度差不超过1
2、不一定是完全二叉树
3、
n0=0,n1=1,n2=2
n
h = nh-1 + nh-2 +1
构造
最大高度 h 的平衡二叉树,所需的最少的结点数nh王道.P275.T10/T11),此时非叶结点的平衡因子为1(王道.P276.T20
4、平衡二叉树,叶结点/非叶子结点,删除后插入,与原树可能相同也可能不同(
王道.P276.T25
 O(log2n) O(log2n)
 B树,多路平衡查找树

1、B树只支持随机查找,B+树支持顺序查找、随机查找(∵B+树的叶子结点包含全部关键字信息,∴支持顺序)
2、
1、每个结点: [(m/2)向上取整]-1 ≤ 关键字 ≤ m-1(王道.P290.T01
2、平衡因子=0,绝对平衡,所有叶子结点都在同一层
3、高度 h ,m 阶B树:(
王道.P291.T06
①结点数最少:2
h - 1(满二叉树)
②结点数最多:m
h - 1(满m叉树)
4、外部结点不算层数
5、m阶,n个点,最大高度、最小高度 P287(
王道.P291.T08/T09
 B+树1、用于各种索引:文件索引、数据库索引    
散列表(哈希表)
散列函数(哈希函数)

1、适合关键字集合与地址集合之间存在对应关系
2、平均查找长度ALS
 - 与表长、元素都
无关
 - 与散列函数、处理冲突的方法、装填因子有关
3、装填因子α = 已有记录数/表长度
α越大
 - 表示哈希表的装满的程度
 - 越容易发生冲突(
王道.P302.T06
∴想要提高查找效率,需要
减小装填因子
4、探测:插入前检测次数(
王道.P302.T07
处理冲突的方法1
开放地址法
Hi = [ H(key) + di ] % m
删除时只能是假删除,否则影响查找
I 线性探测法1、映射后,一直探测到下一个可以存放的地址
2、会出现元素堆积/聚集(同义词与非同义词发生冲突都可以造成堆积),大大降低查询效率
3、细节:空的也会消耗1次对比的机会(
王道.P303.T17/T18
di = 0 1 2 3 … m-1理想情况:O(1)
 II 平方探测法1、m 是一个 4k+3 的质数
2、有效避免堆积
di = 02 12 -12 22 -22 … k2 -k2
 III 伪随机序列法di = 一个随机数列,可以自己定义
 IV 双散列法,再散列法,再哈希法k=Hash1(key)
d=Hash2(key)
探测顺序:(k+d)%n、(k+2d)%n、(k+3d)%n…
处理冲突的方法2
拉链法
链接法,链接地址法1、不会发生堆积数组下标作为指针的起始,用链表存数据  稳定性
排序插入排序直接插入1、不考虑哨兵的比较
 - 最坏的情况需要 n(n-1)/2 次比较
 - 最好的情况只要 n-1 次比较,有序,第一个元素视为已经排好序的,后面每个元素都只要比较1次,所以只要n-1次比较
1、第1个元素视为有序,无序消耗比较次数
2、第i个元素前面都是有序的
3、从后往前,找插入位置,然后进行插入
最好,初始化序列原本有序:O(n)
平均:O(n2/4),所以是O(n2),和最坏一样
最坏,初始化序列刚好逆序:O(n
2)
O(1),每次只要常数个辅助单元Y,先比较,再移动


 - 不稳定4个:希尔选择快速堆,选的太快不稳定
 - 不能原地工作的3个内部排序:基数O(max(r))、快速O(log2n)、归并O(n)【鸡块饼,占空间】
 - 原地工作:空间复杂度O(1)

https://www.cnblogs.com/Xieyang-blog/p/8340578.html+B34
1、时间复杂度(比较+移动)与序列初始状态无关:
 - 选择排序
 - 堆排序
 - 归并排序
 - 基数排序
(口诀:一堆乌龟选基友,和初始状态无关)
2、排序趟数和原始状态有关:2个交换排序都有关(冒泡 + 快速)
3、利用顺序存储的随机访问特性(采用链式会降低速度):
 - 希尔排序
 - 堆排序
 折半插入
二分插入
数组因为是在有序表中查找插入位置,所以查找可以先采用二分查找,再移动元素O(n2)O(1)Y
 希尔排序
缩小增量排序
数组,不适用于链表1、%d 的为一组(d=间隔+1,王道.P316.T08),然后使用直接插入排序同组元素
2、d减小,再进行排序
最好/平均O(n1.3)
最坏:O(n2)
O(1)N,相同元素在不同组时,可能发生位置变化
交换排序
两两比较,次序相反的就交换,直到所有数据没有反序为止
冒泡排序
起泡排序
 - 最坏的情况,刚好逆序,比较和交换次数相同,都需要 n(n-1)/2 次
 - 适用于:数组、链表
 - 在一趟排序过程中,没有发生交换,则算法可以提前结束
1、每次都是从头到尾,两两比较,满足条件的两两交换
2、细节:每次冒泡就确定了本趟“最后元素”的位置,剩余趟数就不用消耗比较次数
王道.P323.T08
最好,有序:O(n)
最坏/平均,逆序:O(n2)
O(1)Y
 快速排序
递归排序
1、待排序列最适合采用:顺序存储(40811T10
2、"有序快排最慢"原则,有序每次划分是 0 和 n-1 个元素
每次将表分为长度相近的两个子表时最快(
王道.P323.T9
3、
递归次数/趟数:
 - 对尚未确定最终位置的所有元素进行一遍处理。如:第二趟需要都处理左右两个子块才算一趟(
王道.P324.T17
 - 与初始数据的排列次序
有关("有序最慢"原则)
 - 与划分后的分区处理前后顺序无关(408.10T10)
4、每一趟排序后,基准值元素,会放在最终的位置
选一个基准值,用两个前后两个指针 i、j:
1、比基准值大,将元素放在j,然后j=j-1
2、比基准值小,将元素放在i,然后i=i+1
3、与基准值相等,不处理

i==j时,左右继续重复上述操作,递归
最好/平均O(nlog2n),最平衡的划分,每次划分,左右元素个数差不多都是n/2
最坏:O(n2),有序元素
递归工作栈,需要空间
最小:O(log2n)
最大:O(n)
N,同右侧的相同元素,都小于基准值,都要移去左边,那么这2个相同的元素相对位置会改变
选择排序
在所有记录中,每次选择最小的,放在最后/前面
选择排序1、数组、链表均可
2、比较次数与初始状态无关,n个元素都需要 n-1 趟
1、每次都要遍历排好序之后的待排序列
2、选择最小的数,与无序的第一个数交换
比较次数:O(n2),2层for循环
移动次数:O(n)
O(1)

图形用户界面, 应用程序  描述已自动生成

手机屏幕的截图  描述已自动生成

手机屏幕的截图  描述已自动生成

N
 堆排序1、在1亿个数里面找出100个最小值,用大根堆(根 ≥ 左、右)
2、堆是用来排序的,其查找效率不高
3、堆,必须是一个完全二叉树
1、破坏堆(取出根值,并用完全二叉树的最后一个元素填充根值)
2、
恢复堆
插入/删除:O(log2n)
构建堆:O(n)
排序:O(nlog
2n)
O(1)N
 胜者树
 - 竞赛树排序
 - 其实就是败者树
  O(nlog2n)  
归并排序归并排序1、N个元素,k路归并,趟数m:km = N
2、m = [log
kN]向上取整,趟数
2路归并:
2个元素/2个块/2个小组,进行1对1比大小,合并成一组,组成新的有序数列
2路归并:
O(nlog
2n),每一趟是O(n),一共 log2n 趟
O(n),合并需要n个辅助单元Y
基数排序
分配(收集)排序
基数排序适用于
1、n比较大
2、r比较小
3、方便拆,且d比较小

不适用:float、double的实数
将n个元素每一个可以拆成d个关键字,每一个关键字有自己的r基数范围O( d·(n+r) )O(max(r))Y
外部排序归并排序1、外部排序时间 = 读写外存的时间 + 内部排序所需时间 + 内部归并所需时间
2、优化思路:减少读写外存的趟数:多路归并,可以减少趟数
2路归并需要在内存分配2个输入缓冲区
4路归并需要在内存分配4个输入缓冲区
r个初始归并段,做K路归并
3、内存中任意一个输入缓冲区空了,需要立即从磁盘中加载一个块继续在内存中排序
1、生成初始的归并段(让内部有序,每一块都需要读、写一次
2、归并2的次方个“归并段”
优化1:
败者树(选择排序)
优化2:
置换-选择排序 + 最佳归并树(哈夫曼树)
1、置换-选择排序:生成不确定但更长的初始归并段
实际是一个一个先放在CPU输出缓冲区,当缓冲区满了才放回磁盘

2、最佳归并树/哈夫曼树
 - 初始归并段的长度 = 每段中的整块数
 - m路归并,初始段有x个,则需: (x-1)%(m-1) = u ≠ 0时,需要 m-1-u 个0的虚段
 - 读写次数 = 2 · WPL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——十个槽位,RWX

Linux——RWX 十个槽位 - 表示文件 d 表示文件夹 l 表示软链接 r权&#xff0c;针对文件可以查看文件内容 针对文件夹&#xff0c;可以查看文件夹内容&#xff0c;如ls命令 w权&#xff0c;针对表示可以修改此文件 针对文件夹&#xff0c;可以在文件夹内&#…

深入理解k8s kube-proxy

1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的&#xff0c;真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…

C++11 数据结构1 线性表的概念,线性表的顺序存储,实现,测试

一 线性表的概念 线性结构是一种最简单且常用的数据结构。 线性结构的基本特点是节点之间满足线性关系。 本章讨论的动态数组、链表、栈、队列都属于线性结构。 他们的共同之处&#xff0c;是节点中有且只有一个开始节点和终端节点。按这种关系&#xff0c;可以把它们的所有…

选择正确的Go Module Path

最近我在查看项目代码时&#xff0c;注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法&#xff0c;相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path&#xff0c;但这…

使用快捷回复软件的好处

在现代的客服工作中&#xff0c;尤其是店铺大促期间&#xff0c;咨询量的激增往往让客服人员应接不暇。即使打字速度再快&#xff0c;也难以跟上源源不断的客流。想应对这样的情况&#xff0c;快捷回复软件就非常适合客服人员了。 以我个人正在使用的客服宝为例&#xff0c;我想…

(Java)数据结构——图(第五节)Kruskal的实现最小生成树(MST)

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Kruskal算法&#xff08;Kruskal的实现原理&#xff09; Kruskal算法的原理&#xff1a; 就是每次取最小的边&#xff0c;看看是不是与已经选择的构成回路&#x…

面向对象设计原则实验“依赖倒置原则”

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。 &#xff08;开闭原则、里氏代换原则和依赖倒转原则的三个实例很相似&#xff0c;原因是它之间的关系很紧密&#xff0c;在实现很多重构时通常需要同时使用这三个原则。开闭…

计算机网络-TCP断开连接阶段错误应对机制

连接断开阶段 四次挥手机制&#xff1a;TCP连接的断开需要四次挥手&#xff0c;这是因为双方都需要独立地关闭数据传输。第二次和第三次挥手不能合并&#xff0c;因为在回复第二次挥手的时候&#xff0c;可能还有数据没有接收完成&#xff0c;所以需要先回复ACK报文&#xff0c…

css面试题---场景应用

1、实现一个三角形 css一般用border属性实现三角形。 div {width: 0;height: 0;border: 100px solid;border-color: orange blue red green; } // 三角形一 div {width: 0;height: 0;border-top: 50px solid red;border-right: 50px solid transparent;border-left: 50px soli…

竞赛 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

免费HTTPS证书在线申请

申请HTTPS证书的流程如下&#xff1a; 1. 确定证书类型&#xff1a; - 根据你的网站用途&#xff08;如个人博客、企业官网、电商、金融等&#xff09;和信任级别要求&#xff0c;选择适合的证书类型&#xff0c;如DV&#xff08;域名验证&#xff09;、OV&#xff08;组织验证…

[论文笔记] Pai-megatron Qwen1.5-14B-CT 后预训练 踩坑记录

1. 模型权重转换报错 hf2mcore_1.5_v2.py 报错为: /mnt/cpfs/kexin/dlc_code/qwen1.5/PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen/hf2mcore_1.5_v2.py 正确文件替换如下,更改了477行,删除了 args.hidden_size 这个维度,在tp>1时也支持转换: eli…

如何将h5网页打包成iOS苹果IPA文件

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;最近有很多小伙伴都被难住了&#xff0c;是什么问题给他们都难住了呢&#xff0c;许多小伙伴都说想要把h5网页打包成iOS苹果IPA文件&#xff0c;但是却不知道具体怎么操作&#xff0c;是怎么样的一个流程…

强化学习的数学框架:马尔科夫决策过程 MDP

文章目录 1. 什么是马尔科夫过程2. 强化学习与MDP的关系3. 价值函数的贝尔曼方程[^1]3.1 状态价值函数的贝尔曼方程3.2 动作价值函数的贝尔曼方程3.3 价值函数递推关系的转换 4. 最优价值函数5. MDP计算最优值函数实例[^2] 1. 什么是马尔科夫过程 马尔科夫过程&#xff08;Mar…

如何用酷鸟云进行iOS上架?

众所周知&#xff0c;大部分苹果开发者通常会上架多个马甲包应用&#xff0c;以获得更多流量和收益。这个过程需要进行账号、IP、设备隔离&#xff0c;这会需要很多电脑&#xff0c;但又没有那么mac 电脑的话&#xff0c;可以借助酷鸟云来进行上架&#xff0c;它是VPS云服务器&…

工作日常随记-总

软件测试主管工作日常随记-总 前言 接下来&#xff0c;我将开始散文式地记录我作为一位从业3年多的软件测试人员的软测经验。这是我在繁忙的日常工作的中跋涉出来又又投入的另一工作&#xff08;bushi&#xff09;另一兴趣中去。 我将简单&#xff08;偏流水线向&#xff09;…

性能升级,INDEMIND机器人AI Kit助力产业再蜕变

随着机器人进入到越来越多的生产生活场景中&#xff0c;作业任务和环境变得更加复杂&#xff0c;机器人需要更精准、更稳定、更智能、更灵敏的自主导航能力。 自主导航技术作为机器人技术的核心&#xff0c;虽然经过了多年发展&#xff0c;取得了长足进步&#xff0c;但在实践…

windwos安全加固

一、账号管理 按用户类型分配账号 目的&#xff1a;根据系统要求&#xff0c;设定不同账户和组&#xff0c;管理员、数据库 sa、审计用户、来宾用户等 实施方法&#xff1a; 打开本地用户和计算机管理器 ​ 1.打开运行&#xff0c;输入lusrmgr.msc 2.根据用户要求将账户加入…

一文涵盖Lambda,Stream,响应式编程,从此爱上高效率编程

一文涵盖Lambda,Stream,响应式编程&#xff0c;从此爱上高效率编程 前言 本文结构为 先是一个例子&#xff0c;带你快速体验&#xff0c;之后再去深究里面的方法。以及一些底层原理是如何实现的。从如何用&#xff0c;到如何用好&#xff0c;如何用精。学习操作&#xff0c;学…

设计模式——2_7 状态(State)

欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游 ——刘过《唐多令芦叶满汀州》 文章目录 定义图纸一个例子&#xff1a;如何模拟一个转笔刀自动转笔刀PencilPencilSharpener 投诉和改善钝刀BladePencilSharpener 没有铅笔PencilSharpener if if ifStatePencilSharpener 碎…