【算法设计与分析】——动态规划算法

news2024/12/28 2:35:49

🎃个人专栏:

🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

🐳Java基础:Java基础_IT闫的博客-CSDN博客

🐋c语言:c语言_IT闫的博客-CSDN博客

🐟MySQL:数据结构_IT闫的博客-CSDN博客

🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

💎C++:C++_IT闫的博客-CSDN博客

🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

🥏python:python_IT闫的博客-CSDN博客

🐠离散数学:离散数学_IT闫的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

🎯内容概括:

🎯目的:

🎯基本步骤:

🎯环境:

🎯内容:

💻one:

🎃问题:

🎃解题思路:

🎃代码分析:

🎃总代码:

🎃 运行截图:

 💻two:

🎃问题:

🎃解题思路:

🎃代码分析:

🎃总代码:

🎃运行截图:

 💻three:

🎃问题:

🎃解题思路:

🎃代码分析:

 🎃总代码:

🎯 做题方法总结:


🎯内容概括:

1)矩阵连乘问题:已知矩阵A1A2A3A4A5 ,使用向量P<P0=3,P1=2,P2=5,P3=10,P4=2,P5=3>存储行列,求出相乘次数最少的加括号位置。

2)0-1背包问题:有5个物品,其重量分别为{2,2,6,5,4},价值分别为{6,3,5,4,6}。背包容量为10,物品不可分割,求装入背包的物品和获得的最大价值。

3)最长公共子序列问题:求X={A,B,C,B,D,A,B}和Y={B,D,C,A,B,A}的最长公共子序列。

🎯目的:

1)了解动态规划算法思想;

2)掌握算法的基本要素及解题步骤;

3)能够对实际问题,能够按照动态规划解题步骤,分析问题;

4)能够正确的编码、实现动态规划算法;

5)能够正确分析算法的时间复杂度和空间复杂度。

🎯基本步骤:

1)审阅题目,明确题目的已知条件和求解的目标;

2)问题建模;

3)算法设计;

4)编码实现(语言不限);

5)测试数据;

6)程序运行结果;

7)分析实验结果是否符合预期,如果不符合,分析可能的原因;

8)算法分析。

🎯环境:

VC6.0 / Eclipse / Pycharm。

🎯内容:

💻one:

🎃问题:

1)矩阵连乘问题:已知矩阵A1A2A3A4A5 ,使用向量P<P0=3,P1=2,P2=5,P3=10,P4=2,P5=3>存储行列,求出相乘次数最少的加括号位置。

🎃解题思路:

  1. 创建两个二维数组m和s,其中m[i][j]表示从矩阵Ai到Aj的连乘所需的最少次数,s[i][j]表示从矩阵Ai到Aj的连乘的最优加括号位置。
  2. 初始化m[i][i]为0,表示单个矩阵相乘的次数为0。
  3. 对于长度l=2到n的子链长度,依次计算m[i][j]和s[i][j]
  • 遍历每个可能的分割点k,计算m[i][j]的值。
  • m[i][j]的值等于m[i][k] + m[k+1][j] + Pi-1 * Pk * Pj。
  • 更新m[i][j]时,同时更新s[i][j]为k,表示在Ai到Aj之间最优的加括号位置是在矩阵Ak与Ak+1之间。

     4.最终,m[1][n]存储的即为从A1到An连乘的最小次数。

🎃代码分析:

matrix1 方法:

public static void matrix1(int[] p) {
    int n = p.length - 1;
    int[][] x = new int[n][n];
    int[][] y = new int[n][n];

    for (int l = 2; l <= n; l++) {
        for (int i = 0; i < n - l + 1; i++) {
            int j = i + l - 1;
            x[i][j] = Integer.MAX_VALUE;
            for (int k = i; k < j; k++) {
                int q = x[i][k] + x[k + 1][j] + p[i] * p[k + 1] * p[j + 1];
                if (q < x[i][j]) {
                    x[i][j] = q;
                    y[i][j] = k;
                }
            }
        }
    }
    System.out.println("相乘次数最少的加括号的位置为:");
    print(y, 0, n - 1);
    System.out.println();
    System.out.println("最少相乘次数:" + x[0][n - 1]);
}

 这个方法使用动态规划来解决矩阵链乘问题。它通过填充二维数组 xy 来计算最少相乘次数和最优加括号位置。


print 方法:

public static void print(int[][] s, int i, int j) {
    if (i == j) {
        System.out.print("A" + (i + 1));
    } else {
        System.out.print("(");
        print(s, i, s[i][j]);
        print(s, s[i][j] + 1, j);
        System.out.print(")");
    }
}

这个方法用于打印最优加括号位置。根据数组 s 中存储的最优加括号位置信息,递归地打印出最优的加括号位置。


main 方法:

public static void main(String[] args) {
    int[] m = { 3, 2, 5, 10, 2, 3 };
    matrix1(m);
}

这是程序的入口,在这里创建了一个整型数组 m,表示矩阵的维度。然后调用 matrix1 方法来解决矩阵连乘问题。

🎃总代码:

package test20210110;

public class Test01 {
	public static void matrix1(int[] p) {
		int n = p.length - 1;
		int[][] x = new int[n][n];
		int[][] y = new int[n][n];

		for (int l = 2; l <= n; l++) {
			for (int i = 0; i < n - l + 1; i++) {
				int j = i + l - 1;
				x[i][j] = Integer.MAX_VALUE;
				for (int k = i; k < j; k++) {
					int q = x[i][k] + x[k + 1][j] + p[i] * p[k + 1] * p[j + 1];
					if (q < x[i][j]) {
						x[i][j] = q;
						y[i][j] = k;
					}
				}
			}
		}
		System.out.println("相乘次数最少的加括号的位置为:");
		print(y, 0, n - 1);
		System.out.println();
		System.out.println("最少相乘次数:" + x[0][n - 1]);
	}
	public static void print(int[][] s, int i, int j) {
		if (i == j) {
			System.out.print("A" +(i+1));
		} else {
			System.out.print("(");
			print(s, i, s[i][j]);
			print(s, s[i][j] + 1, j);
			System.out.print(")");
		}
	}

	public static void main(String[] args) {
		int[] m = { 3, 2, 5, 10, 2, 3 };
		matrix1(m);
	}
}

🎃 运行截图:


 💻two:

🎃问题:

2)0-1背包问题:有5个物品,其重量分别为{2,2,6,5,4},价值分别为{6,3,5,4,6}。背包容量为10,物品不可分割,求装入背包的物品和获得的最大价值。

🎃解题思路:

首先,定义一个二维数组 dp,其中 dp[i][j] 表示在前 i 个物品中,背包容量为 j 时能够获得的最大价值。

然后,初始化边界条件。当没有物品可选或者背包容量为0时,最大价值都为0。因此,可以将 dp[0][j]dp[i][0](其中0 ≤ i ≤ 5,0 ≤ j ≤ 10)都设置为0。

接下来,通过两层循环遍历物品和背包容量。外层循环表示当前所选物品的数量,从1到5;内层循环表示背包容量,从1到10。

在每次迭代中,分为两种情况进行考虑:

  1. 若当前物品重量大于当前背包容量,则无法选择该物品,因此 dp[i][j] 的值与 dp[i-1][j] 相等。
  2. 若当前物品重量小于等于当前背包容量,则需要进行选择。可以比较将该物品放入背包后的总价值与不放入该物品的总价值,选择其中较大的一个。即 dp[i][j] 的值为 max(dp[i-1][j], dp[i-1][j-w[i]]+v[i]),其中 w[i] 表示第 i 个物品的重量,v[i] 表示第 i 个物品的价值。

完成所有的循环后,dp[5][10] 中存储的即为装入背包的物品能够获得的最大价值。

🎃代码分析:

首先,定义了一个 Value 类,并在 main 方法中编写了解决0-1背包问题的代码。

int[] weight = { 2, 2, 6, 5, 4 };
int[] value = { 6, 3, 5, 4, 6 };
int a = 10;

int[][] dp = new int[weight.length + 1][a + 1];

以上代码定义了物品的重量数组 weight、价值数组 value 和背包容量 a。同时,创建了一个二维数组 dp,大小为 (weight.length + 1) × (a + 1),用于存储状态转移的结果。 


for (int i = 1; i <= weight.length; i++) {
    for (int j = 1; j <= a; j++) {
        if (j >= weight[i - 1]) {
            dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
        } else {
            dp[i][j] = dp[i - 1][j];
        }
    }
}

以上代码通过两层循环遍历物品和背包容量,实现了动态规划的过程。在每次迭代中,根据当前物品重量和背包容量的大小关系,选择将该物品放入背包还是不放入背包,并更新 dp 数组中相应位置的值。

具体而言,如果当前物品的重量小于等于背包容量,则需要考虑将该物品放入背包后是否能够获得更大的总价值。通过比较不放入该物品和放入该物品两种情况下的总价值,选择其中较大的一个,并更新 dp[i][j] 的值。

如果当前物品的重量大于背包容量,则无法放入该物品,直接将 dp[i][j] 的值设为上一个状态 dp[i-1][j] 的值。


System.out.print("装入的物品是第");
int i = weight.length;
int j = a;
while (i > 0 && j > 0) {
    if (dp[i][j] != dp[i - 1][j]) {
        System.out.print(i + "个,");
        j -= weight[i - 1];
    }
    i--;
}

System.out.println("\n最大价值为:" + dp[weight.length][a]);

 以上代码用于输出装入背包的物品和获得的最大价值。通过回溯的方式,从 dp 数组中找到装入背包的物品。具体来说,从右下角开始遍历 dp 数组,如果当前位置的值不等于上一个状态的值,说明选择了第 i 个物品放入背包,输出 i 并更新背包容量 j。然后,向左上方移动,继续遍历。

最后,输出最大价值,即 dp[weight.length][a] 的值。

🎃总代码:

package one;

public class Value {

	public static void main(String[] args) {
		int[] weight = { 2, 2, 6, 5, 4 };
		int[] value = { 6, 3, 5, 4, 6 };
		int a = 10;

		int[][] dp = new int[weight.length + 1][a + 1];

		for (int i = 1; i <= weight.length; i++) {
			for (int j = 1; j <=a; j++) {
				if (j >= weight[i - 1]) {
					dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + value[i - 1]);
				} else {
					dp[i][j] = dp[i - 1][j];
				}
			}
		}
		System.out.print("装入的物品是第");
		int i = weight.length;
		int j = a;
		while (i > 0 && j > 0) {
			if (dp[i][j] != dp[i - 1][j]) {
				System.out.print(i + "个,");
				j -= weight[i - 1];
			}
			i--;
		}
		
		System.out.println("\n最大价值为:" + dp[weight.length][a]);
	}
}

🎃运行截图:


 💻three:

🎃问题:

最长公共子序列问题:求X={A,B,C,B,D,A,B}和Y={B,D,C,A,B,A}的最长公共子序列。

🎃解题思路:

最长公共子序列(Longest Common Subsequence,LCS)问题是经典的动态规划问题之一。给定两个序列 X 和 Y,找出它们的最长公共子序列的长度。

对于序列 X={A,B,C,B,D,A,B} 和 Y={B,D,C,A,B,A},可以采用动态规划的方法来解决最长公共子序列问题。下面是解题的思路和步骤:

  1. 定义状态: 创建一个二维数组 dp,其中 dp[i][j] 表示序列 X 的前 i 个元素与序列 Y 的前 j 个元素的最长公共子序列的长度。

  2. 状态转移方程: 根据动态规划的性质,我们可以使用以下状态转移方程来计算 dp[i][j]

    • 如果 X[i-1] == Y[j-1],即序列 X 的第 i-1 个元素和序列 Y 的第 j-1 个元素相等,那么 dp[i][j] = dp[i-1][j-1] + 1,表示当前这对匹配的字符可以贡献到最长公共子序列的长度中。
    • 如果 X[i-1] != Y[j-1],即序列 X 的第 i-1 个元素和序列 Y 的第 j-1 个元素不相等,那么 dp[i][j] = max(dp[i-1][j], dp[i][j-1]),表示当前位置的最长公共子序列长度取决于去掉 X 的最后一个元素时和去掉 Y 的最后一个元素时哪个更长。
  3. 初始化边界条件: 对于 dp 数组的第一行和第一列,因为其中一个序列为空时,最长公共子序列的长度必定为 0,所以将其初始化为 0。

  4. 填充表格: 根据状态转移方程,从 dp[0][0] 开始,逐行或逐列填充 dp 数组,直到填满整个表格。

  5. 回溯求解: 最后根据填充好的 dp 数组,可以进行回溯来找到具体的最长公共子序列。

通过以上步骤,就可以求解出序列 X 和 Y 的最长公共子序列的长度。希望这个解题思路能够帮助你理解如何使用动态规划来解决最长公共子序列问题。

🎃代码分析:

main 方法:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String X = "ABCBDAB";
		String Y = "BDCABA";
		int[][] C = LCSLength(X, Y);
		System.out.println("最长公共子序列长度为:" + C[X.length()][Y.length()]);
		System.out.print("最长公共子序列为:");
		printLCS(C, X, Y, X.length(), Y.length());
	}

  • 在主方法中定义了两个字符串 X 和 Y,分别为 "ABCBDAB" 和 "BDCABA"。
  • 创建一个二维数组 C,并调用 LCSLength 方法计算最长公共子序列的长度,并将结果存储在数组 C 中。
  • 打印最长公共子序列的长度。
  • 调用 printLCS 方法,传入数组 C、字符串 X、字符串 Y 以及字符串 X 和 Y 的长度,打印最长公共子序列。

LCSLength 方法:

	public static int[][] LCSLength(String X, String Y) {
		int m = X.length();
		int n = Y.length();
		int[][] C = new int[m + 1][n + 1];

		for (int i = 0; i <= m; i++) {
			C[i][0] = 0;
		}
		for (int j = 0; j <= n; j++) {
			C[0][j] = 0;
		}

		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= n; j++) {
				if (X.charAt(i - 1) == Y.charAt(j - 1)) {
					C[i][j] = C[i - 1][j - 1] + 1;
				} else {
					C[i][j] = Math.max(C[i - 1][j], C[i][j - 1]);
				}
			}
		}

		return C;
	}
  • 此方法用于计算给定两个字符串 X 和 Y 的最长公共子序列的长度。
  • 首先获取字符串 X 和 Y 的长度并创建一个大小为 (m+1) x (n+1) 的二维数组 C,其中 m 和 n 分别是字符串 X 和 Y 的长度。
  • 初始化数组 C 的第一行和第一列为 0。
  • 使用两个嵌套的 for 循环遍历字符串 X 和 Y 的所有组合。
  • 如果 X.charAt(i-1) 等于 Y.charAt(j-1),则说明当前字符属于最长公共子序列,此时将 C[i][j] 设置为 C[i-1][j-1] + 1。
  • 否则,根据动态规划的规则选择 C[i-1][j] 和 C[i][j-1] 中的较大值赋给 C[i][j]。
  • 最后返回填充好的数组 C。

printLCS 方法:

	public static void printLCS(int[][] C, String X, String Y, int i, int j) {
		if (i == 0 || j == 0) {
			return;
		}
		if (X.charAt(i - 1) == Y.charAt(j - 1)) {
			printLCS(C, X, Y, i - 1, j - 1);
			System.out.print(X.charAt(i - 1));
		} else if (C[i - 1][j] >= C[i][j - 1]) {
			printLCS(C, X, Y, i - 1, j);
		} else {
			printLCS(C, X, Y, i, j - 1);
		}
	}
  • 此方法用于回溯求解最长公共子序列,并将其打印出来。
  • 如果 i 或 j 为 0,则表示已经回溯到了边界,直接返回。
  • 如果 X.charAt(i-1) 等于 Y.charAt(j-1),则说明当前字符属于最长公共子序列,递归调用 printLCS 方法继续向前找,并打印当前字符。
  • 否则,根据动态规划的规则,如果 C[i-1][j] 大于等于 C[i][j-1],则递归调用 printLCS 方法向上找;否则,递归调用 printLCS 方法向左找。

 🎃总代码:

package one;

public class Sameple {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String X = "ABCBDAB";
		String Y = "BDCABA";
		int[][] C = LCSLength(X, Y);
		System.out.println("最长公共子序列长度为:" + C[X.length()][Y.length()]);
		System.out.print("最长公共子序列为:");
		printLCS(C, X, Y, X.length(), Y.length());
	}

	public static int[][] LCSLength(String X, String Y) {
		int m = X.length();
		int n = Y.length();
		int[][] C = new int[m + 1][n + 1];

		for (int i = 0; i <= m; i++) {
			C[i][0] = 0;
		}
		for (int j = 0; j <= n; j++) {
			C[0][j] = 0;
		}

		for (int i = 1; i <= m; i++) {
			for (int j = 1; j <= n; j++) {
				if (X.charAt(i - 1) == Y.charAt(j - 1)) {
					C[i][j] = C[i - 1][j - 1] + 1;
				} else {
					C[i][j] = Math.max(C[i - 1][j], C[i][j - 1]);
				}
			}
		}

		return C;
	}

	public static void printLCS(int[][] C, String X, String Y, int i, int j) {
		if (i == 0 || j == 0) {
			return;
		}
		if (X.charAt(i - 1) == Y.charAt(j - 1)) {
			printLCS(C, X, Y, i - 1, j - 1);
			System.out.print(X.charAt(i - 1));
		} else if (C[i - 1][j] >= C[i][j - 1]) {
			printLCS(C, X, Y, i - 1, j);
		} else {
			printLCS(C, X, Y, i, j - 1);
		}
	}
}

🎃运行截图:

🎯 做题方法总结:

动态规划(Dynamic Programming)是一种通过将问题划分为子问题并为子问题找到最优解来解决复杂问题的算法思想。它通常用于解决具有重叠子问题和最优子结构性质的问题。

以下是使用动态规划解决问题的一般步骤:

  1. 定义子问题: 确定问题可以被划分为若干个子问题。这些子问题通常与原问题相似,但规模较小。

  2. 建立状态转移方程: 定义问题的状态以及状态之间的关系。通过求解子问题,可以推导出原问题的解。

  3. 确定初始条件: 确定最小子问题的解,作为递归或迭代的起点。

  4. 填充表格或数组: 使用循环结构计算并填充数组或表格,以解决子问题。通常从最小子问题开始,逐步计算到原问题。

  5. 返回结果: 根据问题的要求,从填充的表格或数组中得出最终的结果。

下面是一个更具体的动态规划法解题的示例:

  1. 问题定义: 定义问题的具体要求。例如,求解最长公共子序列、最优路径、最大值等。

  2. 状态定义: 定义问题的状态。确定需要记录的信息,以及如何表示状态。

  3. 状态转移方程: 建立状态之间的关系。根据问题的性质和要求,确定状态之间的转移方式。

  4. 初始条件: 确定最小子问题的解,作为递归或迭代的起点。

  5. 计算顺序: 根据状态转移方程,确定计算子问题的顺序。通常从最小子问题开始,逐步计算到原问题。

  6. 填充表格或数组: 使用循环结构计算并填充数组或表格,以解决子问题。根据计算顺序,依次填充表格中的每个元素。

  7. 返回结果: 根据问题的要求,从填充的表格或数组中得出最终的结果。

需要注意的是,动态规划法适用于具有重叠子问题和最优子结构性质的问题。在实际应用中,可以根据具体问题的特点灵活运用动态规划思想,设计合适的状态和状态转移方程,以提高问题的求解效率。

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

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

相关文章

OpenAI公布ChatGPT安全框架

12月19日&#xff0c;OpenAI在官网公布了“准备框架”&#xff08;Preparedness Framework&#xff09;测试版。该文档详细介绍了OpenAI是如何保证ChatGPT等产品的安全防护措施、开发和部署流程。 OpenAI表示&#xff0c;随着大模型的功能迭代不断完善&#xff0c;其能力已经开…

Diss一下ApiPost国产软件

如图所示&#xff0c;我用ApiPost和PostMan调用同一个接口同样的参数。 后端返回的数字是20231204183521830&#xff0c;在ApiPost中却变成了20231204183521832。不能理解为什么数字会2 。 而PostMan这边返回的值是正确的。 看来ApiPost确实是遥遥领先了

30. MVC设计模式

JavaEE 开发流程 ↓MVC的概念 MVC是Model-View-Controller的简称&#xff0c;即模型-视图-控制器。 MVC是一种设计模式&#xff0c;它把应用程序分成三个核心模块&#xff1a;模型、视图、控制器&#xff0c;它们各自处理自己的任务。 模型(model) 模型是应用程序的主体部分…

本地使用 docker 运行OpenSearch + Dashboard + IK 分词插件

准备基础镜像 注意一定要拉取和当前 IK 分词插件版本一致的 OpenSearch 镜像: https://github.com/aparo/opensearch-analysis-ik/releases 写这篇文章的时候 IK 最新版本 2.11.0, 而 dockerhub 上 OpenSearch 最新版是 2.11.1 如果版本不匹配的话是不能用的, 小版本号对不上…

Python---TCP 客户端程序开发

1. 开发 TCP 客户端程序开发步骤回顾 创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字 2. socket 类的介绍 导入 socket 模块 import socket 创建客户端 socket 对象 socket.socket(AddressFamily, Type) 参数说明: AddressFamily 表示IP地…

SpringBoot 3.2.0实战

SpringBoot 3.2.0实战 1. 关键知识点2. 后端开发(SpringBoot 3.2.0)2.1 接口实现的三大步2.2 参数校验2.3 登录认证2.4 获取用户信息2.5 更新用户基本信息2.6 更新用户头像2.7 更新用户密码 3. 前端开发&#xff08;Vue3Element-Plus)3.1 前置知识3.2 常用指令3.2.1 v-for3.2.2…

Java 并发编程 —— 透过源码剖析 ForkJoinPool

目录 一. 前言 二. 工作窃取的实现原理 2.1. WorkQueue&#xff08;工作队列&#xff09; 2.2. 工作窃取流程 三. ForkJoinPool 源码解析 3.1. ForkJoinPool 的字段 3.1.1. 常量 3.1.2. 成员变量 3.1.3. ctl&#xff08;5个部分组成&#xff09; 3.2. 构造函数 3.3.…

Fabric:使用GoLand+Fabric-SDK-Go操作Fabric网络

遇到bug, 未完待续!!! 写在最前 前序博客已经介绍了使用命令的方式在Fabric上创建通道以及部署执行链码的方法&#xff0c;但这个过程太繁琐&#xff0c;尤其是当Fabric网络中peer节点和组织Org过多时&#xff0c;需要频繁的更改环境变量。 Hyperledger Fabric官方提供了Fabri…

[论文分享]TimeDRL:多元时间序列的解纠缠表示学习

论文题目&#xff1a;TimeDRL: Disentangled Representation Learning for Multivariate Time-Series 论文地址&#xff1a;https://arxiv.org/abs/2312.04142 代码地址&#xff1a;暂无 关键要点&#xff1a;多元时间序列&#xff0c;自监督表征学习&#xff0c;分类和预测 摘…

<JavaEE> 网络编程 -- 网络编程和 Socket 套接字

目录 一、网络编程的概念 1&#xff09;什么是网络编程&#xff1f; 2&#xff09;网络编程中的基本概念 1> 收发端 2> 请求和响应 3> 客户端和服务端 二、Socket套接字 1&#xff09;什么是“套接字”&#xff1f; 2&#xff09;Socket套接字的概念 3&…

ToB还是ToC?工业级与消费级AR眼镜都能干什么?

来源&#xff1a;虹科数字化与AR 虹科分享 | ToB还是ToC&#xff1f;工业级与消费级AR眼镜都能干什么&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/lyTASoKm29woIbfcKBtMvQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 随着科技的飞速发展&#…

VLOOKUP中的#N/A错误很常见,这里有详细排除步骤

你的VLOOKUP是否提取了错误的数据&#xff0c;或者你根本无法使其工作&#xff1f;本教程展示了如何快速修复常见的VLOOKUP中的#N/A错误并克服其主要限制。 ​在VLOOKUP公式中&#xff0c;当Excel找不到查找值时&#xff0c;会显示#N/A错误消息&#xff08;意思是“不可用”&a…

Navicat里MySQL表的创建(详细)

我以Navicat连接MySQL为例&#xff0c;演示表的创建方法。 前提 创建表的语法&#xff1a; create table 表名 &#xff08; 字段名1&#xff0c;字段类型&#xff0c; 字段名2&#xff0c;字段类型&#xff0c; ...... 字段名n&#xff0c;字段类型 ); 我计划在test库存放一…

HarmonyOS引导页登陆页以及tabbar的代码说明 home 下拉刷新页代码 5

下拉刷新页 代码说明 这一页第一次运行时很卡&#xff0c;就是你点击修改&#xff0c;要等一会才出来&#xff0c;加一句&#xff0c;修改的字样原来应是修车二字。只能将错就错。 const TopHeight 200; Component export default struct Car {State list: Array<number&…

【数据结构】五、数组与广义表

目录 一、定义 二、计算数组元素地址 三、稀疏矩阵快速转置 稀疏矩阵的表示 稀疏矩阵快速转置 四、广义表 一、定义 我们所熟知的一维、二维数组的元素是原子类型。广义表中的元素除了原子类型还可以是另一个线性表。当然所有的数据元素仍然属于同一类型。 这里的数组可…

Docker容器的日常维护和故障排除

Docker容器已经成为了现代应用程序开发和部署的核心工具之一。然而&#xff0c;为了确保容器环境的稳定性和可靠性&#xff0c;日常维护和故障排除是必不可少的任务。本文将介绍一些关键的Docker容器维护和故障排除技巧&#xff0c;并提供丰富的示例代码&#xff0c;以帮助大家…

Flink 状态管理与容错机制(CheckPoint SavePoint)的关系

一、什么是状态 无状态计算的例子&#xff1a; 例如一个加法算子&#xff0c;第一次输入235那么以后我多次数据23的时候得到的结果都是5。得出的结论就是&#xff0c;相同的输入都会得到相同的结果&#xff0c;与次数无关。 有状态计算的例子&#xff1a; 访问量的统计&#x…

python超实用插件REST Client、autoDocstring、Better Comments

1. autoDocstring 1.1 features 快速生成可以通过制表符浏览的文档字符串片段。在几种不同类型的文档字符串格式之间进行选择。通过pep484类型提示、默认值和变量名称推断参数类型。支持args、kwargs、装饰器、错误和参数类型。 1.2 用法 光标必须位于定义正下方的行上&am…

【数据结构】四、串

目录 一、定义 二、表示与实现 定长顺序存储 堆分配存储 链式存储 三、BF算法 四、KMP算法 1.求next数组 方法一 方法二&#xff08;考试方法&#xff09; 2.KMP算法实现 方法一 方法二 3.nextval 4.时间复杂度 本节最重要的就是KMP算法&#xff0c;其他要求不高…

pip 常用指令 pip config 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip config 是一个用于管理本地和全局配置的命令行工具。它允许用户获取和设置所有的 pip 配置值。 命令 pip config 有以下参数 list&#xff1a;列出所有的 pip 配置值。edit&#xff1a;编辑 pip 配置文件。get&#xff1a;获取一个配…