动态规划(简单多状态 dp 问题 1.按摩师 2.打家劫舍 II 3. 删除并获得点数 4.粉刷房子 5.买卖股票的最佳时机(全系列))

news2024/11/12 18:07:50
  1. 面试题 17.16. 按摩师
  2. 213. 打家劫舍 II
  3. 740. 删除并获得点数
  4. LCR 091. 粉刷房子 (原:剑指 Offer II 091. 粉刷房子)
  5. 309. 买卖股票的最佳时机含冷冻期
  6. 714. 买卖股票的最佳时机含手续费
  7. 123. 买卖股票的最佳时机 III
  8. 188. 买卖股票的最佳时机 IV

1.按摩师

题目分析:

我们在题目中可以了解到按摩师不能按摩相邻两个请求。于是:

dp
1231

当我们选 1 时,2号就不能选了,可选3号和4号,同理,我们再选3号,就不能选4号

当我们选 2 时,1号和3号就不能选了,可选4号

于是我们得最大预约时长就是1号和3号;

2.讲解算法原理

1.状态表示:

dp[i] 表示为到达 i 的位置时,此时的最长预约时间;

01........i-1i

此时我们到达i是有两种结果

1. 选择 i 下表的预约时长

2. 不选择 i 下表的预约时长

分析到这我们发现,只定义一种状态表示不了两种结果;

于是我们需要定义两种状态来表示两种结果;即

f[i] 表示:选择到i位置的时候,nums[i] 必选此时的最长预约时长
g[i] 表示:选择到i位置的时候,nums[i] 不选,此时的最长预约时长

2.状态转移方程

01........i-1i

×

 1.选择 i 下表的预约时长时

则我们前面 f [i -1]的状态就只一种,就是不选,但是我们要加上nums的值,所以

f[i] = g[i - 1] + nums[i];

 2.不选择 i 下表的预约时长时

01........i-1i

×

则我们前面 g [i -1]的状态就有两种

1. 不选 时:g[i -1]

2 . 选时:f[i -1]

我们 g [ i ] 就表示为到达(g [i -1]和 f [i - 1])的最大值即可:

g[i] = Math.max(g[i -1],f[i -1]);

3.初始化:

当我们选择第一个时,此时  f [ 0 ] = nums[0];

当我们不选择第一个时,此时  g [ 0 ] = 0;

4.填表顺序:

从左往右,两个表一起填

5.返回值:

返回选和不选时的最大值即可:

return Math.max(f[n - 1],g[n - 1]);

3.编写代码

2. 打家劫舍 II

题目分析:

我们可以看出 打家劫舍 II 和按摩师大差不差,就是这些房子串起来了。于是我们直接步入正题。

2.讲解算法原理

分析:

dp[i] 表示为到达 i 的位置时,此时的偷窃房子达到的最大金额;

因为是环形的所以我们转化成两个线性的“打家劫舍1通过分类讨论,将环形的问题,

总房子
0123.........i -3i -2i - 1i

那么怎么转化成两个线性呢?

就是看我们第一个房子和最后一个房子的状态

1.当我们第一个房子偷时:此时我们发现1号房子和 i 号房子都偷不了

2.当我们最后一个房子偷时:此时我们发现0号房子和 i -1 号房子都偷不了

于是我们可以看出只有四个房子受到影响,那么我们就可以单独拿来讨论,即为第一个线性:

rob(1,i - 1)

剩下不受影响的房子我们就可以转化成另一个线性:

rob(2,i - 2)

当我们转化为两个线性dp后,就和按摩师的算法原理一样了

1.状态表示:

dp[i] 表示为到达 i 的位置时,此时的最长预约时间;

01........i-1i

此时我们到达i是有两种结果

1. 选择 i 下表的预约时长

2. 不选择 i 下表的预约时长

分析到这我们发现,只定义一种状态表示不了两种结果;

于是我们需要定义两种状态来表示两种结果;即

f[i] 表示:选择到i位置的时候,nums[i] 必选此时的最长预约时长
g[i] 表示:选择到i位置的时候,nums[i] 不选,此时的最长预约时长

2.状态转移方程

01........i-1i

×

 1.选择 i 下表的预约时长时

则我们前面 f [i -1]的状态就只一种,就是不选,但是我们要加上nums的值,所以

f[i] = g[i - 1] + nums[i];

 2.不选择 i 下表的预约时长时

01........i-1i

×

则我们前面 g [i -1]的状态就有两种

1. 不选 时:g[i -1]

2 . 选时:f[i -1]

我们 g [ i ] 就表示为到达(g [i -1]和 f [i - 1])的最大值即可:

g[i] = Math.max(g[i -1],f[i -1]);

3.初始化:

当我们选择第一个时,此时  f [ 0 ] = nums[0];

当我们不选择第一个时,此时  g [ 0 ] = 0;

4.填表顺序:

从左往右,两个表一起填

5.返回值:

返回选和不选时的最大值即可:

return Math.max(f[n - 1],g[n - 1]);

3.编写代码

3. 删除并获得点数

题目分析:

我们从题目中可以看出,如果选择num[i]  = 3的值话, 那么 2 的值和4的值就不能选了,于是乎我们的第一个实例就为 4 + 2 =6;

2.讲解算法原理

分析:

223334

我们看上述的例子会发现相同的数都可以相加在一起,但是选择num[i]  = 3的值,那么 2 的值和4的值就不能选了

于是我们可以在创建一个数组去统计所有相同数字的和,并将数组中的数,统计到 arr 中。然后在 arr 中,做一次“打家劫舍”问题即可,此时我们得arr数组就为:

1234
0494

 我们这样便利一下就好了:    

for(int x : nums) arr[x]+=x; 

1.状态表示:

dp[i] 表示为到达 i 的位置时,此时的最长预约时间;

01........i-1i

此时我们到达i是有两种结果

1. 选择 i 下表的预约时长

2. 不选择 i 下表的预约时长

分析到这我们发现,只定义一种状态表示不了两种结果;

于是我们需要定义两种状态来表示两种结果;即

f[i] 表示:选择到i位置的时候,nums[i] 必选此时的最长预约时长
g[i] 表示:选择到i位置的时候,nums[i] 不选,此时的最长预约时长

2.状态转移方程

01........i-1i

×

 1.选择 i 下表的预约时长时

则我们前面 f [i -1]的状态就只一种,就是不选,但是我们要加上nums的值,所以

f[i] = g[i - 1] + nums[i];

 2.不选择 i 下表的预约时长时

01........i-1i

×

则我们前面 g [i -1]的状态就有两种

1. 不选 时:g[i -1]

2 . 选时:f[i -1]

我们 g [ i ] 就表示为到达(g [i -1]和 f [i - 1])的最大值即可:

g[i] = Math.max(g[i -1],f[i -1]);

3.初始化:

当我们选择第一个时,此时  f [ 0 ] = nums[0];

当我们不选择第一个时,此时  g [ 0 ] = 0;

4.填表顺序:

从左往右,两个表一起填

5.返回值:

返回选和不选时的最大值即可:

return Math.max(f[n - 1],g[n - 1]);

3.编写代码

4.粉刷房子

题目分析:

示例1
绿
17217
16165
14319

 我们从以上表中就能看出我们将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色花销最少,并且你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。

2.讲解算法原理

1.状态表示:

01........n - 1n

当我们粉刷最后一个时,我们会有三种状态表示:

dp[i][0]表示:粉刷到i位置的时候,最后一个位置粉刷上 红色,此时的最小花费
dp[i][1]表示:粉刷到i位置的时候,最后一个位置粉刷上 蓝色此时的最小花费

dp[i][2]表示:粉刷到i位置的时候,最后一个位置粉刷上 绿色,此时的最小花费

2.状态转移方程

1.粉刷到 i 位置的时候,最后一个位置粉刷上红色时,那么我们在 i - 1位置时只能粉刷为 蓝色和绿色的最小花费。

dp[i][0] = Math.min(dp[i - 1][1],dp[i - 1][2])+costs[i - 1][0];

2.粉刷到 i 位置的时候,最后一个位置粉刷上蓝色时,那么我们在 i - 1位置时只能粉刷为 红色和绿色的最小花费。

dp[i][1] = Math.min(dp[i - 1][0],dp[i - 1][2])+costs[i - 1][1];

3.粉刷到 i 位置的时候,最后一个位置粉刷上绿色时,那么我们在 i - 1位置时只能粉刷为 蓝色和红色的最小花费。

dp[i][2] = Math.min(dp[i - 1][1],dp[i - 1][0])+costs[i - 1][2];

3.初始化:

1.虚拟节点里面的值,要保证后续填表是正确的
2.下标的映射关系

4.填表顺序:

从左往右,两个表一起填

5.返回值:

返回粉刷 (红色,蓝色,绿色)房子的最小值即可:

return Math.min(dp[n][0],Math.min(dp[n][1],dp[n][2]));

3.编写代码

5. 买卖股票的最佳时机含冷冻期

题目分析:

我们从题目中可以看出卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

于是我们分析案例可得:

12302
买入卖出冷冻期买入卖出

2.讲解算法原理

1.状态表示:

01........n - 1n

当我们讨论最后一个时,我们会有三种状态表示:

dp[i][0]表示:第i天结束之后,处于“买入”状态,此时的最大利润
dp[i][1]表示:第i天结束之后,处于“可交易”状态,此时的最大利润
dp[i][2]表示:第i天结束之后,处于““冷冻期”状态,此时的最大利润

2.状态转移方程

我们可以先画一个状态机来表示所有状态:(箭头的末端为前一天的状态)

 1.当我们前一天(n - 1)为买入股票时(此时手里是有股票的)我们可以考虑三种情况

   1-1.卖出股票进入冷冻期,此时我们手里有.卖出股票的钱 + price[i - 1]

   1-2 这一天我们也可以啥也不干

   1-3 因为此时我们手里是有股票的,所以不考虑卖出股票这种状态。

2.当我们前一天(n - 1)为冷冻期时(此时手里是没股票的)我们可以考虑三种情况

   2-1 因为此时我们处于冷冻期,购买不了股票,所以不考虑买入股票这种状态。

   2-2 因为此时我们手里是没有股票的,所以不考虑卖出股票这种状态。

   2-3 所以我们只能啥也不干

3.当我们前一天(n - 1)为可交易时(此时手里是没股票的)我们可以考虑三种情况

   3-1.买入股票此时我们要买入股票 所以要 - price[i - 1](股票的价格)

  3-2 这一天我们也可以啥也不干

  3-3 因为我们没有卖出股票进入冷冻期,所以不考虑冷冻期这种状态。

由以上分析我们得出第n天的状态

当位买入”状态‘’时,我们可以啥也不干,或者由前一天的可交易状态购买股票的最大值:

dp[i][0] = Math.max(dp[i - 1][0],dp[i - 1][1] - prices[i]);

当位可交易”状态‘’时,我们可以啥也不干,或者由前一天的冷冻期状态啥也不干进入可交易状态:

dp[i][1] = Math.max(dp[i - 1][1],dp[i - 1][2]);

当位冷冻期”状态‘’时,我们可以啥也不干,或者由前一天的买入股票状态去卖出股票的最大值:

 dp[i][2] = dp[i - 1][0] + prices[i];

3.初始化:

因为我们dp[i][0]表示:买入”状态所以

dp[0][0] = - prices[i];

其他两种状态的收入均为0:

dp[0][1] = dp[0][2] = 0;

4. 填表顺序

从左往右填写,一次填写三个表

5.返回值

返回三种状态 (冷冻期,可交易,买入)的最大值即可:

因为当处于买入状态时(手里是有股票),没卖出去所以不可能为最大值。

所以我们返回剩下两种状态即可:

return Math.max(dp[n-1][1],dp[n - 1][2]);

3.编写代码

6.买卖股票的最佳时机含手续费

题目分析:

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。能够达到的最大利润:

示例1:

132849

在此处买入 prices[0] = 1

在此处卖出 prices[3] = 8

在此处买入 prices[4] = 4

在此处卖出 prices[5] = 9

总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8

2.讲解算法原理

1.状态表示:

01........n - 1n

当我们讨论最后一个时,我们会有三种状态表示:

dp[i][0]表示:第i天结束之后,处于“买入”状态,此时的最大利润
dp[i][1]表示:第i天结束之后,处于“卖出”状态,此时的最大利润

2.状态转移方程

我们可以先画一个状态机来表示所有状态:(箭头的末端为前一天的状态)

 1.当我们前一天(n - 1)为买入股票时(此时手里是有股票的)我们可以考虑两种情况

   1-1.卖出股票此时我们手里有卖出股票的钱 + price[i - 1]

   1-2 这一天我们也可以啥也不干

2.当我们前一天(n - 1)为卖出股票时(此时手里是没股票的)我们可以考虑两种情况

   2-1 因为此时我们此时手里是没股票,所以考虑买入股票这种状态 - price[i - 1]

   2-2这一天我们也可以啥也不干

由以上分析我们得出第n天的状态

当位‘’买入”状态时,我们可以啥也不干,或者由前一天的状态‘’卖出股票‘’购买股票的最大值:

dp[i][0] = Math.max(dp[i - 1][0],dp[i - 1][1] - prices[i]);

当位‘’卖出股票”状态‘时,我们可以啥也不干,或者由前一天的买入股票状态’卖出股票的最大值,但要注意我们是有手续费的:

dp[i][1] = Math.max(dp[i - 1][1],dp[i-1][0] + prices[i] -fee );

3.初始化:

因为我们dp[i][0]表示:买入”状态所以

dp[0][0] = - prices[i];

其他一种状态的收入均为0:

dp[0][1] = 0;

4. 填表顺序

从左往右填写,一次填写两个表

5.返回值

返回两种状态 (卖出,买入)的最大值即可:

因为当处于买入状态时(手里是有股票),没卖出去所以不可能为最大值。

所以我们返回剩下一种状态即可:

return dp[n - 1][1];

3.编写代码

7.买卖股票的最佳时机 III

题目分析:

它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

2.讲解算法原理

1.状态表示:

dp[i] 表示:第i天结束之后,所能获得的最大利润
f[i][j] 表示:第i天结束之后,完成了j次交易,此时处于"买入"状态下的,最大利润

g[i][j] 表示:第i天结束之后,完成了j次交易,!此时处于“卖出"状态下的,最大利润

 2.状态转移方程

我们可以先画一个状态机来表示所有状态:(箭头的末端为前一天的状态)

 1.当我们前一天(n - 1)为买入股票时(此时手里是有股票的)我们可以考虑两种情况

   1-1.卖出股票此时我们手里有卖出股票的钱 + price[i - 1]

   1-2 这一天我们也可以啥也不干

2.当我们前一天(n - 1)为卖出股票时(此时手里是没股票的)我们可以考虑两种情况

   2-1 因为此时我们此时手里是没股票,所以考虑买入股票这种状态 - price[i - 1]

   2-2这一天我们也可以啥也不干

由以上分析我们得出第n天的状态

当位‘’买入”状态时,我们可以啥也不干,或者由前一天的状态‘’卖出股票‘’购买股票的最大值:

f[i][j] = Math.max(f[i - 1][j],g[i - 1][j] - prices[i]);

当位‘’卖出股票”状态‘时,我们可以啥也不干,或者由前一天的买入股票状态’卖出股票的最大值但是我们卖出时的次数要减1,于是就有了两种情况:

1.啥也不干 g[i][j] = g[i - 1][j - 1];

2.当票的次数减为0,此时g下标的j就会发生数组越界情况,所以我们需要做一下判断来保证数组不越界

 if(j >= 1) g[i][j] =  Math.max(g[i][j],f[i - 1][j - 1] + prices[i]);

3.初始化:

因为我们定义了两个数组所以要对他们进行讨论:

f[i][j] 买入股票
第0次第1次第2次
-p[0]-0x3f3f3f3f-0x3f3f3f3f

g[i][j] 卖出股票
第0次第1次第2次
0-0x3f3f3f3f-0x3f3f3f3f

 因为我们所求购买股票的最大值所以不能让后两天的情况去影响我们前两天的值,于是我们把后两天的状态都定义为最小的负值即可,但又怕爆int 所以我们定义为int INF = 0x3f3f3f3f;最大值的一半即可

4. 填表顺序

从上往下填写每一行

每一行从左往右,两个表一起填

5.返回值

y表的最后行里面的最大值

int res = 0;

        for(int j =0; j < 3;j++) res = Math.max(res,g[n - 1][j]);

        return res;

3.编写代码

8.买卖股票的最佳时机 IV

题目分析:

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

2.讲解算法原理

1.状态表示:

dp[i] 表示:第i天结束之后,所能获得的最大利润
f[i][j] 表示:第i天结束之后,完成了k次交易,此时处于"买入"状态下的,最大利润

g[i][j] 表示:第i天结束之后,完成了k次交易,!此时处于“卖出"状态下的,最大利润

 2.状态转移方程

初始k的值(代码优化): 因为我们是有买入股票卖出股票两种状态,所以我们k值是不会超过数组除2的(无论k值是有多大),所以我们仅需去他俩的最小值即可

 k = Math.min(k,n/2);

我们可以先画一个状态机来表示所有状态:(箭头的末端为前一天的状态)

 1.当我们前一天(n - 1)为买入股票时(此时手里是有股票的)我们可以考虑两种情况

   1-1.卖出股票此时我们手里有卖出股票的钱 + price[i - 1]

   1-2 这一天我们也可以啥也不干

2.当我们前一天(n - 1)为卖出股票时(此时手里是没股票的)我们可以考虑两种情况

   2-1 因为此时我们此时手里是没股票,所以考虑买入股票这种状态 - price[i - 1]

   2-2这一天我们也可以啥也不干

由以上分析我们得出第n天的状态

当位‘’买入”状态时,我们可以啥也不干,或者由前一天的状态‘’卖出股票‘’购买股票的最大值:

f[i][j] = Math.max(f[i - 1][j],g[i - 1][j] - prices[i]);

当位‘’卖出股票”状态‘时,我们可以啥也不干,或者由前一天的买入股票状态’卖出股票的最大值但是我们卖出时的次数要减1,于是就有了两种情况:

1.啥也不干 g[i][j] = g[i - 1][j - 1];

2.当票的次数减为0,此时g下标的j就会发生数组越界情况,所以我们需要做一下判断来保证数组不越界

 if(j >= 1) g[i][j] =  Math.max(g[i][j],f[i - 1][j - 1] + prices[i]);

3.初始化:

因为我们定义了两个数组所以要对他们进行讨论:

                                 

f[i][j] 买入股票
第0次第1次第2次........第k-1次第k次
-p[0]-0x3f3f3f3f-0x3f3f3f3f-0x3f3f3f3f-0x3f3f3f3f

g[i][j] 卖出股票
第0次第1次第2次........第k-1次第k次
0-0x3f3f3f3f-0x3f3f3f3f-0x3f3f3f3f-0x3f3f3f3f

 因为我们所求购买股票的最大值所以不能让后两天的情况去影响我们前两天的值,于是我们把后两天的状态都定义为最小的负值即可,但又怕爆int 所以我们定义为int INF = 0x3f3f3f3f;最大值的一半即可

4. 填表顺序

从上往下填写每一行

每一行从左往右,两个表一起填

5.返回值

y表的最后行里面的最大值

int res = 0;

        for(int j =0; j < 3;j++) res = Math.max(res,g[n - 1][j]);

        return res;

3.编写代码

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

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

相关文章

【VBA实战】用Excel制作排序算法动画续

为什么会产生用excel来制作排序算法动画的念头&#xff0c;参见【VBA实战】用Excel制作排序算法动画一文。这篇文章贴出我所制作的所有排序算法动画效果和源码&#xff0c;供大家参考。 冒泡排序&#xff1a; 插入排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a;…

关于Markdown的一点疑问,为什么很多人说markdown比word好用?

markdown和word压根不是一类工具&#xff0c;不存在谁比谁好&#xff0c;只是应用场景不一样。 你写博客、写readme肯定得markdown&#xff0c;但写合同、写简历肯定word更合适。 markdown和word类似邮箱和微信的关系&#xff0c;这两者都可以通信&#xff0c;但微信因为功能…

区块链技术在数字版权管理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 引言 区块链技术概述 …

基于Spring Boot的在线装修管理系统的设计与实现,LW+源码+讲解

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

Ollama 0.4 发布!支持 Llama 3.2 Vision,实现多模态 RAG

“ 阅读本文大概需要5分钟。 前言 最近&#xff0c;Ollama 推出了 0.4 版本&#xff0c;其中最大的亮点就是支持了 Llama 3.2 Vision 模型&#xff0c;该模型具备多模态特性&#xff0c;也就是说能够理解图像并将图像纳入提示词中进行处理&#xff0c;让模型更智能地处理RAG中…

关于若依500验证码问题的求助

关于若依框架中验证码出现500错误的问题&#xff0c;这通常表示服务器内部错误。以下是一些可能的原因及解决方案&#xff1a; 一、配置文件问题 .env.production文件&#xff1a; 确保.env.production文件中的VUE_APP_BASE_API已经修改成服务器上的域名地址&#xff0c;而不…

使用HtmlAgilityPack+PuppeteerSharp+iText7抓取IdentityServer4帮助文档

需要学习IdentityServer4的用法&#xff0c;但是在IdentityServer4帮助文档网站&#xff08;参考文献1&#xff09;中没有找到下载离线文档的地方&#xff0c;准备使用HtmlAgilityPackPuppeteerSharpiText7将网站内容抓取生成离线PDF文档&#xff0c;便于本机学习、查看。   …

fpga开发原理图设计仿真分析

目录 原理图设计方法的流程 仿真分析 method1. 基于向量波形的仿真方法 method2. 基于testbench的仿真方法 在Quartus Prime开发环境下&#xff0c;进行EDA设计的基本流程如图所示。 包括五个主要任务: (1) 建立工程 (2) 设计输入 (3) 编译、综合与适配 (4) 引脚…

Node.js——fs模块-路径补充说明

1、相对路径&#xff1a; ./座右铭.txt 当前目录下的座右铭.txt座右铭.txt 等效于上面的写法../座右铭.txt 当前目录的上一级目录中的座右铭.txt 2、绝对路径 D&#xff1a;/Program File Windows系统下的绝对路径/usr/bin Linux系统…

从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot集成RabbitMQ RabbitMQ中的一些角色&#xff1a; publisher&#xff1a;生产者 consumer&#xff1a;消费者 exchange个&#xff1a;交换机&#xff0c;负责消息路由 queue&#xff1a;队列…

比流计算资源效率最高提升 1000 倍,“增量计算”新模式能否颠覆数据分析?

作者 | 关涛 云器科技CTO 数据平台领域发展 20 年&#xff0c;逐渐成为每个企业的基础设施。作为一个进入“普惠期”的领域&#xff0c;当下的架构已经完美了吗&#xff0c;主要问题和挑战是什么&#xff1f;在 2023 年 AI 跃变式爆发的大背景下&#xff0c;数据平台又该如何演…

MySQL性能测试方案设计

在现代互联网系统中&#xff0c;数据库性能直接影响到整体应用的速度和用户体验。而MySQL作为广泛使用的关系型数据库&#xff0c;随着数据量和并发请求的增长&#xff0c;其性能问题也日益突出。今天我们将深入探讨如何设计一套高效的MySQL性能测试方案&#xff0c;帮助你精准…

彻底解决单片机BootLoader升级程序失败问题

文章目录 1、引言2、MicroBoot&#xff1a;优雅的解决升级问题问题1&#xff1a;bootloader 在跳转到app前没有清理干净存在的痕迹问题2&#xff1a; 需要 APP 传递信息给 Bootloader问题3&#xff1a; APP单独运行没有问题&#xff0c;通过Bootloader跳转到APP运行莫名死机问题…

Oracle OCP认证考试考点详解082系列17

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 81. 第81题&#xff1a; 题目 81.Examine these SOL statements which execute successfully Which two statements are true after exec…

【EFK】Linux集群部署Elasticsearch最新版本8.x

【EFK】Linux集群部署Elasticsearch最新版本8.x 摘要环境准备环境信息系统初始化启动先决条件 下载&安装修改elasticsearch.yml控制台启动Linux服务启动访问验证查看集群信息查看es健康状态查看集群节点查询集群状态 生成service token验证service tokenIK分词器下载 摘要 …

基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析

摘要 本项目旨在基于Python对20个城市的天气数据进行采集与可视化分析&#xff0c;以评估天气的适宜出行度。该分析通过四个主要指标进行量化&#xff0c;这些指标分别是天气状况良好率、空气质量优良率、气温适宜率和安全天气率。通过这些指标&#xff0c;我们能够有效地判断…

外贸管理利器7选,助力高效办公

推荐7款外贸管理软件&#xff0c;包括ZohoBooks、ZohoCRM、富通天下等&#xff0c;各具特色&#xff0c;满足外贸企业不同需求&#xff0c;提高管理效率&#xff0c;助力企业全球化竞争。、 一、Zoho Books Zoho Books是一款外贸财务管理软件&#xff0c;不仅为用户提供了一个…

【JWT】Asp.Net Core中JWT刷新Token解决方案

Asp.Net Core中JWT刷新Token解决方案 前言方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。方案二:实现用户无感知的刷新token值,我们希望当响应返回的数据是401身份过期时,响应阻拦器自动帮我…

当AI遇上时尚:未来的衣橱会由机器人来打理吗?

内容概要 在当今这个快速发展的时代&#xff0c;人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战&#xff0c;许多人在挑选服饰时难以做出决策。然而&#xff0c;随着技术的进步&#xff0c;智能推荐和自…

编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析&#xff1a;imx_pinctrl_soc_info结构体Pinctrl子系统中c…