3.1 矩阵连乘问题

news2024/9/21 4:31:45

 


  • 博主简介:一个爱打游戏的计算机专业学生
  • 博主主页: @夏驰和徐策
  • 所属专栏:算法设计与分析

学习目标:

如果我要学习动态规划中的矩阵连乘问题,我会采取以下学习方法:

1. **理解问题的背景和目标:首先,我会了解矩阵连乘问题的背景和目标。明确问题是如何定义的、为什么需要解决这个问题,以及目标是什么,即求解最优的矩阵相乘次数。

2. **研究问题的算法思路:动态规划是解决矩阵连乘问题的常用方法。我会研究动态规划的思想、原理和基本步骤。了解动态规划的关键要素,例如最优子结构、状态转移方程等。

3. 学习动态规划的基本步骤:掌握动态规划算法的基本步骤,包括定义状态、确定状态转移方程、初始化边界条件和填充数组等。

4. **阅读相关的学习资料和教程:** 寻找高质量的学习资料和教程,如教科书、学术论文、在线课程或教学视频。这些资源可以帮助我更深入地理解矩阵连乘问题和动态规划算法的细节。

5. **编写和调试代码:** 通过编写代码来实现动态规划算法。我会先尝试实现基本的矩阵连乘算法,然后逐步优化和改进代码,确保其正确性和效率。

6. **解析算法的复杂度和优化方法:** 学习如何分析动态规划算法的时间复杂度和空间复杂度,以评估算法的效率。同时,寻找优化算法的方法,例如使用备忘录技术、减少重复计算等,以提高算法的性能。

7. **练习问题和应用场景:** 在学习过程中,我会进行一些练习问题和应用场景的实践,以巩固所学的知识。通过解决不同规模和变体的矩阵连乘问题,加深对动态规划算法的理解和应用。

8. **与他人交流和讨论:** 寻找机会与他人交流和讨论矩阵连乘问题和动态规划算法。可以参加学习小组、参与在线论坛或与同学、老师进行讨论,从不同的视角和思路中获取更多的见解。

总的来说,学习动态规划中的矩阵连乘问题需要理解问题背景、掌握算

1.什么是完全连乘积?

我的理解:

简单的说就是括号的定义,为了区分运算顺序所以重新引入这个概念、

完全加括号的矩阵连乘积是指在矩阵连乘的乘法表达式中,对每个乘法操作都显式地加上括号,以明确指定运算的顺序。

例如,对于三个矩阵 A、B 和 C,完全加括号的矩阵连乘积可以表示为 ((A * B) * C) 或者 (A * (B * C))。这样的表示方法清楚地表明了乘法操作的顺序。

完全加括号的矩阵连乘积通常用于避免歧义,确保在进行矩阵乘法时按照所需的顺序进行计算。这样可以避免乘法顺序不明确或引起错误结果的问题。

在矩阵连乘问题中,确定完全加括号的矩阵乘法顺序是关键的优化目标,以最小化乘法次数。通过动态规划等算法,可以确定最佳的完全加括号顺序,从而实现高效的矩阵连乘计算。

2.为什么要递归的定义? 

我的理解:

完全加括号的矩阵连乘可以使用递归的方式进行定义。具体来说,对于一个包含 n 个矩阵的连乘链,可以使用以下的递归定义:

当 n = 1 时,即只有一个矩阵 A₁,其连乘结果为 A₁。

当 n > 1 时,考虑如何将乘积链分割为两个子链。假设乘积链的第一个矩阵为 A₁,最后一个矩阵为 Aₙ。我们可以选择将链在某个位置 k 分割,形成两个子链,分别是 (A₁A₂...Aₖ) 和 (Aₖ₊₁Aₖ₊₂...Aₙ)。其中,k 的取值范围为 1 ≤ k < n。

然后,我们可以递归地定义完全加括号的矩阵连乘为将两个子链分别进行完全加括号的乘积,即 (A₁A₂...Aₖ) 和 (Aₖ₊₁Aₖ₊₂...Aₙ)。

通过递归定义,可以将原始的矩阵连乘问题拆分为较小的子问题,并逐步求解。这种递归定义的思想可以用于设计动态规划算法来解决矩阵连乘问题。在动态规划算法中,通过计算子问题的最优解,并利用最优子结构的性质,逐步构建出整个问题的最优解。这样可以避免重复计算,并提高算法的效率。

3.如何计算矩阵乘法需要的几次数乘(重点)

情形一、两个矩阵相乘 

乘法次数=p*q*r

情形二、多个矩阵相乘

 先算括号里的,然后再算括号外的,不是同一次进行乘法的就用加法把前几次加在一起

4.穷举法的时间复杂度

时间复杂度=O(2^{n})

5.如何分析最优子结构

我的理解:

要分析动态规划算法中矩阵连乘问题的最优子结构,可以遵循以下步骤:

1. 定义子问题:将原始问题分解为更小的子问题。在矩阵连乘问题中,子问题可以定义为给定一部分矩阵链的情况下,如何以最优的方式进行括号分割。

2. 假设最优解的结构:假设存在一个最优解,它可以通过最优的括号分割将矩阵链分成两个子链。根据这个假设,我们可以假设在最优的括号分割下,两个子链也是最优解。

3. 证明最优子结构性质:通过数学归纳法或反证法来证明最优子结构性质。具体来说,可以假设存在一个非最优的括号分割,在这个分割下两个子链不是最优解。然后,通过与最优解的性质进行对比,证明这个假设是不成立的。

4. 构建最优解:基于最优子结构性质,使用递归或动态规划算法来构建最优解。在矩阵连乘问题中,可以通过保存中间结果和最优分割点的方式,逐步构建出最优解。

通过分析最优子结构,我们可以确定动态规划算法的正确性和有效性。最优子结构性质意味着可以将问题分解为更小的子问题,并通过求解子问题的最优解来得到原始问题的最优解。这种性质使得动态规划算法能够有效地解决矩阵连乘问题,并在其他具有最优子结构性质的问题中应用。

6.如何建立递归关系

这式子是用来计算矩阵连乘问题中的最优乘法次数的动态规划算法中的核心递推式。让我来解释一下其中的符号和含义:

- m[i, j] 表示从第 i 个矩阵到第 j 个矩阵的最少乘法次数。
- pi 表示第 i 个矩阵的行数,也是第 i-1 个矩阵的列数。
- pk 表示第 k 个矩阵的列数,也是第 k+1 个矩阵的行数。
- pj 表示第 j 个矩阵的列数。

现在,让我解释递推式的含义:

- 当 i < j 时,也就是矩阵链中有至少两个矩阵时,最少乘法次数 m[i, j] 的计算方式为,遍历所有可能的分割点 k,计算两个子链 (i, k) 和 (k+1, j) 的最少乘法次数,然后加上将两个子链相乘的乘法次数 pi-1 * pk * pj。最终的结果是取所有可能的分割点 k 下的最小值,即 min{m[i, k] + m[k+1, j] + pi-1 * pk * pj}。
- 当 i = j 时,也就是只有一个矩阵时,乘法次数为 0,即 m[i, j] = 0。

这个递推式的思想是通过分割矩阵链,将问题拆分为子问题,并计算子问题的最优解,然后结合子问题的解和当前分割点的乘法次数,得到当前问题的最优解。通过动态规划算法中的递推,我们可以计算出整个矩阵连乘问题的最优乘法次数。

 7.如何以自底向上的方式求最优值

我的理解:

自底向上的方式是一种使用迭代而不是递归的方法来求解最优值的动态规划算法。在矩阵连乘问题中,我们可以按照以下步骤以自底向上的方式求解最优值:

1. 创建一个二维数组 dp,其中 dp[i][j] 表示从第 i 个矩阵到第 j 个矩阵的最少乘法次数。

2. 初始化边界条件:当 i = j 时,即只有一个矩阵时,乘法次数为 0,即 dp[i][j] = 0。

3. 从小到大的顺序,按照矩阵链的长度逐步增加,计算 dp[i][j] 的值。遍历链的长度 l,从长度为 2 的链开始,直到整个链的长度 n。

4. 在每个长度 l 下,遍历链中的起始点 i,计算 dp[i][j] 的值。起始点 i 的范围是从 1 到 n-l+1。

5. 对于每个起始点 i,计算对应的结束点 j,即 j = i + l - 1。然后,遍历所有可能的分割点 k,计算两个子链 (i, k) 和 (k+1, j) 的最少乘法次数,以及将两个子链相乘的乘法次数,即 dp[i][k] + dp[k+1][j] + dimension(i-1) * dimension(k) * dimension(j)。最终的结果是取所有可能的分割点 k 下的最小值。

6. 通过迭代的方式,依次计算 dp[i][j] 的值,直到计算得到最终的最优解 dp[1][n]。

通过以上步骤,我们可以以自底向上的方式利用动态规划算法计算出矩阵连乘问题的最优值。这种方式避免了递归的开销,提高了计算效率,并且可以通过迭代的方式按照顺序计算子问题的最优解,最终得到整个问题的最优解。

8.不同子问题的个数共有n*n

9.如何计算最优值代码实现

void MatrixChain(int *p,int n,int **m,int **s)
{
	for(int i=1;i<=n;i++)
	{
		m[i][j]=0;
	}
	for(int r=2;r<=n;r++)
	{
		for(int i=1;i<=n;i++)
		{
			int j=i+r-1;
			m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];
			s[i][j]=i;
			for(int k=i+1;k<j;k++)
			{
				int t=m[i][k]+m[k+1][j]+p[i-1]p[k]p[j];
				if(t<m[i][j])
				{
					m[i][j]=t;
					s[i][j]=k;
				}
			}
		}
	}
}

我对这段代码的理解 

这段代码是用来解决矩阵连乘问题的动态规划算法实现。让我逐行解释一下代码的功能(其实我也是一知半解狗头 保命,望大家多多指正):

1. `void MatrixChain(int *p, int n, int **m, int **s)`: 这是一个函数声明,它接受矩阵链的维度数组 p、矩阵链的长度 n,以及用于存储最优值的二维数组 m 和最优分割点的二维数组 s。

2. `for (int i = 1; i <= n; i++)`: 这个循环用于初始化二维数组 m 的对角线元素为 0。因为对角线上的元素表示只有一个矩阵时的乘法次数,所以它们都是 0。

3. `for (int r = 2; r <= n; r++)`: 这个循环用于遍历矩阵链的长度,从 2 开始逐渐增加。

4. `for (int i = 1; i <= n; i++)`: 在每个长度 r 下,这个循环用于遍历链中的起始点 i。

5. `int j = i + r - 1;`: 根据起始点 i 和长度 r,计算结束点 j,即 j = i + r - 1。

6. `m[i][j] = m[i][i] + m[i+1][j] + p[i-1] * p[i] * p[j];`: 这一行计算当前子链 (i, j) 的最少乘法次数,通过取两个子链 (i, i) 和 (i+1, j) 的最少乘法次数,以及将两个子链相乘的乘法次数 p[i-1] * p[i] * p[j]。

7. `s[i][j] = i;`: 将当前子链 (i, j) 的最优分割点初始化为起始点 i。

8. `for (int k = i + 1; k < j; k++)`: 在当前子链 (i, j) 下,这个循环遍历所有可能的分割点 k。

9. `int t = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j];`: 计算以分割点 k 划分的两个子链 (i, k) 和 (k+1, j) 的最少乘法次数,并加上将两个子链相乘的乘法次数 p[i-1] * p[k] * p[j]。

10. `if (t < m[i][j])`: 如果得到的 t 值小于当前的最优乘法次数 m[i][j],则更新最优值和最优分割点。

11. `m[i][j] = t;`: 更新当前子链 (i, j) 的最少乘法次数为 t。

12. `s[i][j] = k;`: 更新当前子链 (i, j) 的最优分割点为 k。

通过这段代码的执行,我们可以得到最优乘法次数的二维数组 m 和最优分割点的二维数组 s,它们包含了矩阵连乘问题的最优解信息。

在这段代码中,首先初始化对角线上的最优乘法次数为0,表示只有一个矩阵时的乘法次数为0。然后,通过迭代的方式,从链的长度为2开始,逐渐增加链的长度,计算每个子链的最优乘法次数和最优分割点。

对于每个子链 (i, j),它的最优乘法次数 m[i][j] 是通过遍历所有可能的分割点 k,计算两个子链 (i, k) 和 (k+1, j) 的最优乘法次数,以及将两个子链相乘的乘法次数 p[i-1] * p[k] * p[j] 来得到的。最终,选择最小的乘法次数作为该子链的最优乘法次数,并记录最优分割点。

这段代码使用了自底向上的动态规划思想,通过填充二维数组 m 和 s,以迭代的方式计算出所有子链的最优乘法次数和最优分割点。最终,可以通过访问 m[1][n] 来获取整个矩阵链的最优乘法次数,以及根据 s 数组来构建最优的括号化方案。

总之,这段代码实现了矩阵连乘问题的动态规划算法,通过自底向上的迭代方式,计算出了最优乘法次数和最优分割点,为解决矩阵连乘问题提供了有效的算法。

9.这个递归式子怎么用 

 其实就是数如m[2][5]有多少种分割方式。

 然后先列表根据乘法次数公式然后再用递归公式写出多少。

 10.如何构造最优解?

从数学和计算机的角度来解释矩阵连乘问题的最优解构造:

数学角度:
矩阵连乘问题的最优解构造涉及到矩阵乘法和括号化规则。在矩阵乘法中,两个矩阵相乘的前提是第一个矩阵的列数等于第二个矩阵的行数。通过括号化规则,我们可以确定矩阵相乘的顺序,即哪些矩阵先相乘。

在矩阵连乘问题中,最优解构造的目标是找到一种括号化方案,使得整个矩阵链的乘法次数最小。通过动态规划算法计算得到的最优分割点数组 `s` 包含了这个括号化方案的信息。从数学的角度,通过最优分割点 `s[i][j]`,我们将矩阵链 `(i, j)` 分割成两个子链 `(i, s[i][j])` 和 `(s[i][j]+1, j)`,并按照这个分割点递归地构造最优解。

计算机角度:
在计算机中,矩阵连乘问题的最优解构造涉及到动态规划和递归。动态规划算法通过填充二维数组 `m` 和 `s`,自底向上地计算出矩阵链的最优乘法次数和最优分割点。

通过使用最优分割点数组 `s`,我们可以以递归的方式构造最优解。从计算机的角度,我们可以定义一个辅助函数 `PrintOptimalParenthesis(s, i, j)`,通过调用这个函数递归地构造最优解。这个函数根据最优分割点 `s[i][j]`,将矩阵链分割成两个子链,并分别打印子链的最优解。然后,以括号的形式将两个子链连接起来,构成整个矩阵链的最优解。

通过动态规划算法计算得到的最优解是基于数学规则和计算机算法的结合,它在保证乘法次数最小的同时,也满足了矩阵乘法的规则。因此,最优解构造不仅考虑了数学上的正确性,还考虑了计算机实现的可行性。

11.实现代码:

void Traceback(int i,int j,int **s)
{
	if(i==j){
		return;
	}
	Traceback(i,s[i][j],s)
	Traceback(s[i][j]+1,j,s);
	cout<<"Multiply A"<<i<<","<<s[i][j];
	cout<<"and A"<<"(s[i][j]+1)","<<j<<endl;
 } 

关于这段代码我的理解:

这段代码是用于在矩阵连乘问题中回溯构造最优解的函数。让我逐行解释一下代码的功能:

1. `void Traceback(int i, int j, int **s)`: 这是一个递归函数,用于回溯构造矩阵连乘问题的最优解。它接受起始点 `i`、结束点 `j`,以及最优分割点数组 `s`。

2. `if (i == j) { return; }`: 这个条件判断用于递归的终止条件。当起始点 `i` 和结束点 `j` 相等时,说明只有一个矩阵,不需要进行乘法操作,直接返回。

3. `Traceback(i, s[i][j], s);`: 这行代码通过递归调用 `Traceback` 函数,以分割点 `s[i][j]` 作为结束点,构造左边部分 `(i, s[i][j])` 的最优解。

4. `Traceback(s[i][j] + 1, j, s);`: 这行代码通过递归调用 `Traceback` 函数,以分割点 `s[i][j] + 1` 作为起始点,构造右边部分 `(s[i][j] + 1, j)` 的最优解。

5. `cout << "Multiply A" << i << "," << s[i][j];`: 这行代码用于打印左边部分 `(i, s[i][j])` 的乘法操作,表示将矩阵 A[i] 乘以 A[s[i][j]]。

6. `cout << "and A" << "(s[i][j] + 1)" << "," << j << endl;`: 这行代码用于打印右边部分 `(s[i][j] + 1, j)` 的乘法操作,表示将矩阵 A[s[i][j] + 1] 乘以 A[j]。

通过递归地调用 `Traceback` 函数,并根据最优分割点数组 `s` 的信息,这段代码可以回溯地构造矩阵连乘问题的最优解。它按照最优分割点将矩阵链分割成两个子链,并通过打印乘法操作的方式将两个子链连接起来,最终构成整个矩阵连乘问题的最优解。

总结

矩阵连乘问题的总结及其应用:

1. **问题概述:** 矩阵连乘问题是一个经典的优化问题,目标是在给定一组矩阵链的情况下,找到一种最优的矩阵相乘次序,使得总的乘法次数最少。

2. **动态规划解决:** 矩阵连乘问题可以通过动态规划算法求解,具体步骤包括定义状态、确定状态转移方程、初始化边界条件和填充数组。最终得到的结果是最少的乘法次数以及最优的括号化方案。

3. **最优子结构:** 矩阵连乘问题具有最优子结构的性质,即整个问题的最优解可以由子问题的最优解构成。这使得动态规划算法能够通过递归或迭代的方式构造最优解。

应用

4. **应用场景:** 矩阵连乘问题在计算机科学和应用数学中具有广泛的应用,包括但不限于以下领域:
   - 图像处理和计算机图形学:矩阵变换、图像压缩和平滑等。
   - 人工智能和机器学习:神经网络的训练和推理过程中的矩阵运算。
   - 算法设计和分析:一些算法的时间复杂度分析中,涉及到矩阵运算的乘法次数估计。
   - 经济学和金融领域:投资组合优化和资产定价等方面的计算问题。

通过研究矩阵连乘问题,可以深入理解动态规划算法的应用和设计思想。同时,该问题的解决方法也可以启发我们解决其他具有最优子结构性质的优化问题。

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

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

相关文章

pytorch中分布式Collective通信API学习

随着各种大模型的不断迭出&#xff0c;感觉现在的NLP领域已经来到了大模型的时代。那么怎么来训练一个大模型呢&#xff1f;其中比较关键的一个技术基础就是分布式训练。在阅读GLM源码的时候&#xff0c;感觉其中的分布式训练代码不是很熟悉&#xff0c;看起来有点吃力&#xf…

【Nature 2023】Computational approaches streamlining drug discovery

今天为大家介绍的是一篇发表于“Nature”上面的综述文章“Computational approaches streamlining drug discovery”&#xff0c; Computer-aided drug discovery has been around for decades, although the past few years have seen a tectonic shift towards embracing com…

马尔科夫链 Markov chain

马尔科夫链 1.实例参考文献 马尔科夫链(Markov chain)及其模型在机器学习中应用广泛&#xff0c;本文结合一些参考资料做一个总结。 注意的是&#xff0c;本文中提到的马尔科夫链&#xff0c;要与隐马尔科夫(HMM)作以区分。 1.实例 设某人的训练计划中有以下四项运动&#x…

通过VCP(VMware Certified Professional)认证

文章目录 小结要求考试证书参考 小结 通过VCP(VMware Certified Professional)认证&#xff0c;去年参加了VMware的培训&#xff0c;今年通过VMware Certified Professional (2V0-21.20)的考试&#xff0c;拿到证书。 要求 需要参加VMware的指定的培训&#xff0c;我在去年五…

【数据结构】 数组 array

一、什么是数组 连续内存空间&#xff0c;存储的一组相同类型的元素 二、常用操作 1.原理 access&#xff1a;通过索引直接读取元素的值 时间复杂度&#xff1a;O(1) search&#xff1a;遍历查找某个元素 时间复杂度&#xff1a;O(N) insert&#xff1a;插入位置后的元素依…

Generative AI 新世界 | 大语言模型(LLMs)在 Amazon SageMaker 上的动手实践

在上一篇《Generative AI 新世界&#xff1a;大型语言模型&#xff08;LLMs&#xff09;概述》中&#xff0c;我们一起探讨了大型语言模型的发展历史、语料来源、数据预处理流程策略、训练使用的网络架构、最新研究方向分析&#xff08;Amazon Titan、LLaMA、PaLM-E 等&#xf…

QT超市管理系统

QT超市管理系统 前言QT介绍.pro文件主文件&#xff08;main函数&#xff09;窗口函数&#xff08;mainwindow&#xff09;用户登录&#xff08;user_login&#xff09;超市系统数据库&#xff08;maketsql&#xff09;超市商品的增删改查(dlg_addmak)收款码界面(picture)结语 前…

亚马逊云科技探路可持续,数智创未来

气候变化是全人类的共同挑战。应对气候变化&#xff0c;事关永续发展&#xff0c;关乎人类前途命运。2020年中国在联合国大会上亚马逊云科技作出庄严承诺&#xff0c;要在2030年实现碳达峰&#xff0c;2060年实现碳中和&#xff0c;这是个全球性的规划&#xff0c;也是个庄严的…

Yolov8轻量化:MobileNetV3,轻量级骨架首选

1.轻量化网络简介 轻量化网络是指在保持模型性能的前提下,尽可能减小模型参数量和计算量的神经网络。这种网络通常被用于在移动设备等资源受限的场景中部署,以提高模型的实时性和运行效率。 轻量化网络的设计思路可以包括以下几个方面: 去除冗余层和参数:通过剪枝、蒸馏等技…

MFC(五)菜单栏和工具栏

这篇文章我们来完成菜单设计和工具栏设计 菜单设计 1.点开资源视图>Menu>IDR_MAINFRAME 通过IDR_MAINFRAME我们可以编辑该资源定义&#xff0c;包括主菜单、其他菜单、工具栏等内容&#xff0c;IDR_MAINFRAME即为默认的主窗口的资源标识符 2.右键相应菜单>新插入&…

数据结构 --- 红黑树

红黑树也是一种自平衡的二叉搜索树&#xff0c;和AVL树比较&#xff0c;插入和删除时&#xff0c;旋转的次数更少。 红黑树的特性&#xff1a; 所有节点都有颜色&#xff1a;红色或者黑色所有null均视为黑色红色节点不能相邻根节点是黑色从根节点到任意一个叶子节点&#xff…

5分钟带你了解,SAS硬盘和SATA硬盘的区别?

一、SAS和SATA的关系 SAS的接口技术可以向下兼容SATA。具体来说&#xff0c;二者的兼容性主要体现在物理层和协议层的兼容。 在物理层&#xff0c;SAS接口和SATA接口完全兼容&#xff0c;SATA硬盘可以直接使用在SAS的环境中&#xff0c;从接口标准上而言&#xff0c;SATA是SAS的…

接口隔离原则:接口里的方法,你都用得到吗?

文章目录 前言接口隔离原则1、角色的合理划分2、定制服务3、接口污染 胖接口减肥总结 前言 在前面几篇文章中中&#xff0c;我们讲的设计原则基本上都是关于如何设计一个类。SRP 告诉我们&#xff0c;一个类的变化来源应该是单一的&#xff1b;OCP 说&#xff0c;不要随意修改…

Fiddler抓包工具之fiddler设置断点和简单的并发测试

断点有两种方式&#xff1a; 1、全局断点 2、局部断点 全局断点 全局断点的特点是&#xff1a;不能针对一个请求&#xff0c;是给所有抓到的请求打断点 全局断点如何设置&#xff1a; 1、快速设置断点&#xff1a;直接点击底部状态栏断点处 &#xff1b;点击第一下是请求…

比赛记录:Educational Codeforces Round 149 (Rated for Div. 2) A~D

传送门:CF 前提提要:这场狠狠的掉分.C题刚开始少了一个特判,导致自己对自己的构造方法产生了疑问,然后就一直在做无用思考,后来交的时候排名就贼后面,然后D题的题面简直稀烂(虽然D题看懂之后极其简单…),赛时根本看不懂D题意,最终rating掉完.不亏是教育场,被狠狠的教育了 A题…

Web的基本漏洞--命令执行漏洞

目录 一、命令执行漏洞 1.命令执行漏洞的原理 2.命令执行漏洞分类 3.命令执行漏洞的危害 4.命令执行漏洞的防范措施 5.命令执行漏洞的绕过 一、命令执行漏洞 命令执行漏洞是指攻击者可以随意执行系统命令。它属于高危漏洞之一&#xff0c;也属于代码执行的范畴。命令执行…

内置工具横向移动

IPCSchtasks IPC: IPC$是共享"命令管道"的资源&#xff0c;它是为了让进程通信而开放的命名管道&#xff0c;连接双方可以建立安全的通道并以此通道进行加密数据交换&#xff0c;从而实现对远程计算机的访问。 利用条件&#xff1a; 1、开放139、445 2、目标开启…

Node.js V10.24.1 安装步骤(node、cnpm、yarn、vue)

一、下载node.js 下载地址&#xff1a;Download | Node.js 要下载历史低版本请点击“Previous Releases” Previous Releases 本文章以V10.24.1为例 &#xff0c;下载64位msi 二、安装 下载完成后&#xff0c;一直点击Next直到安装完成&#xff0c;可以自己修改安装位置。…

09.二叉树

09.二叉树 1.树型结构 1.1概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&…

收到字节offer,我却拒绝了...

前言&#xff1a; 大四快毕业了&#xff0c;在等待读研的期间无事可做&#xff0c;所以打算暑期找个实习。 忠告&#xff1a; 本人投了字节某测试岗&#xff0c;看到要求是测开的要求&#xff08;科班出身需要熟悉一种语言&#xff09;&#xff0c;就以为面完发技术岗的offe…