15.动态规划:数据结构优化DP

数据结构优化DP有前缀和、滑动窗口、树状数组、线段树、单调栈、单调队列

文章目录

  • 树状数组优化DP
    • [300. 最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/)【值域树状数组】
    • [2926. 平衡子序列的最大和](https://leetcode.cn/problems/maximum-balanced-subsequence-sum/)
  • 线段树优化DP
    • [300. 最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/)【值域线段树】
  • 单调队列优化DP
    • 🚀[1425. 带限制的子序列和](https://leetcode.cn/problems/constrained-subsequence-sum/)
    • [1687. 从仓库到码头运输箱子](https://leetcode.cn/problems/delivering-boxes-from-storage-to-ports/)

树状数组优化DP

300. 最长递增子序列【值域树状数组】

中等

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

朴素解法

方法一:枚举选哪个 O(n^2)

方法二:贪心+二分查找 O(nlogn)。交换状态和状态值 dp[i] 表示末尾元素为 nums[i] 的LIS长度 == > g[i] 表示长度为 i+1 的LIS 的末尾元素的最小值

一个新员工一个老员工价值相当,老员工就可以走了,因为新员工被榨取的剩余空间更多。

class Solution {/**方法一:O(n^2)定义 f[i]表示以i结尾的递增子序列的长度转移 f[i] = f[j] + 1 , 其中j满足0<j<i && nums[j] < nums[i]*/public int lengthOfLIS(int[] nums) {int n = nums.length;int[] f = new int[n];int ans = 0;Arrays.fill(f, 1);for(int i = 0; i < n; i++){for(int j = 0; j < i; j++){if(nums[i] > nums[j])f[i] = Math.max(f[i], f[j]+1);}ans = Math.max(ans, f[i]);}return ans;}
}class Solution {/**方法二:O(nlogn)定义 f[i] 表示长度为i的子序列末尾元素为f[i]*/public int lengthOfLIS(int[] nums) {int n = nums.length;int len = 0;int[] f = new int[n];for(int x : nums){// 二分找到 >= x 的第一个下标int left = 0, right = len;while(left < right){int mid = (left + right) >> 1;if(f[mid] < x) left = mid + 1;else right = mid;}f[right] = x;if(right == len) // 如果更新值=len,则长度+1len++;}return len;}
}

树状数组、线段树优化

具体来说,定义 f [ i ] [ j ] f[i][j] f[i][j] 表示 nums \textit{nums} nums 的前 i i i个元素中,以元素 j j j 结尾的满足条件的子序列的最长长度。

  • j ≠ nums [ i ] j\ne\textit{nums}[i] j=nums[i] 时, f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j] = f[i-1][j] f[i][j]=f[i1][j]
  • j = nums [ i ] j=\textit{nums}[i] j=nums[i] 时,我们可以从 f [ i − 1 ] [ j ′ ] f[i-1][j'] f[i1][j] 转移过来,这里 j ′ < j j'<j j<j取最大值,得 f [ i ] [ j ] = 1 + max ⁡ j ′ = 0 j − 1 f [ i − 1 ] [ j ′ ] f[i][j] = 1 + \max_{j'=0}^{j-1} f[i-1][j'] f[i][j]=1+maxj=0j1f[i1][j]

上式有一个「区间求最大值」的过程,这非常适合用线段树计算,且由于 f [ i ] f[i] f[i] 只会从 f [ i − 1 ] f[i-1] f[i1] 转移过来,我们可以把 f f f 的第一个维度优化掉。这样我们可以用线段树表示整个 j j j 数组,在上面查询和更新。

最后答案为 max ⁡ ( f [ n − 1 ] ) \max(f[n-1]) max(f[n1]),对应到线段树上就是根节点的值。

使用滚动数组优化,可以去掉第一个条件,等价于单点修改,区间查询的问题

f[i] = f[j] + 1

  • 等号左侧:单点修改
  • 等号右侧:区间求max

===>树状数组、线段树维护「区间最大值」

class Solution {/**1. 先对nums节点离散化2. 每次都找比当前数小的最长递增序列,不断更新结果*/public int lengthOfLIS(int[] nums) {// 离散化Set<Integer> set = new HashSet<>(); // 防止重复for(int x : nums) set.add(x);List<Integer> copy = new ArrayList<>(set);Collections.sort(copy);int res = 0;// 值域树状数组,用树状数组维护以元素值j结尾的最长子序列长度BIT tree = new BIT(copy.size()+1);for(int num : nums){// 二分找到 >= nums 的第一个下标, 查找的元素一定存在int left = 0, right = copy.size();while(left < right){int mid = (left + right) >> 1;if(copy.get(mid) < num) left = mid + 1;else right = mid;}int k = right+1; // right即查找的元素,这里+1是因为树状数组下标从1开始// 更新答案,查找以元素值(1,num-1)结尾的LIS的最大值res = Math.max(res, (int)tree.preMax(k) + 1);// 维护树状数组,更新以元素值(1,num)结尾的LIS的最大值tree.update(k+1, (int)tree.preMax(k) + 1);}return res;
}
}// 树状数组模板(维护前缀最大值)
class BIT {private long[] tree;public BIT(int n) {tree = new long[n];Arrays.fill(tree, Long.MIN_VALUE);}public void update(int i, long val) {while (i < tree.length) {tree[i] = Math.max(tree[i], val);i += i & -i;}}public long preMax(int i) {long res = Long.MIN_VALUE;while (i > 0) {res = Math.max(res, tree[i]);i &= i - 1;}return res;}
}

2926. 平衡子序列的最大和

困难

给你一个下标从 0 开始的整数数组 nums

nums 一个长度为 k子序列 指的是选出 k下标 i0 < i1 < ... < ik-1 ,如果这个子序列满足以下条件,我们说它是 平衡的

  • 对于范围 [1, k - 1] 内的所有 jnums[ij] - nums[ij-1] >= ij - ij-1 都成立。

nums 长度为 1子序列 是平衡的。

请你返回一个整数,表示 nums 平衡 子序列里面的 最大元素和

一个数组的 子序列 指的是从原数组中删除一些元素(也可能一个元素也不删除)后,剩余元素保持相对顺序得到的 非空 新数组。

示例 1:

输入:nums = [3,3,5,6]
输出:14
解释:这个例子中,选择子序列 [3,5,6] ,下标为 0 ,2 和 3 的元素被选中。
nums[2] - nums[0] >= 2 - 0 。
nums[3] - nums[2] >= 3 - 2 。
所以,这是一个平衡子序列,且它的和是所有平衡子序列里最大的。
包含下标 1 ,2 和 3 的子序列也是一个平衡的子序列。
最大平衡子序列和为 14 。

示例 2:

输入:nums = [5,-1,-3,8]
输出:13
解释:这个例子中,选择子序列 [5,8] ,下标为 0 和 3 的元素被选中。
nums[3] - nums[0] >= 3 - 0 。
所以,这是一个平衡子序列,且它的和是所有平衡子序列里最大的。
最大平衡子序列和为 13 。

示例 3:

输入:nums = [-2,-1]
输出:-1
解释:这个例子中,选择子序列 [-1] 。
这是一个平衡子序列,而且它的和是 nums 所有平衡子序列里最大的。

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109
class Solution {/**nums[ij] - nums[ij-1] >= ij - ij-1nums[i] - nums[j] >= i - j==> nums[i] - i >= nums[j] - j定义 b[i] = nums[i] - ib[i] >= b[j]  ==> 问题变为从 b 中选一个子序列,满足这个子序列是一个非递减的序列求对应的元素和的最大值a 3 3 5 6b 3 2 4 3定义 f[i] = 以下标 i 结尾的子序列,对应的 nums 的元素和的最大值转移 f[i] = f[j] + nums[i], 其中 j 满足 (j < i && b[j] <= b[i])使用值域树状数组优化,等式左边 单点修改等式右边 区间查询BIT用来维护前缀最大值,设下标为x=b[i],维护的值为max(f[x], f[x-1], f[x-2]..)实现时,需要先把nums[i] - i离散化*/public long maxBalancedSubsequenceSum(int[] nums) {int n = nums.length;int[] b = new int[n];for(int i = 0; i < n; i++){b[i] = nums[i] - i;}Arrays.sort(b);BIT t = new BIT(b.length+1);for(int i = 0; i < n; i++){// j 为 nums[i]-i 离散化后的值(从 1 开始)int j = Arrays.binarySearch(b, nums[i] - i) + 1;long f = Math.max(t.preMax(j), 0) + nums[i];t.update(j, f);}return t.preMax(b.length);}
}// 树状数组模板(维护前缀最大值)
class BIT {private long[] tree;public BIT(int n) {tree = new long[n];Arrays.fill(tree, Long.MIN_VALUE);}public void update(int i, long val) {while (i < tree.length) {tree[i] = Math.max(tree[i], val);i += i & -i;}}public long preMax(int i) {long res = Long.MIN_VALUE;while (i > 0) {res = Math.max(res, tree[i]);i &= i - 1;}return res;}
}

线段树优化DP

300. 最长递增子序列【值域线段树】

中等

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4

示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

树状数组、线段树优化

具体来说,定义 f [ i ] [ j ] f[i][j] f[i][j] 表示 nums \textit{nums} nums 的前 i i i个元素中,以元素 j j j 结尾的满足条件的子序列的最长长度。

  • j ≠ nums [ i ] j\ne\textit{nums}[i] j=nums[i] 时, f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j] = f[i-1][j] f[i][j]=f[i1][j]
  • j = nums [ i ] j=\textit{nums}[i] j=nums[i] 时,我们可以从 f [ i − 1 ] [ j ′ ] f[i-1][j'] f[i1][j] 转移过来,这里 j ′ < j j'<j j<j取最大值,得 f [ i ] [ j ] = 1 + max ⁡ j ′ = 0 j − 1 f [ i − 1 ] [ j ′ ] f[i][j] = 1 + \max_{j'=0}^{j-1} f[i-1][j'] f[i][j]=1+maxj=0j1f[i1][j]

上式有一个「区间求最大值」的过程,这非常适合用线段树计算,且由于 f [ i ] f[i] f[i] 只会从 f [ i − 1 ] f[i-1] f[i1] 转移过来,我们可以把 f f f 的第一个维度优化掉。这样我们可以用线段树表示整个 j j j 数组,在上面查询和更新。

最后答案为 max ⁡ ( f [ n − 1 ] ) \max(f[n-1]) max(f[n1]),对应到线段树上就是根节点的值。

使用滚动数组优化,可以去掉第一个条件,等价于单点修改,区间查询的问题

f[i] = f[j] + 1

  • 等号左侧:单点修改
  • 等号右侧:区间求max

===>树状数组、线段树维护「区间最大值」

class Solution {public int lengthOfLIS(int[] nums) {// 离散化Set<Integer> set = new HashSet<>(); // 防止重复for(int x : nums) set.add(x);List<Integer> copy = new ArrayList<>(set);Collections.sort(copy);N = copy.size();int ans = 0;for(int num : nums){// 二分找到 >= nums 的第一个下标, 查找的元素一定存在int left = 0, right = copy.size();while(left < right){int mid = (left + right) >> 1;if(copy.get(mid) < num) left = mid + 1;else right = mid;}int k = right; // num 对应的下标 k// 查找以元素值(1,num-1)结尾的LIS的最大值int cnt = 1 + query(root,0,N,0,k-1);// 更新 值[k]的最大值// 注意这里是覆盖更新,对应的模版中覆盖更新不需要累加update(root,0,N,k,k,cnt);ans = Math.max(ans, cnt);}return ans;}class Node {// 左右孩子节点Node left, right;// 当前节点值,以及懒惰标记的值int val, add;}private int N = (int) 1e9;private Node root = new Node();public void update(Node node, int start, int end, int l, int r, int val) {if (l <= start && end <= r) {node.val = val;node.add = val;return;}pushDown(node);int mid = (start + end) >> 1;if (l <= mid) update(node.left, start, mid, l, r, val);if (r > mid) update(node.right, mid + 1, end, l, r, val);pushUp(node);}public int query(Node node, int start, int end, int l, int r) {if (r < start || end < l) return 0;if (l <= start && end <= r) return node.val;pushDown(node);int mid = (start + end) >> 1, ans = 0;if (l <= mid) ans = query(node.left, start, mid, l, r);if (r > mid) ans = Math.max(ans, query(node.right, mid + 1, end, l, r));return ans;}private void pushUp(Node node) {// 每个节点存的是当前区间的最大值node.val = Math.max(node.left.val, node.right.val);}private void pushDown(Node node) {if (node.left == null) node.left = new Node();if (node.right == null) node.right = new Node();if (node.add == 0) return;node.left.val = node.add;node.right.val = node.add;node.left.add = node.add;node.right.add = node.add;node.add = 0;}
}

单调队列优化DP

单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,最优解存在队首,而队尾则是最后进队的元素。

单调队列用来维护区间最值或者降低DP的维数减少空间及时间

利用单调队列对dp方程进行优化,可将O(n)复杂度降至O(1)

  • N 维的DP,可以优化为 N-1 维 !!!

单调队列适合优化决策取值范围的上、下界均单调变化的问题

并不是所有DP都可以由单调队列优化,像最大化、最小化决策的结果,即决策具有单调性的题目可以优化。


🚀1425. 带限制的子序列和

困难

给你一个整数数组 nums 和一个整数 k ,请你返回 非空 子序列元素和的最大值,子序列需要满足:子序列中每两个 相邻 的整数 nums[i]nums[j] ,它们在原数组中的下标 ij 满足 i < jj - i <= k

数组的子序列定义为:将数组中的若干个数字删除(可以删除 0 个数字),剩下的数字按照原本的顺序排布。

示例 1:

输入:nums = [10,2,-10,5,20], k = 2
输出:37
解释:子序列为 [10, 2, 5, 20] 。

示例 2:

输入:nums = [-1,-2,-3], k = 1
输出:-1
解释:子序列必须是非空的,所以我们选择最大的数字。

示例 3:

输入:nums = [10,-2,-10,-5,20], k = 2
输出:23
解释:子序列为 [10, -2, -5, 20] 。

提示:

  • 1 <= k <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4

https://leetcode.cn/problems/constrained-subsequence-sum/solutions/220273/dpdan-diao-zhan-you-hua-xiang-jie-by-wangdh15/

class Solution {/**定义f[i]表示以i结尾的最大子序列和,考虑第 i 个元素选还是不选接在后面 f[i] = max(dp[i-j] + nums[i]) , 其中 j < i 且 i-j<=k不接,重新做起点 f[i] = nums[i]取最大值如果枚举所有元素作为结尾的话,时间复杂度O(nk),会超时,如何优化?由于当前时刻只依赖于前k个时刻的状态,所以只要快速找到前k个状态中的最大子序列和即可==> 滑动窗口求最大值*/public int constrainedSubsetSum(int[] nums, int k) {int n = nums.length;int[] f = new int[n]; // 定义f[i]表示以i结尾的最大子序列和// 维护单增队列,队首为最大值,保存 (以下标为结尾的子序列和,下标)Deque<int[]> dq = new ArrayDeque<>();int res = nums[0];for(int i = 0; i < n; i++){f[i] = nums[i]; // 不接if(!dq.isEmpty()){ // 接f[i] = Math.max(f[i], dq.peekFirst()[0] + nums[i]);}res = Math.max(res, f[i]);// 清除队列中无用的元素while(!dq.isEmpty() && dq.peekLast()[0] <= f[i]){dq.pollLast();}dq.addLast(new int[]{f[i], i});if(!dq.isEmpty() && dq.peekFirst()[1] == i - k)dq.pollFirst();}return res;}
}

1687. 从仓库到码头运输箱子

困难

你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制总重量的限制

给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxesmaxWeight ,其中 boxes[i] = [portsi, weighti]

  • portsi 表示第 i 个箱子需要送达的码头, weightsi 是第 i 个箱子的重量。
  • portsCount 是码头的数目。
  • maxBoxesmaxWeight 分别是卡车每趟运输箱子数目和重量的限制。

箱子需要按照 数组顺序 运输,同时每次运输需要遵循以下步骤:

  • 卡车从 boxes 队列中按顺序取出若干个箱子,但不能违反 maxBoxesmaxWeight 限制。
  • 对于在卡车上的箱子,我们需要 按顺序 处理它们,卡车会通过 一趟行程 将最前面的箱子送到目的地码头并卸货。如果卡车已经在对应的码头,那么不需要 额外行程 ,箱子也会立马被卸货。
  • 卡车上所有箱子都被卸货后,卡车需要 一趟行程 回到仓库,从箱子队列里再取出一些箱子。

卡车在将所有箱子运输并卸货后,最后必须回到仓库。

请你返回将所有箱子送到相应码头的 最少行程 次数。

示例 1:

输入:boxes = [[1,1],[2,1],[1,1]], portsCount = 2, maxBoxes = 3, maxWeight = 3
输出:4
解释:最优策略如下:
- 卡车将所有箱子装上车,到达码头 1 ,然后去码头 2 ,然后再回到码头 1 ,最后回到仓库,总共需要 4 趟行程。
所以总行程数为 4 。
注意到第一个和第三个箱子不能同时被卸货,因为箱子需要按顺序处理(也就是第二个箱子需要先被送到码头 2 ,然后才能处理第三个箱子)。

示例 2:

输入:boxes = [[1,2],[3,3],[3,1],[3,1],[2,4]], portsCount = 3, maxBoxes = 3, maxWeight = 6
输出:6
解释:最优策略如下:
- 卡车首先运输第一个箱子,到达码头 1 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第二、第三、第四个箱子,到达码头 3 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第五个箱子,到达码头 2 ,回到仓库,总共 2 趟行程。
总行程数为 2 + 2 + 2 = 6 。

示例 3:

输入:boxes = [[1,4],[1,2],[2,1],[2,1],[3,2],[3,4]], portsCount = 3, maxBoxes = 6, maxWeight = 7
输出:6
解释:最优策略如下:
- 卡车运输第一和第二个箱子,到达码头 1 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第三和第四个箱子,到达码头 2 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第五和第六个箱子,到达码头 3 ,然后回到仓库,总共 2 趟行程。
总行程数为 2 + 2 + 2 = 6 。

示例 4:

输入:boxes = [[2,4],[2,5],[3,1],[3,2],[3,7],[3,1],[4,4],[1,3],[5,2]], portsCount = 5, maxBoxes = 5, maxWeight = 7
输出:14
解释:最优策略如下:
- 卡车运输第一个箱子,到达码头 2 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第二个箱子,到达码头 2 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第三和第四个箱子,到达码头 3 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第五个箱子,到达码头 3 ,然后回到仓库,总共 2 趟行程。
- 卡车运输第六和第七个箱子,到达码头 3 ,然后去码头 4 ,然后回到仓库,总共 3 趟行程。
- 卡车运输第八和第九个箱子,到达码头 1 ,然后去码头 5 ,然后回到仓库,总共 3 趟行程。
总行程数为 2 + 2 + 2 + 2 + 3 + 3 = 14 。

提示:

  • 1 <= boxes.length <= 105
  • 1 <= portsCount, maxBoxes, maxWeight <= 105
  • 1 <= portsi <= portsCount
  • 1 <= weightsi <= maxWeight

https://leetcode.cn/problems/delivering-boxes-from-storage-to-ports/solutions/2006470/by-lcbin-xwzl/

class Solution {/**定义f[i]表示运送前i个箱子需要的最小行程次数转移,枚举上一次运送的状态,包括[1,2,3...maxBoxeds]个箱子,i可以从j转移过来f[i] = f[j-1] + cost[j, i] (i - maxB+1 <= j <= i)cost[j, i] 表示第k~第i个箱子的行程次数枚举所有以i结尾的行程会超时 O(n^2),如何优化?实际上我们是要在[i-maxBoxeds,..i-1]这个窗口内找到一个j,使得f[j] - cost[j]的值最小,问题变为求滑动窗口的最小值如何优化码头i到j的行程数?取决于相邻两个码头是否相等我们可以通过前缀和,计算出码头之间的行程数,再加上首尾两趟行程,就能O(1)计算重量同理*/public int boxDelivering(int[][] boxes, int portsCount, int maxBoxes, int maxWeight) {int n = boxes.length;long[] ws = new long[n+1];int[] cs = new int[n];for(int i = 0; i < n; i++){int p = boxes[i][0], w = boxes[i][1];ws[i+1] = ws[i] + w;if(i < n-1){cs[i+1] = cs[i] + (p != boxes[i+1][0] ? 1 : 0);}}int[] f = new int[n+5];Deque<Integer> dq = new ArrayDeque<>();dq.add(0);for(int i = 1; i <= n; i++){while(!dq.isEmpty() && (i - dq.peekFirst() > maxBoxes || ws[i] - ws[dq.peekFirst()] > maxWeight)){dq.pollFirst();                        }if(!dq.isEmpty()){f[i] = cs[i-1] + f[dq.peekFirst()] - cs[dq.peekFirst()] + 2;}if(i < n){while(!dq.isEmpty() && f[dq.peekLast()] - cs[dq.peekLast()] >= f[i] - cs[i]){dq.pollLast();}dq.addLast(i);}}return f[n];}
}

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

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

相关文章

Go项目快速集成Swagger UI

swag Swag将Go的注释转换为Swagger2.0文档。我们为流行的 Go Web Framework 创建了各种插件&#xff0c;这样可以与现有Go项目快速集成&#xff08;使用Swagger UI&#xff09;。 目录 快速开始支持的Web框架如何与Gin集成格式化说明开发现状声明式注释格式 通用API信息API操…

MySQL实战45讲课后问题

1、第一章 如果表T中没有字段k&#xff0c;而你执行了这个语句 select *fromTwhere k1, 那肯定是会报“不存在这个列”的错误&#xff1a; “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢&#xff1f; 解答&#xff1a;…

网线的制作集线器交换机路由器的配置--含思维导图

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 一、网线的制作 1、网线的材料有哪些&#xff1f; 网线 网线是一种用于传输数据信号的电缆&#xff0c;广泛应…

学生党评测FreeBuds SE 2,华为最便宜的TWS耳机体验如何?

华为最便宜的百元价位TWS耳机——FreeBuds SE 2值得入手吗&#xff1f;学生党实际使用一个多月&#xff0c;今天从个人主观使用感受来展开说说它的优缺点&#xff0c;如果说你正在观望要不要入手这款耳机&#xff0c;希望可以帮到你。 优点一&#xff1a;超长续航 对于我这种…

JMM的内存可见性保证

Java程序的 内存可见性保证 可以分为下列3类 1&#xff09;单线程程序 单线程程序不会出现内存可见性问题。 编译器、runtime、处理器会共同确保单线程程序的执行结果与该程序在顺序一致性模型中的执行结果相同。 2&#xff09;正确同步的多线程程序 Further Reading &…

YOLOv8改进 | 2023注意力篇 | HAttention(HAT)超分辨率重建助力小目标检测 (全网首发)

一、本文介绍 本文给大家带来的改进机制是HAttention注意力机制&#xff0c;混合注意力变换器&#xff08;HAT&#xff09;的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要&#xff0c;而自注意力则关注于图…

Redis cluster集群设置密码

Redis cluster集群设置密码 1 备份数据 # 链接redis集群,执行rdb快照 bgsave # 备份dump.rdb文件 cp /data/redis/cluster/dump.rdb /data/redis/cluster/backup/dump.rdb.202312202 设置密码 必须保证每个节点的密码保持一致&#xff0c;不然 Redirected 的时候会失败 2.1…

C : DS二叉排序树之删除

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现删除功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…

Python 元组完全指南 1

元组用于在单个变量中存储多个项目。 mytuple ("apple", "banana", "cherry") 元组是 Python 中的 4 种内置数据类型之一&#xff0c;用于存储数据集合&#xff0c;另外还有列表、集合和字典&#xff0c;它们都具有不同的特性和用途。元组是有…

分布式锁解决方案之数据库乐观锁实现的分布式锁

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 分布式锁解决方案之数据库乐观锁实现的分布式锁 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目…

cpulimit设计理念及其思考

背景 前几天&#xff0c;同事咨询了我一个问题&#xff1a;IO占用能和cpu使用率那样&#xff0c;有方法来控制吗&#xff1f;这个问题的背景是因为客户提了两个需求&#xff0c;如下&#xff1a; 说实话&#xff0c;针对这两点需求&#xff0c;我的第一反应是有一点思路&#…

Linux 下 GCC 编译共享库控制导出函数的方法

通过一些实际项目的开发&#xff0c;发现这样一个现象&#xff0c;在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL&#xff08;动态链接库&#xff09;中哪些函数可以导出&#xff0c;暴露给其他程序链接使用&#xff0c;哪些函数是 DLL 内部自己使用&#x…

复习linux——ssh服务

SSH服务 ssh&#xff1a;安全的远程登录&#xff0c;实现加密通信&#xff0c;代替传统的telnet协议 具体的软件实现 openssh&#xff1a;ssh协议的开源实现 dropbear&#xff1a;另一个ssh协议的开源项目的实现 ssh公钥交换原理 客户端发起连接请求——客户端得到服务端的公…

PIC单片机项目(5)——基于PIC16F877A的多功能防盗门

1.功能设计 本次设计的功能如下&#xff1a;如果红外对管检测到有人经过&#xff0c;LCD1602可以显示&#xff0c;我设计的是显示字符串“someone”。 如果有人强行破门&#xff0c;FSR402压力传感器会检测到压力过大&#xff0c;然后触发蜂鸣器报警&#xff0c;LCD1602也显示“…

物奇平台消息发收功能实现

物奇平台消息发收功能实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 外设中断消息发送方法

实验4.2 默认路由和浮动静态路由的配置

实验4.2 默认路由和浮动静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.路由器的基本配置。2.配置默认路由&#xff0c;实现全网互通。3.配置浮动静态路由&#xff0c;实现链路备份。 六、任务验收七、任务小结八、知识链接1&#xff0e;默认路…

SpringBoot整合SpringDataJpa QueryDSL和原生态SQL

1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…

【1) 40个powershell命令,掌握它们让你成为新一代命令行大神 2) mkdir, rmdir commands】

40 commands of poershell & mkdir, rmdir I) 40个powershell命令&#xff0c;掌握它们让你成为新一代命令行大神1.1&#xff09; URL1.2&#xff09;Basic 40 commands of powershell1.2.1) get-command1.2.1.1&#xff09;describe1.2.1.2&#xff09;mkdir dir_name, rm…

2023 英特尔On技术创新大会直播 |AI小模型更有性价比

前言&#xff1a; 今年是引爆AI的一年&#xff0c;从幼儿园的小朋友到80岁的老奶奶都认识AI&#xff0c;享受AI带来的便捷&#xff0c;都在向市场要智能&#xff0c;但AI的快速发展离不开底层硬件设施的革新。 英特尔是全球知名的半导体公司&#xff0c;专注于计算机处理器和芯…

pip基本操作指令大全

以下是一些pip的基本操作指令及其用途&#xff1a; 安装包&#xff1a; pip install package_name 安装指定的Python包。如果你想安装特定版本&#xff0c;可以这样指定&#xff1a; pip install package_nameversion_number 升级包&#xff1a; pip install --upgrade pack…