动态规划分析(粗)
1.动态规划
动态规划主要作用是利用已经求得信息来帮助解后面的问题。
1.1 递归
基本上所有的动态规划问题,都可以转换为递归问题。但是递归虽然能够解决出问题,但它需要消耗的时间和空间是非常巨大的。
递归的最主要的作用就是穷尽所有的可能,是一种暴力的解题方式。
我们以一个递归问题来转换为动态规划,看看动态规划的优势在哪里。
1.1.1 动态规划经典题目 - 斐波那契数列
题目:斐波那契数列的前两个为1,后面的为当前数字的前面两个只和(fib[i] = fib[i-1] + fib[i-2]),求斐波那契数列的第i个数字。
题解1 - 递归
public int recur_fib(int i){if (i == 1 || i == 2){return 1;}return recur_fib(i-1) + recur_fib(i-2);
}
问题:
当我们需要求得数列中的某个数的时候,都会进行两次递归,但是其实在递归过程中有很多数是已经求得过的。
比如:求数列中的第5个数,首先会进入方法,然后执行recur(4) + recur(3),在执行recur(4)的时候会执行recur(3) + recur(2)。这时我们就可以发现,其实recur(3),是前面已经求过一次的,但是我们没有对这个求得的数据进行保存,因此会再重新算一次(递归一次),这个执行是重复的。这就是重复子问题。
小结:
- 因此我们可以得出,对于一些问题,我们需要通过某种方式来得到数据,并且我们将这些已经求得数据保存起来,当我们需要的时候直接使用,那么我们就可以减少不必要的运算执行。
- 并且我们可以看到斐波那契数列中除了开头的两个,后面的每一个数字的值只和它前面的两个数字有关。(fib(i) = fib(i-1) + fib(i-2) )
- 我们可以得出,需要求得的答案是在前面已有的基础上得到的。
- 递归其实可以看出来是一种第顶向下穷尽的方式,但是对于这道题,我们其实从底向上来做会更加方便(前一条观点)。
像这种所求的答案需要从前面以求得并保存的数据和通过从底向上来求得结果的方式,我们就可以通过动态规划来做。
1.2 动态规划
现在我们利用前面的结论来做这道题。
- 创建一个数组来保存数据
- 已知条件,初始赋值
- 自底向上,求得结果
- 找寻动态规划转移方程
public int dp_fib(int i){//1.创建一个数组来保存已经求得的数据,自底向上,最后到达i,所以数组的大小为iint[] dp = new int[i];//2.已知条件,初始赋值dp[0] = 1;dp[1] = 1;//3.自底向上for (int j = 2; j < i ; j++) {//4.根据已有的条件求得新的数据并保存,以便下次使用,动态转移方程dp[j] = dp[j-1] + dp[j-2];}//5.返回结果return dp[i-1];
}
注意
:数组的大小,要根据题目具体设置。这里的斐波那契数列是从1开始的,但是我们的数组的下标是从0开始的(编程语言默认数组从0开始),所以我们创建的数组长度为i,并且数组i-1就是最后找的数组中的数值。 关于动态转移方程的设置,我认为的是在找寻动态转移方程的时候,不能局限于当前已有的数据,而是找到一个比较靠后的位置,来分析找寻规律,这个结果是通过什么得到的,如果这个结果可以通过前面已得到数据来求得,那么就可以使用动态规划解题。 对于斐波那契数列,我们就可以自己在纸上将数列的前几个数据写出来,然后分析比较靠后的数值,然后来发现规律找到最后的数值是通过前面两个的和得到(当然这道题,本身题目就已经给了转移方程,如果没有的时候,我们就可以站的高一点,来找寻规律),最后设置动态规划转移方程,这个还是需要多练,多看。 转移方程一定要在比较高的位置开始看,容易发现规律。
1.3 题目练习
剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
分析:
根据题目,初始条件就是,1个台阶的时候,只有一种跳法;
2个台阶的时候,可以每次跳1个台阶,也可以一次跳2个台阶,共两种跳法;
对于后面的从第3级台阶开始,我们就可以看成,是在它的前一个台阶跳1个台阶或者在它前面两个台阶处一次性跳2个台阶。
public int numWays(int n) {//优化:减少代码运行次数。if (n == 0 || n == 1){return 1;}//1.创建数组,保存数据int[] dp = new int[n+1];//2.已知条件,默认赋值dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2];}return dp[n];
}
注:这里的数组大小为n+1,因为不会出现0个台阶的情况,因此下标为0被占用,因此需要对数组进行加大1。
LeetCode 746. 使用最小花费爬楼梯
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
分析:
爬楼梯的升级版。
还是一样每次都只能爬一到两个阶梯,但是如果你到达这个台阶就需要花费相应的金钱。
每一个台阶的花费不一样,并不是爬的最少就是最好的。
那么,
我们需要首先找到计算花费的方程,找方程,我们需要站的够高来看,才能看的清除。
这里我们就以终点前面的一个或者两个台阶来看,因为这道题目是我们到达这个台阶以后先支付再爬,因此到达终点的时候我们是不需要付费的。
转移方程:dp[i] = Math.min(dp[i-1],dp[i-2]) + cost[i];
首先我们需要从已保存的数据中找到前一个台阶的花费和前两个台阶的花费,然后比较大小,选择小的,再加上这层往上需要支付的。
public int minCostClimbingStairs(int[] cost) {//优化:创建数组需要依靠传入的数据时,一般将长度保存起来便于后面使用。int len = cost.length;//1.创建数组,保存数据int[] dp = new int[len];//2.已知条件,默认赋值/** 根据我们的分析和题目,我们知道到达最后一个台阶时是不需要支付费用的* 这里我们默认赋值也是进行再到达前的赋值,从第一个台阶开始跳或从第二个台阶开始跳* */dp[0] = cost[0];dp[1] = cost[1];//3.从底向上for (int i = 2; i < len; i++) {//4.转移方程dp[i] = Math.min(dp[i-1],dp[i-2]) + cost[i];}//5.返回结果return Math.min(dp[len-1],dp[len-2]);
}
已知条件的初始化,一定是跟转移方程有关。
这两个一定是其中一个给另外一个服务,先设置初始条件,那么转移方程就要根据初始条件变化;先找到转移方程,同理。
推荐使用后者。
LeetCode 62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
分析:
首先拿到这道题,分析这是一到简单的动态规划,还是其他的如0/1问题等。
这道题我们可以看到,到达最后的终点,有多少种可能?不用我们选择路径,而是每条路径都需要我们选择,因此这道题用简单的动态规划即可。
第一步,站的够高,来看这道题的规律。锁定终点。题目告诉我们机器人只能向右或向下移动,那么对于终点来说,只有可能从上边和从左边到达。那么动态转移方程我们可以得到了(其实和楼梯很像,只是从一次跳1个台阶或2个台阶变成了,从上或从下到达),因为问的是所有的可能性(像这种问所有可能性的问题,其实用递归可以求得)那么就将两种到达的可能性都加起来,所以最后我们得到的动态规划转移方程为:
dp [m] [n] = dp [m-1] [n] + dp [m] [n-1];
其中:m和n代表了移动的下标,m-1,n表示从左边到达终点,m,n-1表示从上边到达。
这道题还有一个小坑,就是我们可以发现如果我们初始条件只定义dp [0] [0] = 1,那么就会造成永远也得不到正确结果,这是为什么呢?
这是因为我们的动态递归循环中,是从1,1开始的,那么所有在m或n上等于0的情况都不可能被遍历到,那么对于0,m和n,0(注意:这里的m和n的意思是:从0到m和从0到n,就是第一行和第一列),永远都是0(数组中没有显示赋值,默认赋值为0),那么后面的结果就不可能正确。因此我们要显示的为第一行和第一列进行显示的赋值。
- 创建一个数组来保存数据
- 已知条件初始赋值
- 自低向上,求得结果
- 设置动态转移方程
public int uniquePaths(int m, int n) {//1.创建一个数组,来保存每一个点的路径和int[][] dp = new int[m][n];//2.已知条件,初始赋值,对于第一行或第一列来说只有一直向右或一直向下才可能到达,所以只有一种情况for(int i=0; i<n; i++){dp[0][i] = 1;} for(int i=0; i<m; i++){dp[i][0] = 1;}//3.自底向上,求得结果for(int i=1; i<m; i++){for(int j=1; j<n; j++){//4.设置动态转移方程dp [i][j] = dp[i][j-1] + dp[i-1][j];}}//5.返回结果return dp[m-1][n-1];
}
这里我们可以看到,对于初始赋值时,我们要关注我们的底是从何开始,开始前的值都应该显示的进行赋值。
这道题也可以用递归。
LeetCode 343. 整数拆分
这道题和剑指offer上的剪绳子其实是一样的题,只是一个数字一个是长度。
分析:
这道题在做完以后,看了后面的题解,只想说一句,数学牛逼!
但是用动态规划来还是很好做的,还是第一步找规律,站的高一点,我们直接看题目给的n时的情况。
对于n,它可以分成很多段,只要和为n就行,最后得到积最大即可。
那么对于n来说它的乘积是怎样组成的呢?
我们可以试着将n先分一部分出来,从2开始(因为1乘以任何数都是本身,那么没有必要从1开始),那么现在已经分了一段出来了,那么积为多少呢? 积 = 2 * (n-2); 但对于(n-2)来看,它又可以无限的分下去,但是这道题只要得到积最大即可,那么我们就可以把(n-2)的最大积求出来 ,然后再去求2 * dp[n-2] 的最大值。
所以我们现在可以得出第一部分的动态转移方程: dp[n] = 2 * dp[n-2]; 但是对于每次分的部分来说,这次是2,下一次分的部分就是3,那么转移方程就变为: dp[n] = 3 * dp[n-3]; 那么对于这种数字递增的那么我们就可以使用for循环来动态递增了,转变为:dp[n] = i * dp[n-i]; (i的范围从2到n-1,不能包括n,因为不可能把全部都分了吧,那么整个数字都没有,n * 0 = 0)。
好了,现在我们已经得到动态转移方程了,现在下一步,我们就应该通过自低向上来得到每一个dp[n-i]了。
public int integerBreak(int n) {//优化:减少运行次数if(n <= 2){return 1;}//1.创建数组,保存数据,这里我们最后是要达到n的,所以数组的长度为n+1int[] dp = new int[n+1];//2.已知条件,默认赋值dp[2] = 1;//3.第一个for循环是自底向上for(int i=3; i<=n;i++){//第二个for循环就是将数字不断划分部分来找到最大值for(int j=2;j<i; j++){//4.设置动态转移方程//注意:这里的需要用两个max,因为在数字划分的时候,是在当前for循环的,但是i是不变的,那么如果在循环中求得了最大值,就需要通过一个max嵌套来保存//方便理解可以写成这样:int temp = Math.max(j*(i-j),j*dp[i-j])); 求得当前划分的最大值// dp[i] = Math.max(dp[i],temp); 跟已经得到最大值进行比较,保存最大的dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j]));}}//5.返回结果return dp[n];
}
这里的自底向上是从3开始的,因为只有数字2才可能划分数字出来。
j从2开始的,就如前面所说的,一个数字如果划分一部分为1,1乘以任何数都为本身,没有必要,所以直接从2开始划分。
1.4 动态规划(背包问题)
前面的题目和主要是在一种状态下的,下面我们研究多个状态下的动态规划问题。
1.4.1 经典题目:背包问题
问题:有一个背包给定一定的容量,现在需要装物品,每一个物品有固定的价值和大小,如何才能使背包装的价值最大?
分析:
- 每一个物品都有自己的价值和重量
- 背包的容量有限
- 每一个物品能装多次
我们还是应用前面的自底向上,不断获取数据来充实我们的数组,利用已有的数据来得到结果。
首先简化这个问题,这里提供了多个物品,那么我们可以先设定只有一个物品,那么对于背包来说只有一种选择,只有背包的容量大于物品的重量时,才能将物品装入,容量为n倍时,可以装入n个物品,最大价值也就可以相应的求出。
接下来,我们把难度加大,现在有两个物品可以选择。我们可以怎么做呢?
做前面整数拆分题时,我们是将数字先拆分出来一部分然后再算积的值,当时的转移方程是 dp[i] = Math.max(j * (i-j), j * dp[i-j]); 对于背包问题我们也可以这样思考。
现在背包容量是固定的,那么我们可以先全部只装第一种物品来求得最大值。
我们可以让背包的容量从1开始不断递增,直到给出的容量大小,然后不断装入这唯一的物品,将容量填满,将每次容量大小下的最大价值保存下来,那么可得方程:
dp[i] = v[1] + dp[i-w[1]];
注:dp[i]:背包的容量,不断增大; v[1]:第一个物品的价值;dp[i-w[1]]:剩余容量能够装入的最大价值。
现在开始考虑第二个物品的装配是否会影响已经求得的最大值,那么和数字拆分一样,我们可以先将尝试第二种物品加入(背景:第一个物品需要容量为1,价值为15;第二个物品需要容量为2,价值为20),此时装入第二个物品,那么剩下的容量就可以装物品一或物品二(只要将剩下的容量填满就行,不限制数量)。
那么对于这种情况我们可以得到:容量4的背包的最大价值 = 物品2的价值 + 剩余容量能装入物品的价值。
物品2的价值我们是可以得到的那么剩余容量能装入物品的价值是多少呢?
为了使整体得到的dp[i]最大,物品2的价值已经固定只能由后半部分剩余容量装入的物品价值最大,整体才会最大。
那么此时尝试加入物品2,那么可以得到的方程为:dp[i] = v[2] + dp[i-w[2]];
为了求得最大值,那么我们就应该和在不加入物品情况下得到的最大值进行比较,那么在不加入新物品得到的最大值是多少呢?
dp[i]本身,其实很好理解,我们是先固定物品,然后不断的扩大物品的容量,那么dp[i]本身已经保存的值就是上一个没有加入新物品时的最大值。
那么现在,尝试加入物品2以后求最大值的方程为:dp[i] = Math.max(dp[i],v[2] + dp[i-w[2]]);
但是物品不只有两个,有多个,那么我们就可以尝试不断加入新的物品,物品的下标用j表示,那么方程就可以变为:
dp[i] = Math.max(dp[i],dp[i-w[j]] + v[j]);
注:w[j]代表第j个物品的重量;v[j]代表第j个物品的价值。
我们看到有两个未知数,一个是背包容量的动态递增,一个是物品的动态加入,那么说明就需要两个for循环来动态扩展。
前面我们说了,我们是在固定物品的情况下动态扩展背包容量,这样我们就可以让新加入的物品和在没有加入这个新物品时进行比较,选取最大的。
那么就是物品的动态加入是外层for循环,背包的动态扩容是在内存for循环,现在我们就可以写我们的方法。
没有图解,只有文字,可能不太好理解。见谅。
核心:我们需要前面没有加入新物品的最大值数据,在获得数据下,进行尝试加入新的物品,来判断加入新物品后是否会对最大值影响。
public int findPackeMax(int[] value,int[] wight,int capacity){int len = capacity;//1.创建数组,保存数据,最后是要到达背包的容量,数组大小容量+1int[] dp = new int[len+1];//2.初始赋值,容量为0,那么价值也为0dp[0] = 0;//3.自底向上//先遍历物品,不断加入新的物品for (int i = 1; i < wight.length; i++) {//再遍历背包,固定容量capacity for (int j = 0; j <= capacity; j++) {//只有背包的容量大于当前需要尝试加入的新物品的需要的容量才能进行装入if (j >= i)dp[j] = Math.max(dp[j],value[i] + dp[j-wight[i]]);}}//3.返回结果return dp[len];
}
总结:
对于背包这类物品不断加入的问题,我们需要用多个for循环来进不断加入物品和不断扩大背包容量,只有这样我们转移方程中的动态获取部分( dp[i - w[j]] ),才有可能得到最好的结果。
动态规划的核心是,利用已经求得数据,在前面获取的数据基础上得到下一个需要的解,但获取的数据不是随便来的,一定是有用的进行保存,这里有用的数据就是没有加入新物品时的最大值。
1.5 题目练习
LeetCode 518. 零钱兑换 II
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
分析:
题目中说硬币可以无限使用。
还是前面的背包问题一样,但是不用考虑价值最大,我们只需要凑出来就可以了。
还是和上面一样,固定物品,遍历价值。
注:下面我是先遍历的物品,再遍历的背包容量,对于这种无限制数量的题都是可以的。
public int change(int amount, int[] coins) { int len = amount;//1.创建数组,保存数据,最后要到达amount因此长度为amount+1int[] dp = new int[len+1];//2.已知条件,默认赋值//这里我们认为如果和为0,是有一种情况的。事实:题目也是这么规定的dp[0] = 1;//3.自底向上for(int i=0; i<coins.length; i++){for(int j=1; j<=len; j++){//跟背包问题一样,首先需要装的下才行,这里就是硬币的值不能超过和,如果超过那么就没有必要算//后面并且是优化,也可以不写。只有新放入的硬币,减去以后存在组合的可能性(即不为0)才有可能组成新的组合if(j >= coins[i] && dp[j - coins[i]] != 0){//因为问的是所有可能性,即在不添加新硬币求得可能加上加入新硬币求得的可能的和dp[j] = dp[j] + dp[j-coins[i]];}}}//4.返回结果return dp[len];
}
核心:不断扩容,不断添加新的物品。
这里就是求组合,组合不要求顺序,只有能够组成就行。
排列要求顺序,既要能够组合出来,并且顺序还不能是一样。
LeetCode 322. 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
分析:
这道题和前面很类似,但是又不尽相同。
这里要求的不是求组成价值的个数,而是需要求的是组成指定数目所需最小硬币的个数。
首先还是和前面一样,我们固定硬币的种类,然后不断扩大值的大小。
怎么找寻规律呢?先站的够高,我们来看看值最大时,加入最后一枚硬币的选项时的情况。(要求组成的值为11,有三种硬币,分别为1,2,5),此时值是11,最后一枚硬币为5,我们尝试加入,可得方程:
dp[11] = dp[11 - 5];
加入最后一枚硬币以后,现在剩下需要组成的值为7,我们就查看组成dp[7]所需要的硬币数量是多少,得到以后再加1。
因为加入的最后一枚硬币也是组成11的一个部分,那么方程为:
dp[11] = d[11-5] + 1;
那么dpp[7]从哪里来呢?还记得自底向上吗?通过价值不断扩容到7时得到的。
我们将硬币的种类和价值的大小来进行自底向上,可以得到一个方程:
dp[i] = Math.min(dp[i], dp[i-coins[j]] + 1);
注:i为最后需要组成的数,j代表硬币在数组中的下标。
然后如前面一样,先for循环物品,再for循环价值。
这道题有个坑,因为我们要求组成的个数最小,就需要使用min来求得最小值。
但是在初始化的时候,如果我们只初始化dp[0] = 0; 那么就会出现一个问题整个dp数组最后的值都是0。
这是因为,min永远会取0这个值。
这个时候我重新分析题目,发现题目说了可能会有不能组成的情况,需要返回-1,并且当没有进行硬币组合求个数的时候,数组的初始值应该为无穷大,因为我们还没有进行组合嘛,且还有可能这个值没有组合的情况。
是否能够组合和组合需要个数都不知道,且我们求的最小的组成个数,那么对比初始,如果有组合的情况,数组上的值就应该被替换,后面如果出现更小的情况,也会替换,这样我们才能获得组合个数的最小值。
class Solution { public int coinChange(int[] coins, int amount) { int len = amount; //1.创建数组,保存数据,最后会到达amount因此数组容量+1 int[] dp = new int[len+1]; //2.已知条件,初始赋值 for (int i = 0; i<=len; i++) { dp[i] = 65535; } //价值为的时候没有组成的可能性,题目要求 dp[0] = 0; //3.自底向上,扩展数组 for(int i=0; i<coins.length; i++){ for(int j=1; j<=len; j++){ if(j >= coins[i]){ //只有大于当前硬币的值才进行 dp[j] = Math.min(dp[j],1+dp[j-coins[i]]); } } } //4.返回结果,如果值为65535说明没有组合的情况返回-1 return dp[len]==65535?-1:dp[len]; }}
这道题本身就是背包问题,看似简单了,实则还是需要debug和分析题目来使题目完整。
总结:
- 一定要动态的扩展物品和背包的容量
- 可以用二维数组
- 一些可以动态加入物品和动态扩展背包容量的题都可以用动态规划尝试解答
- 自底向上,获取有用数据,不断保存,需要时使用
- 和原有、没有加入新物品时的背包进行比较,得到最优解
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 稀疏数组的理解与实现
稀疏数组稀疏数组的概念稀疏数组的处理思想记录稀疏数组中有几行几列,有几个不同的值把具有不用值的元素记录在一个小规模的数组中,从而缩小程序规模稀疏数组的实现遍历数组,获取有效数据根据有效数据创建稀疏数组将有效数据存入稀疏数组自我…...
2024/4/13 15:44:34 - 剑指offer-python:37.求最小的k个数/最大的k个数
最小的k个数: 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。 输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2…...
2024/4/7 20:54:25 - Java井字棋小游戏
要求:读入一个3*3的矩阵,矩阵中的数字1表示该位置上有一个X,为0表示为O 程序判断这个矩阵中是否有获胜的一方,输出表示获胜一方的字符X或O,或输出无人获胜 运行结果: 代码如下: import java.util.Scanner;/*** 2022/2/3*/ public class lian1 {public static void main(Stri…...
2024/4/30 19:25:23 - 十六进制转八进制:给定n个十六进制正整数,输出它们对应的八进制数。
问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1<n<10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数&#…...
2024/4/16 2:49:56 - Fallback回退及BlockHandler
...
2024/4/16 2:50:32 - Android自定义动态布局 — 多图片上传,2021最新阿里Android面经
android:background"#cbcbcb" android:orientation“vertical” android:padding“0.2px” /> <TextView android:id"id/text_no_data" android:layout_width“wrap_content” android:layout_height“wrap_content” android:layout_margin“…...
2024/4/20 4:08:24 - gurobi学术版到期处理
cmd中输入key,不成功的话需要: 卸载重新下载,并查看系统变量中license目录位置的更换,python中更新 将gurobi的安装目录中C:\Gurobi\win64\python27\lib中的文件夹gurobipy(注意是文件夹)拷贝到python的安装…...
2024/4/13 15:45:25 - 【愚公系列】2022年02月 Python教学课程 58-Django框架之悲观锁和乐观锁
文章目录前言1.悲观锁2.乐观锁一、Django中的悲观锁1.悲观锁案例2.关联对象锁定二、Django中的乐观锁总结前言 在电商秒杀等高并发场景中,仅仅开启事务还是无法避免数据冲突。比如用户A和用户B获取某一商品的库存并尝试对其修改,A, B查询的商品库存都为…...
2024/4/13 15:45:24 - 前端入门JavaScript-----字符串的常用方法
包前不包后原则...
2024/4/19 5:29:54 - 【Node - Mongodb 】常用指令
pipeline操作符號 幫助你進行複雜的操作,每個符號都會接受documents,並對這些document做些相應的操作,然後再將結果傳至下一個pipeline直到最後結果出現。 db.getCollection(sales).insertMany([ { "_id" : 1, "item" …...
2024/4/13 15:45:39 - 求一个整数的各个位数
公式: number%10 得出number的个位数 number/10%10 得出number的十位数 number/100%10 得出number的百位数 number/1000%10 得出number的千位数 … … 例题: 求45362的各个位数 个位数: 45326%106 十位数: 45326/10%10…...
2024/4/17 21:37:31 - CANOpen数据字典的编辑工具
需要的环境支持: 1. python-2.7.18.amd64.msi 2. wxPython2.8-win64-unicode-2.8.12.1-py27.exe 3. CanFestival-3-de1fc3261f21\objdictgen目录下的Gnosis_Utils压缩包...
2024/4/13 15:45:25 - vslam十四讲 ch5踩坑记录
1.eigen3相关程序编译不通过,显示找不到eigen3头文件,使用软连接sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen链接到eign3头文件,编译时若依然未通过,则在cmake中加入eigen3绝对路径。若编译报错但通过,则…...
2024/4/19 20:30:30 - Android编译打包的过程,flutter安装
编译打包的整体流程 aapt (Android Asset Packaging Tool)编译和打包资源的工具 将资源文件编译成二进制文件 使用方法 F:\AndroidStudio\sdk\build-tools\30.0.2添加到path环境变量下载openhub的apk, 修改apk文件 (aapt l&a…...
2024/4/13 15:45:29 - linux内核的init线程
linux内核的init线程 (注) 本文代码出自linux内核版本:4.1.15(小生的文章若无特别说明,都将基于此版本) 本文代码的出处文件以(/)开头,代表linux内核的安装目录。&#…...
2024/4/13 15:45:49 - Anaconda 环境管理
Conda是一种通用包管理系统,旨在构建和管理任何语言的任何类型的软件。 Anaconda 是一个包管理器、一个环境管理器、一个 Python/R 数据科学发行版以及超过 7,500 个开源包的集合。 Miniconda是一个免费软件包,包含 conda 包和环境管理器,但M…...
2024/4/16 2:50:22 - JS第四讲--变量(下)
(十一)字面量 可以根据浏览器控制台的输出内容的颜色判断它是什么类型. number:蓝色 string:黑色 boolean:蓝色 undefined,null:灰色 字面量:是在源代码中一个固定值的表示法,通俗来说,就是字面量如何表达这个值. 数字字面量:8,9,10 字符串字面量:黑马程序员,大前端 布尔字面量…...
2024/4/20 4:31:55 - Android网络收集和ping封装库,flutter开发的app案例
比如,可以在开始请求记录时间,记录connectStart,connectEnd等方法时间,则可以计算出connect连接时间。 04.如何使用 如下所示 new OkHttpClient.Builder() //配置工厂监听器。主要是计算网络过程消耗时间 .eventListenerFactor…...
2024/4/13 15:45:34 - JavaScript jQuery对象和DOM对象
1.用原生JS获取来的对象就是DOM对象 2. jQuery方法获取的元素就是jQuery对象。 3. jQuery对象本质是:利用$对DOM对象包装后产生的对象(伪数组形式存储)。 1. DOM 对象: 用原生js获取过来的对象就是DOM对象 2. jQuery对象: 用jquery方式获取过来的对象是…...
2024/4/7 20:54:11 - 拦截器的实现和简单原—ssmspringboot
目录 原理大概: 自定义拦截器-SSM 自定义拦截器—springboot 原理大概: 核心方法是DispatcherServerlet中的doDispatcher(): //1. mapperHandlergetHandler(processedRequest);//2. HandlerAdapter hagetHandlerAdapter(mapperedHandler.getHandler());…...
2024/4/18 20:08:39
最新文章
- (学习日记)2024.05.11:UCOSIII第六十五节:常用的控制宏介绍 第一部分
之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…...
2024/4/30 20:58:02 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - [Spring Cloud] gateway全局异常捕捉统一返回值
文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…...
2024/4/30 3:47:11 - AI小程序的创业方向:深度思考与逻辑引领
随着人工智能技术的快速发展,AI小程序逐渐成为创业的新热点。在这个充满机遇与挑战的时代,我们有必要深入探讨AI小程序的创业方向,以把握未来的发展趋势。 一、目标市场定位 首先,我们要明确目标市场。针对不同的用户需求&#x…...
2024/4/30 2:38:07 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/29 23:16:47 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/30 18:14:14 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/30 18:21:48 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57