3.1 矩阵连乘问题

 


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

学习目标:

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

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

12.代码实现

C语言


#include <stdio.h>
#include <limits.h>

// 定义矩阵的最大数量
#define MAX_MATRICES 100

// 动态规划算法求解矩阵连乘问题
int matrixChainOrder(int p[], int n)
{
    int m[MAX_MATRICES][MAX_MATRICES]; // 存储中间计算结果
    int i, j, k, L, q;

    // 初始化单个矩阵相乘的代价为0
    for (i = 1; i <= n; i++)
        m[i][i] = 0;

    // 计算不同长度的矩阵链相乘的最小代价
    for (L = 2; L <= n; L++)
    {
        for (i = 1; i <= n - L + 1; i++)
        {
            j = i + L - 1;
            m[i][j] = INT_MAX; // 初始化为无穷大

            for (k = i; k < j; k++)
            {
                // 计算当前划分位置的代价
                q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];

                // 更新最小代价
                if (q < m[i][j])
                    m[i][j] = q;
            }
        }
    }

    // 返回整个矩阵链相乘的最小代价
    return m[1][n];
}

int main()
{
    int dimensions[] = {10, 20, 30, 40, 50}; // 矩阵的维度,例如:A1是10x20,A2是20x30,A3是30x40,A4是40x50
    int n = sizeof(dimensions) / sizeof(dimensions[0]); // 矩阵的数量

    int minCost = matrixChainOrder(dimensions, n - 1);

    printf("最小代价为:%d\n", minCost);

    return 0;
}

这段代码使用动态规划算法求解矩阵连乘问题,给定矩阵的维度,计算出使得相乘的代价最小的连乘顺序。

注意,该代码中使用了一个常量 `MAX_MATRICES` 来定义矩阵的最大数量,你可以根据具体的需求进行调整。此外,代码中假设矩阵的维度数组 `dimensions[]` 包含了每个矩阵的行数和列数,且矩阵链的数量为维度数组的长度减去1。

C++代码

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

// 动态规划算法求解矩阵连乘问题
int matrixChainOrder(vector<int>& dimensions) {
    int n = dimensions.size() - 1;
    vector<vector<int>> m(n, vector<int>(n, 0));

    for (int L = 2; L <= n; L++) {
        for (int i = 0; i <= n - L; i++) {
            int j = i + L - 1;
            m[i][j] = INT_MAX;

            for (int k = i; k < j; k++) {
                int q = m[i][k] + m[k + 1][j] + dimensions[i] * dimensions[k + 1] * dimensions[j + 1];
                if (q < m[i][j])
                    m[i][j] = q;
            }
        }
    }

    return m[0][n - 1];
}

int main() {
    vector<int> dimensions = {10, 20, 30, 40, 50}; // 矩阵的维度,例如:A1是10x20,A2是20x30,A3是30x40,A4是40x50
    int minCost = matrixChainOrder(dimensions);

    cout << "最小代价为:" << minCost << endl;

    return 0;
}

应用

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】如何速通MySQL(2)

&#x1f4cc;前言&#xff1a;本篇博客介绍如何速通MySQL的第二篇&#xff0c;主要介绍Mysql中主要的基础的入门&#xff0c;学习MySQL之前要先安装好MySQL&#xff0c;如果还没有安装的小伙伴可以看看博主前面的博客&#xff0c;里面有详细的安装教程。或者看一下下面这个链接…

SpringMVC第七阶段:SpringMVC的增删改查(01)

SpringMVC的增删改查 1、准备单表的数据库 drop database if exists springmvc;create database springmvc;use springmvc; ##创建图书表 create table t_book(id int(11) primary key auto_increment, ## 主键name varchar(50) not null, ## 书名 author varchar(50) no…

解决高并发

目录 1.4 对比单体系统、分布式系统和微服务系统 1.4.1 单体系统之痛 1、什么是单体系统 2、单体系统面临的问题 1.4.2 高并发系统之分布式架构 1.4.3 高并发系统之微服务架构 1.4 对比单体系统、分布式系统和微服务系统 接下来从企业真实场景出发&#xff0c;对比单体系统…

JavaEE进阶(5/29)SpringMVC

目录 1.复习 2.URL传参PathVariable 3.上传文件RequestPart 4.获取Cookie/Session/header 5.传统/维新获取cookies 6.传统/维信获得Header 7.获取Session&#xff08;非常重要&#xff09; 8.不加ResponseBody 9.如何获取Json数据&#xff0c;RequestBody 10.想…

python:容器:字符串——常用操作

字符串[下标]根据下标索引取出特定位置字符字符串.index(字符串)查找给定字符的第一个匹配项的下标字符串.replace(字符串1,字符串2) 将字符串内的全部字符串1&#xff0c;替换为字符串2 不会修改原字符串&#xff0c;而是得到一个新的 字符串.split(字符串) 按照给定字符串&am…

数据偏度介绍和处理方法

偏度&#xff08;skewness&#xff09;是用来衡量概率分布或数据集中不对称程度的统计量。它描述了数据分布的尾部&#xff08;tail&#xff09;在平均值的哪一侧更重或更长。偏度可以帮助我们了解数据的偏斜性质&#xff0c;即数据相对于平均值的分布情况。 有时&#xff0c;正…

Linux :: 【基础指令篇 :: 文件及目录操作:(2)】::Linux操作系统的文件“框架”、绝对路径与相对路径及路径定位文件对象的解释

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 本篇内容&am…

【JavaSE】Java基础语法(二十九):Map集合

文章目录 1. Map集合概述和特点2. Map集合的基本功能3. Map集合的获取功能【应用】4. Map集合的遍历(方式1)5. Map集合的遍历(方式2)6. map四种遍历方式 1. Map集合概述和特点 Map集合概述 interface Map<K,V> K&#xff1a;键的类型&#xff1b;V&#xff1a;值的类型…

笔记本电脑的BIOS是怎么保护安全的?

随着攻防技术的不断演进&#xff0c;像BIOS攻击、高级网络代码攻击等手段层出不穷&#xff0c;“受害者”也不仅限于企业级服务器、存储&#xff0c;很多魔爪也开始伸向了拥有商业机密数据的PC。 BIOS是Basic Input/Output System&#xff08;基本输入/输出系统&#xff09;的…

(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

文章目录 前言SpringSpring IOC 简介BeanIOC 概述IOC 本质理解 Spring IOC 应用IOC xml装配IOC 依赖注入IOC Bean的作用域 IoC 自动装配Bean 的自动装配注解实现自动装配 IoC 使用注解开发模拟实现Spring IoC 前言 “Spring”在不同的上下文中表示不同的事物。它可以用来引用 …

ASP.NET Core

1. 入口文件 一个应用程序总有一个入口文件&#xff0c;是应用启动代码开始执行的地方&#xff0c;这里往往也会涉及到应用的各种配置。当我们接触到一个新框架的时候&#xff0c;可以从入口文件入手&#xff0c;了解入口文件&#xff0c;能够帮助我们更好地理解应用的相关配置…

用户验证FTP实验

用户FTP实验 目录 匿名用户验证&#xff1a; 本地用户验证&#xff1a; 本地用户访问控制&#xff1a; 匿名用户验证&#xff1a; 例&#xff1a;&#xff08;前提配置&#xff0c;防火墙关闭&#xff0c;yum安装&#xff0c;同模式vmware11&#xff09; 现有一台计算机huy…

什么是项目可交付成果?定义、示例及管理工具

项目产生可交付成果&#xff0c;这只是项目活动的结果。项目可交付成果可大可小&#xff0c;其数量也因项目而异。它们是由项目管理团队和利益相关者在项目规划阶段商定的。 换句话说&#xff0c;任何类型的项目都有投入和产出。投入是你投入到项目中的东西&#xff0c;如数据…

什么?电路板上还要喷漆?

什么是三防漆&#xff1f; 三防漆是一种特殊配方的涂料&#xff0c;用于保护线路板及其相关设备免受环境的侵蚀。三防漆具有良好的耐高低温性能&#xff1b;其固化后成一层透明保护膜&#xff0c;具有优越的绝缘、防潮、防漏电、防震、防尘、防腐蚀、防老化、耐电晕等性能。 在…

访客管理系统:Lobby Track Crack

Lobbytrack桌面 for 微软视窗 一个强大的、功能齐全的现场访客管理系统解决方案。在本地管理您的数据&#xff0c;网络工作站一起配置访客管理流程的各个方面。 扩展您的系统将本地 Web 模块 添加到您的 Lobbytrack 桌面系统&#xff0c;并允许您的员工使用本地 Intranet 上的 …

FrameLayout+LinearLayout实现首页底部菜单

1.布局样式 2.main.xml代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_par…

Verilog基础之一、触发器实现

目录 一、触发器简介 1.1 触发器作用 1.2 触发器信号 1.3 使用规范 1.4 Vivado综合触发器 二、代码实现 三、综合结果 一、触发器简介 1.1 触发器作用 触发器是工程中基础的单元结构也是相当重要的组成&#xff0c;时序电路的实现离不开触发器。触发器是具有存储功能的器件&…

水库大坝安全问题有哪些?

我国现有水库大坝9.8万余座&#xff0c;80%水库大坝修建于上世纪50至70年代&#xff0c;受经济、技术等历史因素的影响&#xff0c;存在坝体结构破损、坝基渗漏、坝体渗漏、坝面变形等严重的安全隐患。 一、水库大坝的安全问题主要包括以下几个方面&#xff1a; 1.坝体结构破损…

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Qt】delegate的自定义实现函数createEditor进不去【2023.05.07】

摘要 妈卖批&#xff0c;因为这个函数进不去&#xff0c;emo了一下午。实际上就是因为函数声明和定义的地方漏了个const关键字。 1.正确✔&#xff1a; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) cons…