算法的浅论:算法前序
博客中的图片可以顺序出现问题,以全力弥补,未防止疏漏,特将文档链接放于此处,可以优先浏览文档
【金山文档】 算法考试解析
https://kdocs.cn/l/cijvgvO6a4Tj
一、快速排序
参考视频:
链接:https://pan.baidu.com/s/1niF9bIeVm3yS5a8cIZtNOw?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解
- 基本步骤:(从小到大,从左向右)
- 选定Pivot中心轴
- 将大于Pivot’的数字放在Pivot的有侧
- 将小于Pivot的数字放在Pivot的左侧
- 分别对左右子序列重复前三步操作
例:对下列数字进行快速排序
19、97、9、17、1、8
选取19作为Pivot中心轴,
借助下表Left,Right标记Pivot轴的左侧和右侧的数字
此时L指向19,R指向8,选取19为中心轴,则此时L指向19的位置处于空的状态,将L从左向右;R从右向左,依次指向数字,当L指向的数字比Pivot大时,则将此时L指向的数放到Pivot的右侧空位,当R指向的数字比Pivot小时,则将此时Pivot指向的数字放到Pivot左侧的空位,当L、R指向同一个数字时,则将Pivot放到重合的地方,则完成第一次排序‘
当前情况:
19
97 9 17 1 8
1 2 3 4 5 6----------下标,用于简化位置
L R
当选择L指向的数字作为Pivot时,则从R指向的数开始与Pivot进行比较
R指向的8比Pivot小,则将8放到Pivot的左侧空位,即放在下标1处
此时情况为:
19
8 97 9 17 1 -------数字
1 2 3 4 5 6--------下标
L R -------标志
此时交替移动L标志
将L向右移动一位数字长度,指向97,因为97比Pivot大,故将97放到Pivot的右侧的空位,也就是6号下标对应的位置
此时情况为:
19
8 9 17 1 97 -------数字
1 2 3 4 5 6--------下标
L R -------标志
再次交替移动R标志,将R向左移动一位数字长度,此时指向1,因为1比Pivot小,所以将1放到Pivot的左侧空位处,也就是下标为2的位置
此时情况为:
19
8 1 9 17 97 -------数字
1 2 3 4 5 6--------下标
L R---- -------标志
再进行交替移动L,将L向左移动一个数字长度,此时L指向9,9比Pivot小,所以将9放到Pivot的左侧空位处,又因为此时左侧没有空位,所以将9仍然放在自身位置(相当于将9取出后,产生空位,在将9放到此空位上)
此时情况为:
19
8 1 9 17 97 -------数字
1 2 3 4 5 6--------下标
L R------------标志
对于没有相对移动的下标时,下一次不再进行交替移动下标,而是继续移动当前下标,
此时情况为:
19
8 1 9 17 97 -------数字
1 2 3 4 5 6--------下标
L R------------标志
此时L指向17,17比Pivot小,所以将其放在Pivot的左侧空位,也就是当前空位,L的数字没有产生相对移动,所以将其继续右移。
此时情况为:
19
8 1 9 17 97 -------数字
1 2 3 4 5 6--------下标
R------------标志
L
此时L、R标志重合,则将Pivot放到此处。
此时情况为:
8 1 9 17 19 97 -------数字
1 2 3 4 5 6--------下标
R------------标志
L
此时完成第一次快速排序----完成第一次排序发现,Pivot的左侧数均比其小,右侧数均比其大,则说明排序成功,然后在最Pivot的左、右子序列进行快速排序即可
左子序列的第一次排序结果:1 8 9 17
右子序列的第一次排序,因为右子序列只有一个数字97,则默认不进行排序(一个数字组成的序列不进行排序操作)
左子序列的第二次排序结果:9 17
所以最终结果为:1 8 9 17 19 97
二、归并排序
参考视频链接
链接:https://pan.baidu.com/s/1ANUYMS0z0YtqlLZ4nbNnEg?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解
例:对下列序列进行归并排序:10 6 4 2 15 9
1、基本步骤
a、将序列中的每个数字都单独作为一组---此时有6组
b、将每两个整体进行两两比较,直至只剩一组
即将10 6,这两个数进行比较:将较小的数放在前面,结果为:6 10
将 4 2, 进行比较,将较小的数放在前面,结果为2 4
将 15 9,进行比较,将较小的数放在前面,结果为 9 15
此时6组数变成3组数
此时三组数为:6 10,2 4,9 15
再次进行两两比较,因为是单数组,所以第三组:9 15则不算入比较范围
将6 10,2 4这两组数进行比较,结果:2 4 6 10---将第一组的一个数分别与第二组的第一个数进行比较,将较小的数放在前面,此时第二组数的第二个数变成第一个数,再与第一组的第一个数进行比较,再次将较小的数放在结果序列的前面即可
此时还有两组数据:2 4 6 10,9 15进行比较结果为:2 4 6 9 10 15
总结:将两组数据进行比较,将较小的数放在结果序列的前面即可,当最后只剩一组数时则归并排序结束
三、大整数乘法
参考视频链接:
链接:https://pan.baidu.com/s/11OaqqJxtftYGkQEc-7v3ow?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
例:1234乘5678
存储中分别为:
第一个数:4 3 2 1
i-------------第一个数的下标
第二个数:8 7 6 5
j-------------第二个数的下标
进位数:x
结果数:c
起初x中是0,c是0
开始计算:
第一次大乘法
I指向第一个数的最左的数:4,
J指向第二个数的最左的数:8
第一个数从左开始第一个数 与 第二个数从左开始第一个数相乘,结果为32,将结果摸10,得到的结果作为c从左开始第一位数,用相乘的结果减去模的结果得到的数放在x中
此时x中是30,c从左开始第一位数为2。
然后将第一个数的下标向右移动一个数字长度,此时i指向:3
j指向8
此时将i指向的值与j指向的值相乘,将得到的结果与上一次x中存放的值进行求和,将得到的和进行模10,将取模后的结果作为c的第二位数字,用 和 减去 取模的结果 得到的值替换x中的值,所以此时:i指向3,j指向8,x中为2 ,c为 2 7
依次类推,可以得到第一次的结果c为2 7 8 9
当i移动到最后一个数,并且与j乘完之后,再将i从第一位数开始,将j向左移动一个数字长度,x中置为0,再次存放到c中的数字从最左边的第二位数字开始累加
此时i指向4,j指向7,x中为0,c为:2 7 8 9
第二次大乘法
将i指向的数与j指向的数相乘,得到的积与c中的最左端的第二位数与x的值相加求和,得到的和再进行模10,用取模的结果替换当前c的最左端第二位数的值,同时用 和 减去 取模的值得到的差 替换x中的值。
此时c中的结果为:2 5 8 9
然后将i继续向右移动一个数字长度,此时i指向3,j指向7,x中是3
将i与j所指的数相乘,将得到的积与c最左端的第三位数与x的值相加求和,将得到的和进行模10,用取模的结果替换当前c的最左端第三位数字的值,同时用 和 减去 取模的值得到的差 替换x中的值
以此类推,直到将j移动到最后一步并完成计算,即可得到大整数乘法的结果
四、矩阵连乘问题(利用动态规划求解)
参考视频:
链接:https://pan.baidu.com/s/1MSSglSuN_kpR5UJH_4ReBQ?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
例:
有6个矩阵连乘,就必须用6x6的矩阵存放,进而直到m[i,j]矩阵和s[i,j]矩阵的规格
矩阵先行后列:行列
P角标的取法:只有第一个矩阵占用两个P:分别为P0、P1,后面的P则要间隔一个矩阵的行再进行取值
m[i,j]:表示从第i个矩阵到第j个矩阵相乘
第一步:计算m[i][j]矩阵:
- 的计算次序表示的是m[i][j]矩阵的计算顺序:即都是计算对角线的值,从最长的对角线开始计算,然后向上推进,全部计算结束即可
第一条斜线计算方式:
矩阵的对角线值已知:均为0
第二条斜线计算方式:
m[1,2]的位置表示第1个矩阵到第二个矩阵相乘,此时满足第二种情况:i<j
此时的k的取值为:1<=k<2,所以k只有取1这一种情况。
带入公式得:m[1,2]=m[1][1]+m[2][2]+P0P1P2。求出最后的结果作为m[1,2]的值
以此类推,求出第二条对角线即可
第三条斜线计算方式:
m[1,3]---k取值范围是:1<=k<3,所以k可以取1,2两种情况,分别将两种k的取值 带入第二个公式终,计算出结果,选取其中最小的值作为m[1,3]的值
m[1,3]=m[1,1]+m[2,3]+P0P1P3------K=1时
m[1,3]=m[1,2]+m[3,3]+P0P2P3------K=2时
分别计算这两种k的情况对应的m[1,3]的值,选择其中最小的作为m[1,3]真正的值
每一条斜线上的k均是从i~n-1结束(除第一条外)
第二步:填写s[i][j]矩阵
方法:将m[i][j]矩阵相应位置上取得的数对应的k值,填入s[i][j]矩阵中
例如:m[1,2]处填写的数字对应的k值为1,则在s[1,2]处的值填的就是1
第三步:将表达式进行划分
根据s[i][j]矩阵进行划分
未划分前:矩阵是 A1A2A3A4A5A6 连乘
此时顺序是1乘到6,所以根据s[1,6]处填的是3,则表示在A3处断开
变成:(A1A2A3)(A4A5A6)
在对两个子列顺序进行划分:
根据s[1,3],对A1~A3进行划分。 s[1,3]是1, 所以在A1后划分:变成:A1(A2A3)
根据s[4,6],对A4~A6进行划分。S[4,6]是5,所以在A5后划分:变成:(A4A5)A6
所以最终结果为:(A1(A2A3))((A4A5)A6)
只需要将两个矩阵放在一个对()中即可确定顺序。
五、最小生成树
参考视频
链接:https://pan.baidu.com/s/1KR-QDPW5TCW2skMVfUyRqA?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
原则:
- 全部路径的权值求和是最小的
- 最后形成的图像不能构成一个环路
- 最后构成的树必须包含全部节点
例题:求此最小生成树
Prim算法
先从全部节点中选择一个节点:
选择V1节点作为出发点(任何一个节点都可以),视为一个整体。
逐渐扩大整体:
在从与V1节点相连的路径中选择最短的一条,并将此路径上的另一节点与当前节点连。
此时当前节点为v1,与v1相连的路径中权值最小的是1,此路径上的另一节点是v3, 所以将另一节点v3与当前节点v1相连,所以此时的整体为:v1---v3
在从与v1-v3这个整体相连的路径中选择权值最小的路径(这个路径可以与此整体中的 任意节点相连),加入此整体:最小的权值路径是4,另一节点是v6,所以此时的整体 为:v1-v3-v6
在从与v1-v3-v6这个整体相连的路径中选择权值最小的路径,将另一个节点加入此整 体中,最小的权值是2,另一节点是v4,所以将v4加入此整体中,所以此时整体为: v1-v3-v6-v4
再从与v1-v3-v6-v4这个整体相连的路径中选择权值最小的路径,是5,注意,此处需 要避免构成回路,所以只能v2与v3相连,所以此时整体如图所示:
再从与此整体相连的路径中选择权值最小的路径:是3,注意此处需要避免构成回路, 所以将v2与v5相连即可,最终产生最小生成树:
Kruskal算法---个人记为KK算法
先将节点全部画出,从中选择权值最小的路径进行相连对应的节点即可
注意不能构成回路
六、动态规划求解0-1背包问题
参考视频:
链接:https://pan.baidu.com/s/1SA7XKYTUeN8xcJPAD6N19A?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
参考视频中提供的文档:
https://kdocs.cn/l/cfsV16WWBmR6
个人理解:
例题:
第一步:设计状态表达式:
F(k,w):表示当背包容量为w时,现有k件物品可以偷,所能偷盗的最大价值
本题计算F(4,8)的值:表示当背包容量为8时,现有4件物品可以偷,所能偷盗的最大价值
当偷到第4件物品时,有两种情况:偷、不偷
偷:F(4,8)就转换为F(3,3)+8:因为第四件物品偷了,所以背包容量减少了第四件物品 的容量,所能偷的物品减少了1,变成3,再加上第四件物品的价值8即可
不偷:F(4,8)就转换为F(3,8)
以此类推分别进行判断第三件物品、第二件物品、第一件物品,画出流程图进行分析
对于F(1,0)的计算:因为背包容量为0,即使有东西偷也没有空间存放,所以F(1.0)=0
对于F(0,1)的计算,虽然背包有空间,但是没有东西可偷,所以F(0,1)=0
同理F(0,3)=0
以此类推,将不偷第四件物品的情况进行补全:
此处由于没有妥善安排空间,所以没有写全,请读者自行补全:每个情况都有两种情况:偷、不偷:不偷可能是不想偷,有可能是没有足够的空间偷。
只需要求出每种情况的价值即可得到最优解
公式的总结:不管偷、还是不偷,k都是要进行减一操作,不偷k-1,容量不变
若是偷了,还需要减去容量再加上价值
单元格中的数字就是前面的完整的树对应的值
七、贪心算法求背包问题
背包问题和0-1背包问题的区别:
背包问题对于一个物体,可以装一部分,即1/2、1/3……
0-1背包问题对于一个物体,要么全装,要么不装,不能只装部分
思路:先装单位价值最高的物品,依次递推,直到不能装。
单位价值=价值÷重量-----多少钱每克:每是除的意思,所以放在 每 字后面的就是 分数线下的值
当最后一个物品无法完全装入时,则能装多少装多少
步骤:
将全部物品的单位价值进行排序
优先装入单位价值最高的物品
八、回溯法求0-1背包问题
参考视频:
链接:https://pan.baidu.com/s/1WA-07j2CxjSwFijtgGepTg?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
回溯法指的是从根节点出发,从左子树开始一直延申到底部再返回根部,再进入右子树
回溯法是深度优先
深度优先指的是将一个根节点的某一个子节点完全结束后,再回到根节点,然后再考虑根节点的另一个子节点的情况
回到根节点:就是回溯
回到物4节点,考虑物5不放入的情况时的节点图如下图所示:
此处算到最后一个节点的值都比当前最优解(因为没有放入物5,所以此时最优解为放入物4时所得的解:96)要好
所以将最优解进行更新,由96更改为149(此处的96是放入物4时的解),回到最后一个放入物品的节点,考虑最后一个物品不放的情况,相当于回到最后一个放入的物品的根节点,最后一个放入的是物6,其根节点是物5不放的节点,考虑最后一个物品:物6,不放的情况
计算出左侧151时,将当前最优解149(此处的149是放入物4是对应的解更新的149)更改为151
因为左侧96<当前最优解=151,所以剪枝(又因为是最后一个叶子节点,所以剪枝省略)
以此类推,得到左侧159,将当前最优解63改为159,回溯到最后一个放入物品的节点的根节点
大致思路已经写完,若是看到此处还有不清楚的,可以联系本人QQ:1904432837
与在下进行探讨,或者观看参考视频
九、二分搜索算法
参考视频:
链接:https://pan.baidu.com/s/1UAEBMT5D8QsT-NV4opvXuw?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
二分搜索算法的思想是不断缩小区间,最终找到所需值。
用left指针记录左边从哪个下标位置开始
用right指针记录右边从哪个下标位置结束
left和right之间的范围就是查找数可能出现的范围
二分搜索算法的步骤:
1、确定搜查的区间,
2、获取该区间的中间值
3、将中间值与查找值进行比较:
若是查找值比中间值小,则调整right指针,使其指向中间值-1处
若是查找值比中间值大,则调整left 指针,使其指向中间值+1处
如此便再次确定查找区间,再获取此区间中间值,与查找值比较即可,直到找到,或者当left>right时则说明查找数不存在
十、主定理
参考视频:
链接:https://pan.baidu.com/s/1DhxR26kGTqerINp8qIGq4Q?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
主定理
参考视频:
链接:https://pan.baidu.com/s/1DhxR26kGTqerINp8qIGq4Q?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
十一、活动安排问题
参考视频:
链接:https://pan.baidu.com/s/1-lVsIAZiP_ynPLU8-owVHg?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
- 一定选择最早结束的活动作为第一个活动
- 以第一个活动的结束时间为准,选择第二个活动,第二个活动的开始时间必须大于第一
个活动的结束时间
3、以此类推,遍历全部的活动,将符合的活动放在第一个活动之后,如此便可达到活动安
排的顺序
十二、哈夫曼编码
参考视频:
链接:https://pan.baidu.com/s/1xHc2tgHUAHt6hx7k07Atew?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
哈夫曼编码的WPL=该子树的权值和 * 该子树的父节点所处的层数
权值越大的节点 越靠近 根节点 则该哈夫曼树的WPL越小
最小带权路径长度的二叉树称为哈夫曼树(也叫最优树)
哈夫曼树的构造:
1、将序列从小到大排序
2、找到这个序列中前两个最小的值求和,然后用此 和 替换原序列中的两个求和的数,再次从小到大进行排序
3、以此类推,已知求和,一直排序,直到只剩一个数字,则此数作为哈夫曼树的根节点
4、将产生和的数字以此作为此和的子节点,较小的放在左节点,较大的放在右节点
5、哈夫曼树的路径是左0右1
十三、单源最短路径
参考视频:
链接:https://pan.baidu.com/s/1Teh5G09EGQErLc2pMqV72g?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
画六轮的原因:从a点出发,一共右六个节点可以到达,所以画6x6的表格
一次可以到达的,直接填距离,一次到达不了的则填∞
- >b:这就是可以直接到达b,所以填15
- >b->e:这就不能直接到达,所以填∞。但是b->e可以填距离:即节点间无间隔时才填距离。
例如:第二轮的b:必须参考此条路径:a->c->b,若是此条路径产生的距离比上轮该节点的距离小,则将此路径的值填入本格,反之则延续上一轮的距离
例如:第二轮的b格可能的路径:
- >b: 因为a是最初出发点,所以需考虑能否直接到达b节点,距离为:15
- >c->b:在上一轮发现a->c的距离最短,所以a->c-b>的距离有可能较短,所以需参考, 此处为∞(准确说此处应为∞+2,2是a->c的距离,此处计算的是到达此处的 路径的和)所以将较小的距离填入本格,所以第二轮的b格填15.
第二轮的c格,因为再上一轮中已找到最短距离,所以之后可以不再计算到c节点的距离
即当找到到达某节点的最短路径后,后面的几轮中到达此节点的距离都不必填写
依次类推,将第二轮的集合找到,再以第二轮的集合作为跳板,进行后面几轮的填写。
当表格填满后,最后一轮的集合就是最终路径:a-c-f-e-d-g-b
十四、解空间树:子集树和排列树
参考视频:
链接:https://pan.baidu.com/s/1bdKXh88UNdLC0RY5D5lU4A?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
求一个集合的子集:
注意:
1、选择当前元素,后面再选,选的时该元素后面的元素加入子集
2、空集也是子集
当叶子节点时的剩余集合是一个空集合时,则该子树结束
十五、N后问题
参考1:
参考视频:
链接:https://pan.baidu.com/s/1_LrUm8-7YwnTearA_QyMsQ?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
回溯算法=深度搜索+剪枝
此处是8x8的棋盘,所以应在上面放置8个皇后,故是八皇后问题。每一行放一个皇后
皇后的放置规则:同一行、同一列、对角线只能放一个皇后
这些都是对角线
即同一条对角线上,同一行、同一列:不允许有两个皇后的存在
只有不在同行、同列、同一对角线的皇后的放置才是合法放置
解法一:
解法二:
参考2:
因为皇后不能处于同一列,所以当第一行的皇后处于第一列时,则此节点的第一列的子树就都可以剪枝
参考3:
参考视频:
链接:https://pan.baidu.com/s/1WecXzafFMTd32VEsH3wQ-g?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解
在第一行放置第一个皇后,
然后在第二行放置第二个皇后,
然后在第三行放置第三个皇后----若是第三行皇后无法放入,则返回第二行,将第二行的皇后右移一个格子(已至最后的格子)
然后在第三行放置第三个皇后
然后在第四行放置第四个皇后----若是第四行皇后无法放入,则返回第一行,将第一行的皇后右移一个格子(已至第二个格子)。以此类推以此放入
回溯法就是当无法放满N个皇后时,向前回溯,重新摆放前面皇后的位置,向下不断探索
当本层皇后无法放入,则回到上一层将皇后有移动一位,若是任然不行,则到更上一层的皇后处,将其向右移动一位
十六、分支界限法和剪枝策略
剪枝的概念:
左剪枝(放入背包的节点):若是放入背包时此节点就超过了限定的容量,则将此节点剪去 即可
右剪枝(不放背包的节点):按照边界条件进行剪枝:无论怎么放物体,也得不到比当前最 优解好的解,则没必要对此节点进行遍历,进而剪枝
右剪枝:利用小数背包贪心算法进行剪枝:不放第K物品的前提下,剩余的物品是k+1~n 个物品,此时设容量为C‘,将剩余物品(单位价值最大的物品优先)放入剩余容量中, 得到的解也不如最优解时,则将此节点进行剪枝
十七、分支限界法解决0-1背包问题
参考视频:
链接:https://pan.baidu.com/s/1CIMjKVJRUdRnBbEKf4sGaA?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
例题:
左子树表示选择该物品,右子树表示不选择该物品
第一步:计算已选择道路的价值
第二步:利用贪心算法,计算未选择的物品:优先放入单位价值高的物品
具体分析:
155.0的计算方法:
第一步:确定已选择道路:A没选,可选B、C、D,其单位价值分别为
背包容量为9千克,优先放入单位价值最高的物品,也就是B全部放入,C全部放入,D放入一半,求和为40+95+5=150(虽然是0-1背包问题,但是此处计算的是最大值,这个最大值可以不存在,也就是上界)
计算出节点的上界,优先深入扩展上界较大的节点,得到子节点后再次求出节点的上界,选取其中上界较大的节点继续扩展,并注意是否与背包容量冲突,若是冲突,则此节点不在扩展分析,直到上界较大的节点是叶子节点,则停止,此时对应的价值就是背包的最优解---叶子节点的解是真实解,让真实解比最大上界还要好时,则说明找到了最优的排列方式。
十八、分支限界法解决售货员问题
参考视频:
链接:https://pan.baidu.com/s/1B_tqWEFOnF369SNAsHsXbw?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
第一步:选定一个指定的城市作为出发城市
第二部:画出解空间树
解空间树中的每个活结点的优先级=cc+lcost,cc是从出发城市到达当前城市的路程或费用,lcost是当前顶点(当前城市)最小出边+剩余顶点(城市)最小出边和(禁忌除外)
叶子节点也就是倒数第二层节点
若是叶子节点相应一条可行回路且费用小于当前最有解bestc,则将该节点插入到优先队列中,否则舍去该节点
当在倒数第二层节点前(即非叶子节点)计算可行节点的优先级=cc+lcost,若cc+lcost<bestc时,则将其可行儿子节点插入到活节点优先队列中。该过程一直持续到优先队列中取出的活结点是一个叶子节点为止
最小出边(禁忌除外)的解释:
对于刚刚扩展的顶点,其前已选的所有顶点是禁忌的(不能选)。
例如:1->2->4,刚刚扩展的顶点是4号城市,,则4号城市计算最小出边的时候,1、 2号城市即使构成最短边,也不能计算在内
对于未扩展出的顶点,其前已选的(顶点1除外)的顶点是禁忌的
例如:1->2->4,后面可能扩展出其他城市5……,则对于后面还没有扩展出来的城 市,除了顶点1,其他城市都是禁忌的
例题:
LB=31的计算由来:
选中1号城市,则从1号城市到达2号城市,根据距离矩阵可知,距离为14,即cc=14
因为2号城市是刚扩展出来的城市,即2号是不能回到1的(第一步刚扩展出来的节点是不能回到出发点的,好多的城市,不能刚出来就回去,所以1号城市是禁忌的),所以前面已选择的城市对于2号城市都是禁忌的,此时对于2来说,只有1是其禁忌,所以在2号此时再选择出边时不能选择1的出边,所以再剩余城市中选择最小的,找到3号,对应出边是7
此时待选城市还有3、4、5
对于3号城市,他的最小出边,再其已经选择过的城市中,1号城市除外其他城市都是禁忌的(其他城市指的是已选过的城市,选过的是1、2,只有1号城市外,其他城市都是禁忌的,此处的其他城市是2号城市),所以可选的是1、4、5城市,再其中选择出边最小的计入,所以选择1号城市,出边为4
对于4号城市,他的最小出边,再其已经选择过的城市中,1号城市除外的其他城市都是禁忌的(1,2是其以选择过的城市,除1号外其他城市均是禁忌的),所以可选的是1、3、5,(没有画出节点的城市均未选过,但是本身不能选择本身)根据距离矩阵,选择出边最小的是5号,出边为2
对于5号城市,他的最小出边,再其已经选择过的城市中,1号城市除外的其他城市都是禁忌的(1,2是其已选择过的城市,除1号外,其他城市均是禁忌的),所以可选的是1、3、4,根据距离矩阵,选择最小的是4号,出边为4
所以lcost=7+4+2+4=17
LB=cc+lcost=14+17=31
所以从此节点向下搜索,搜索的最短的路径只能是31,但是31这条路径不一定能搜出来,即从此节点向下搜索,搜索出的LB>=31
以此类推,计算第二个节点:
从1号城市得到3号城市,LB=22的计算方法:
LB=cc+lcost
=4+5+7+4+2=22
cc=4:根据距离矩阵由1->3可知,3号城市已选择,对于后面都属于禁忌出边,不可选
5: 因为已经到达3号城市,此时3号城市的禁忌是1,所以在距离矩阵中选择其可选的最短的出边来到2号城市
7: 因为来到2号城市,此时2号城市的禁忌是本身和3号,所以在距离矩阵中选择其 可选的最短出边,出边是7,再来到5号城市(未扩展的禁忌是其前面树上已经写下 的节点(除了出发点)和本身)
4: 因为来到5号城市,此时5号城市的禁忌是本身和3号,所以在距离矩阵中选择其 可选的最短出边,出边是4,再来到4号城市
2: 因为来到4号城市,此时4号城市的禁忌是本身和3号,所以在距离矩阵中选择其 可选的最短出边,是2,在来到5号城市,结束
总结:
第一个节点的LB=21:将每行的除0外的最小值求和即可,即4+7+4+2+4=21
第二层的节点LB=31:LB=cc+lcost
cc:是从第一个城市来到第二个城市的路程,直接从距离矩阵中得到:14
因为处于第二层,城市数有5个,根据公理:所在层数+lcost求和的个数=城市数+1
所以此处的lcost,应当有4个数求和产生
因为选到第二个城市:即当前节点的最后一个数是2,所以从距离矩阵的第二行开始看,除其禁忌数外,找到最小值:因为该节点是刚刚扩展出来的,所以出发城市和本身是其禁忌,所以只能再剩下的城市中选择,即3、4、5,最小的是7,所以7就是用于lcost求和的第一个数
因为第二个城市行以选出数字,所以来到第三行选择数字,因为3号城市是未扩展节点(即没有再树种出现过的城市),所以她的禁忌是除出发城市外,其他在该父节点中出现的城市及其本身(即2号城市和3号城市是其禁忌),所以第3行的最小数,只能在1、4、5号城市中找,找到是4,所以4就是用于lcost求和的第二个数
继续找第三个数:因为1、2、3城市所在行已经找完,所以再找第4行,除其禁忌的最小数
因为4号城市是未扩展节点(即没有再树种出现过的城市),所以她的禁忌是除出发城市外,其他在该父节点中出现的城市及其本身(即2号城市和4号城市是其禁忌),所以第四行的最小数,只能在1、3、5号城市中找,找到是2,所以2就是用于lcost求和的第三个数
现在找到五号城市所在行,因为其也是未扩展点,所以与3、4行查找数字类似,本行查找的是4,所以4就是lcost求和的第四个数
所以此节点的lcost=7+4+2+4=17
所以此节点的LB值可以计算出 LB=lcost+cc=17+14=31
以此类推,可以求出除顶点外的全部节点的LB值
(此处不要纠结为什么最后没有回到1号城市,记住计算方法,先通过考试再说,若是向深入了解,可以与本人进行探讨)
当四种情况都算出来后,选择优先级最高的,即LB最小的也就是LB=22的节点继续深入
如果节点可以继续深入扩展,则此节点是活结点,反之是死节点----能否扩展根据题意确定:例如:从1号城市出发,深入扩展只有4中情况,分别如上图示,将四种情况均表示出来后,没有其他情况,所以此节点没有深入的必要,所以是死结点
当进行深入的节点满足达到死结点时,在该节点的子节点进行深入(对LB最小的节点进行深入)
因为一共由5个城市,所以只需要达到四层即可,所以此处LB=37的节点就是倒数第二层节点,也就是叶子节点
所以现在已经确定前四个城市顺序:1->3->2->4
所以可以确定线性顺序的最终顺序:1->3->2->4->5
又因为要组成环线,所以需要首位相连:1->3->2->4->5->1,所以最后一个计算的LB就是所需的LB即为37
LB是补全后的路程价值
此时找到的最短环路为LB=37,在后面扩展中,找到的LB大于当前所找的LB,则将此节点进行剪枝
若是比此LB小,则将该节点放到活结点序列中
LB=22还有另一个孩子节点:
此时活节点中又LB=31、37、31、27、39、30、42---深入到叶子节点时则不再对活节点序列进行添加。
活节点序列中的节点进行扩展,考虑是否将扩展节点放入活节点序列中:
获得活结点序列后,对活结点中优先级(LB最低)最高的进行深入扩展,当对优先级最高的节点进行深入的同时从活节点序列中去除该节点的LB,以优先级最高的为准,对活节点序列中的节点扩展产生的子节点的LB若是比当前活节点中的LB大,则不将此子节点加入活节点序列中,并将此子节点剪枝,反之则加入。
以此类推,得到最终空间树
当前层数+lcost中求和个数=城市数+1
找的层数=城市数-1
当叶子节点的优先级是该活子节点序列中最高时,则找到最优解
十九、时间复杂度排序与渐进表达式的书写:
参考视频:
链接:https://pan.baidu.com/s/1hSHc848_GO73co918QhcvQ?pwd=0913
提取码:0913
--来自百度网盘超级会员V1的分享
个人理解:
O(1)<O(logn)<O(nlogn)<O(n^2)<O(n^3)
O(2^n)<O(n!)<O(n^n)
这两个定义是等价的。
总结:
在包含n0项之后的所有项,使得全部的f(n)都在g(n)与某个正常量乘积形成的区间内,则这个g(n)称为该f(n)的渐进紧确界
Θ:既可以表示上界,也可表示下界
根据O的定义,评估算法的复杂度,得到的只是问题规模充分大时的一个上界,上界的阶越低,则评估越精确
总结:
在包含n0项之后的所有项,使得f(n)都小于等于c与g(n)的乘积,则称g(n)是f(n)的上界,记为O(g(n))=f(n)-----O是上界的标识,g(n)是f(n)的上界,f(n)的阶小于等于g(n)的阶
判断是否是上界:在某项之后,f(n)均小于g(n)与某个常量的乘积,且f(n)小于等于g(n)的阶,则称g(n)是f(n)的上界,上界的阶越小越好
例题:
下界的阶越高,则评估越精确
总结:
在包含n0项之后的所有项,使得f(n)都大于等于c与g(n)的乘积,则称g(n)是f(n)的下界,记为Ω(g(n))=f(n)-----Ω是上界的标识,g(n)是f(n)的下界,f(n)的阶大于等于g(n)的阶
判断是否是下界:在某项之后,f(n)均大于等于g(n)与某个常量的乘积,且f(n)的阶大于等于g(n)的阶,则称g(n)是f(n)的下界,下界的阶越大越好
O与o的区别是:O是<,o是<=
紧确的界包含等于情况
非紧确的界不包含等于的情况
O是上界标识:大写则紧确,小写则非紧确
Ω是下界标识:大写则紧确,小写则非紧确(Ω小写是w)
总结:
在包含n0项之后的所有项,使得f(n)都比c与g(n)的乘积大,则称g(n)是f(n)的上界,记为o(g(n))=f(n)-----o是非紧确上界的标识,g(n)是f(n)的上界,f(n)的阶小于g(n)的阶
判断是否是非紧确上界:在某项之后,f(n)均小于g(n)与某个常量的乘积,且f(n)的阶小于g(n)的阶,则称g(n)是f(n)的上界
紧确与非紧确的区别:前者包含等于,后者不包含等于,作用与大小区间上,还有阶的范围
用o表示的上界,一定可以用O表示
2n^2 与n^2 再n->∞时,他们的比值为2,是一个常数,所以他们是同阶的
总结:
在包含n0项之后的所有项,使得f(n)都比c与g(n)的乘积小,则称g(n)是f(n)的下界,记为w(g(n))=f(n)-----w是非紧确下界的标识,g(n)是f(n)的下界,f(n)的阶大于g(n)的阶
判断是否是非紧确上界:在某项之后,f(n)均大于g(n)与某个常量的乘积,且f(n)的阶大于g(n)的阶,则称g(n)是f(n)的上界
根据前面的总结,判断是否正确----可以判断出来:从阶的范围就可以判断出来
第三、第四均正确,但是第四更好---下界的阶越高越好
算法的浅论:算法前序相关推荐
- 浅谈算法和数据结构: 五 优先级队列与堆排序
原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...
- 算法工程师_浅谈算法工程师的职业定位与发展
随着大数据和以深度学习为代表的人工智能技术的飞速发展,算法工程师这个职业逐渐成为国内互联网行业的标配.2016年3月,谷歌旗下DeepMind公司的围棋程序"AlphaGo"战胜职 ...
- java 算法_Java 浅谈数据结构和算法
以前不管自己还是朋友在面试java工程师岗位的时候,都会被问到这样的问题: "介绍下java中的数据结构和算法". 很多朋友被问到的时候发现无从下口,甚至特别是一些初级java工程 ...
- 浅谈算法(简单算法)
前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出. ...
- K.M.P算法个人浅谈
1.什么是K.M.P算法 K.M.P算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法). ...
- 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++
算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿 ...
- 《算法基础:打开算法之门》一1.5 拓展阅读
本节书摘来自华章出版社<算法基础:打开算法之门>一书中的第1章,第1.5节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区"华章 ...
- Dropout、梯度消失/爆炸、Adam优化算法,神经网络优化算法看这一篇就够了
作者 | mantch 来源 | 知乎 1. 训练误差和泛化误差 对于机器学习模型在训练数据集和测试数据集上的表现.如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时, ...
- 计算机图形学第一次上机——中点线算法和中点圆算法
计算机图形学第一次上机实验 课程实验报告 目录 计算机图形学第一次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 1.中点线算法 2.中点圆算法 四.实验心得 附录:程序源代码 一. ...
- BP神经网络算法基本原理,bp神经网络算法的原理
BP人工神经网络方法 (一)方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统.理论和实践表明,在信息处理方面,神经网络方法比传统模式识别方法更具有优势. 人 ...
最新文章
- UI设计培训需要学哪些内容
- php 注册登录,邮件确认激活
- 同一行 绝对定位_电路改造10大点:定位、开槽等,终于有人说清了!
- [Python人工智能] 七.加速神经网络、激励函数和过拟合
- Nutch+Hadoop集群搭建
- AtCoder Beginner Contest 178 总结
- 数学题 贪心+二分答案
- Java虚拟机10:类加载器
- 基于JFinal框架开发的企业办公系统-JFinalOA v1.1源码
- 带你自学Python系列(十五):Python中类的用法(一)
- spring security oauth2_SpringBoot2 整合OAuth2实现统一认证
- 虚拟货币公有链项目集体爆发,AE超过历史最高点
- CSS光标属性一览表
- box-shadow(text-shadow)参数详解
- Presto 安装与部署
- 搜苹果ipad版_苹果iOS低版本软件最快下载教程
- android 教学ppt下载 百度云,百度云盘使用教程ppt课件.ppt
- 关于叶子的思维导图_关于叶子的思维导图制作方法
- python123九宫格输入法_python制作朋友圈九宫格图片
- 转至老熊三分地--inside sqlplus prelim
热门文章
- 启动此程序因为计算机丢失msvcr110,win7系统提示无法启动此程序计算机中丢失MSVCR110.dll的解决方法...
- 期末作业——基于机器学习算法的LOL比赛预测(求高分,拜托拜托)
- 产品可靠性1——多层电路板应不应该在顶层和底层铺铜
- 基于Web的文件管理系统,支持Office、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点
- 文件服务器如何异地备份,实战演示如何进行异地自动备份数据库
- response setHeader 设置下载中文文件名乱码问题
- 华为eNSP配置FR 帧中继协议
- 在自建机房给网站做ICP备案
- python图片保存jpg、show变成bmp_Python 图片格式转换
- matlab射线平均速度时距曲线,时距曲线实验