【算法专题】前缀和

前缀和

  • 前缀和
    • 1. 前缀和【模板】
    • 2. 二维前缀和【模板】
    • 3. 寻找数组的中心下标
    • 4. 除自身以外数组的乘积
    • 5. 和为K的子数组
    • 6. 和可被K整除的子数组
    • 7. 连续数组
    • 8. 矩阵区域和

前缀和

1. 前缀和【模板】

题目链接 -> Nowcoder -DP34.前缀和【模板】

Nowcoder -DP34.前缀和【模板】

题目:给定一个长度为n的数组 a1​, a2​, …an.
接下来有q次查询, 每次查询有两个参数l, r.
对于每个询问, 请输出 al + al + 1 + … + ar

输入描述:
第一行包含两个整数n和q.
第二行包含n个整数, 表示 a1, a2, …an.
接下来q行, 每行包含两个整数 l 和 r.
1 ≤ n, q ≤ 10^5
−10^9 ≤ a[i] ≤ 10^9
1 ≤ l ≤ r ≤n

输出描述:
输出q行, 每行代表一次查询的结果.

示例1
输入:
3 2
1 2 4
1 2
2 3

输出:
3
6​

思路:

  1. 先预处理出来⼀个「前缀和」数组:

用 dp[i] 表示: [1, i] 区间内所有元素的和,那么 dp[i - 1] 里面存的就是 [1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i] ;

  1. 使用前缀和数组,「快速」求出「某⼀个区间内」所有元素的和:

当询问的区间是 [l, r] 时:区间内所有元素的和为: dp[r] - dp[l - 1]

代码如下:

		#include <iostream>#include <vector>using namespace std;int main() {int n = 0, q = 0;cin >> n >> q;// 读取数据vector<long long> arr(n + 1);for(int i = 1; i <= n; i++) cin >> arr[i];// 处理前缀和数组vector<long long> dp(n + 1);for(int i = 1; i <= n; i++)dp[i] = dp[i - 1] + arr[i];// 计算区间和while(q--){int l = 0, r = 0;cin >> l >> r;cout << dp[r] - dp[l - 1] << endl;}return 0;}

2. 二维前缀和【模板】

题目链接 -> Nowcoder -DP35.二维前缀和【模板】

Nowcoder -DP35.二维前缀和【模板】

题目:给你一个 n 行 m 列的矩阵 A ,下标从1开始。
接下来有 q 次查询,每次查询输入 4 个参数 x1, y1, x2, y2
请输出以(x1, y1) 为左上角, (x2, y2) 为右下角的子矩阵的和,

输入描述:
第一行包含三个整数n, m, q.
接下来n行,每行m个整数,代表矩阵的元素
接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数

1 <= n,m <= 1000
1 <= q <= 10^5
-10^9 <= a[i][j] <= 10^9
1 <= x1 <= x2 <= n
1 <= y1 <= y2 <= m

输出描述:
输出q行,每行表示查询结果。

思路:前缀和;
1、首先搞出来前缀和矩阵,这里就要用到一维数组里面的拓展知识,我们要在矩阵的最上面和最左边添加上一行和一列 0,这样我们就可以省去非常多的边界条件的处理;处理后的矩阵就像这样:

在这里插入图片描述

这样,我们填写前缀和矩阵数组的时候,下标直接从 1 开始,能大胆使用 i - 1 , j - 1 位置的值。
注意 dp 表与原数组 matrix 内的元素的映射关系:

  • 从 dp 表到 matrix 矩阵,横纵坐标减一;
  • 从 matrix 矩阵到 dp 表,横纵坐标加一

前缀和矩阵中 dp[i][j] 的含义,以及如何递推二维前缀和方程

  1. dp[i][j] 的含义:
    dp[i][j] 表示,从 [0, 0] 位置到 [i, j] 位置这段区域内,所有元素的累加和。对应下图的红色区域

在这里插入图片描述

  1. 递推方程

我们可以将 [0, 0] 位置到 [i, j] 位置这段区域分解成下面的部分:

在这里插入图片描述

dp[i][j] = 红 + 蓝 + 绿 + 紫,分析一下这四块区域:

  • 紫色部分最简单,它就是原数组矩阵中的 matrix[i - 1][j - 1] (注意坐标的映射关系)
  • 单独的蓝不好求,因为它不是我们定义的状态表示中的区域,同理,单独的绿也是;
  • 但是如果是红 + 蓝,正好是我们 dp 数组矩阵中 dp[i - 1][j] 的值
  • 同理,如果是红 + 绿,正好是我们 dp 数组矩阵中 dp[i][j - 1] 的值
  • 如果把上面求的三个值加起来,那就是紫 + 红 + 蓝 + 红 + 绿,发现多算了一部分红的面积,因此再单独减去红的面积即可;
  • 红的面积正好也是符合 dp 数组的定义的,即 dp[i - 1][j - 1]

综上所述,我们的 dp 矩阵递推方程就是:
dp[i][j]=dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]+matrix[i - 1][j - 1]

2、使用 dp 前缀和矩阵

我们可以继续使用下面这个图,题中求的是 [x1, y1] 到 [x2, y2] 的面积:

在这里插入图片描述

也可以画出具体的图理解,如下图所示:

在这里插入图片描述

接下来分析如何使用这个前缀和矩阵,假设上图中这里的 x 和 y 都处理过了,对应的正是 dp 矩阵中的下标;

因此我们要求的就是紫色部分的面积,继续分析几个区域:

  • 红色,能直接求出来,就是 dp[x1 - 1][y1 - 1] (为什么减一?因为要剔除掉 x1 这一行和 y1 这一列,这一行和这一列是要求出来的结果的一部分)
  • 蓝色,直接求不好求,但是和红色拼起来,正好是 dp 表内 dp[x1 - 1][y2] 的数据
  • 同理,绿色不好求,但是 红 + 绿 = dp[x2][y1 - 1] ;
  • 再看看整个面积,非常好求,正好是 dp[x2][y2] ;
  • 那么,紫色 = 整个面积 - 红 - 蓝 - 绿,但是蓝绿不好求,我们可以这样减:整个面积 -(蓝 + 红)-(绿 + 红),这样相当于多减去了一个红,再加上即可

综上所述:紫 = 整个面积 -(蓝 + 红)- (绿 + 红)+ 红,从而可得紫色区域内的元素总和为:dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1]

思路介绍完毕,代码如下:

		#include <iostream>#include <vector>using namespace std;int main() {int n = 0, m = 0, q = 0; cin >> n >> m >> q;// 输入矩阵vector<vector<long long>> arr(n + 1, vector<long long>(m + 1));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> arr[i][j];// 预处理,创建一个 dp 矩阵vector<vector<long long>> dp(n + 1, vector<long long>(m + 1));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j];// 使用矩阵查询while(q--){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;cout << (dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]) << endl;}return 0;}

3. 寻找数组的中心下标

题目链接 -> Leetcode -724.寻找数组的中心下标

Leetcode -724.寻找数组的中心下标

题目:给你一个整数数组 nums ,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 - 1 。

示例 1:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:
输入:nums = [1, 2, 3]
输出: - 1
解释:
数组中不存在满足此条件的中心下标。

示例 3:
输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0 。

提示:

  • 1 <= nums.length <= 10^4
  • 1000 <= nums[i] <= 1000

思路:从中心下标的定义可知,除中心下标的元素外,该元素左边的「前缀和」等于该元素右边的「后缀和」。

  • 因此,我们可以先预处理出来两个数组,⼀个表示前缀和,另一个表示后缀和。
  • 然后,我们可以用一个 for 循环枚举可能的中心下标,判断每一个位置的「前缀和」以及「后缀和」,如果二者相等,就返回当前下标。

代码如下:

		class Solution {public:// 前缀和思想int pivotIndex(vector<int>& nums) {int n = nums.size();vector<int> dp(n + 1);// 先填表for(int i = 1; i <= n; i++)dp[i] = dp[i - 1] + nums[i - 1];// 使用 dp 表for(int i = 1; i <= n; i++)if(dp[i - 1] == dp[n] - dp[i]) return i - 1;return -1;}};

4. 除自身以外数组的乘积

题目链接 -> Leetcode -238.除自身以外数组的乘积

Leetcode -238.除自身以外数组的乘积

题目:给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:
输入: nums = [1, 2, 3, 4]
输出 : [24, 12, 8, 6]

示例 2 :
输入 : nums = [-1, 1, 0, -3, 3]
输出 : [0, 0, 9, 0, 0]

提示:

  • 2 <= nums.length <= 10^5
  • 30 <= nums[i] <= 30

保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

思路:根据题意,对于每⼀个位置的最终结果 ret[i] ,它是由两部分组成的:

  • nums[0] * nums[1] * nums[2] * … * nums[i - 1]
  • nums[i + 1] * nums[i + 2] * … * nums[n - 1]

于是,我们可以利用前缀和的思想,使用两个数组 f 和 g,分别处理出来两个信息:

  • f[i] 表示:i 位置之前的所有元素,即 [0, i - 1] 区间内所有元素的前缀乘积
  • g[i] 表示:i 位置之后的所有元素,即 [i + 1, n - 1] 区间内所有元素的后缀乘积

然后再处理最终结果

代码如下:

		class Solution {public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> f(n, 1), g(n, 1), dp(n);// f[i] 表示:i 位置之前的所有元素,即 [0, i - 1] 区间内所有元素的前缀乘积; // g[i] 表示:i 位置之后的所有元素,即 [i + 1, n - 1] 区间内所有元素的后缀乘积for(int i = 1; i < n; i++) f[i] = f[i - 1] * nums[i - 1];for(int i = n - 2; i >= 0; i--) g[i] = g[i + 1] * nums[i + 1];for(int i = 0; i < n; i++) dp[i] = f[i] * g[i];return dp;}};

5. 和为K的子数组

题目链接 -> Leetcode -560.和为K的子数组

Leetcode -560.和为K的子数组

题目:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
子数组是数组中元素的连续非空序列。

示例 1:
输入:nums = [1, 1, 1], k = 2
输出:2

示例 2:
输入:nums = [1, 2, 3], k = 3
输出:2

提示:

  • 1 <= nums.length <= 2 * 10^4
  • 1000 <= nums[i] <= 1000
  • 10^7 <= k <= 10^7

思路:设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和;想知道有多少个「以 i 为结尾的和为 k 的子数组」,就要找到有多少个起始位置为 x1, x2, x3… 使得 [x, i] 区间内的所有元素的和为 k ;那么 [0, x] 区间内的和就是sum[i] - k 了。于是问题就变成:

  • 找到在 [0, i - 1] 区间内,有多少前缀和等于 sum[i] - k 的即可

在这里插入图片描述

代码如下:

		class Solution {public:int subarraySum(vector<int>& nums, int k) {int n = nums.size();vector<int> dp(n + 1);unordered_map<int, int> hash;// 当整个前缀和等于 k 时,相当于找和为 0 的个数,所以默认和为 0 的有一个hash[0] = 1;int sum = 0, ret = 0;for(int i = 1; i <= n; i++){// 计算当前位置的前缀和dp[i] = dp[i - 1] + nums[i - 1];// 在 [0, i - 1] 区间内,有多少前缀和等于 dp[i] - kif(hash.count(dp[i] - k)) ret += hash[dp[i] - k];hash[dp[i]]++;}return ret;}};

6. 和可被K整除的子数组

题目链接 -> Leetcode -974.和可被K整除的子数组

Leetcode -974.和可被K整除的子数组

题目:给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。

子数组 是数组的 连续 部分。

示例 1:
输入:nums = [4, 5, 0, -2, -3, 1], k = 5
输出:7
解释:
有 7 个子数组满足其元素之和可被 k = 5 整除:
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]

示例 2:
输入: nums = [5], k = 9
输出 : 0

提示 :

  • 1 <= nums.length <= 3 * 10^4
  • 10^4 <= nums[i] <= 10^4
  • 2 <= k <= 10^4

思路:

  • 同余定理:如果(a - b)% p = 0,那么 a % p = b % p;设 [0, x - 1] 区间内所有元素之和等于 a , [0, i] 区间内所有元素的和等于 b ,可得(b - a) % k == 0;

由同余定理可得, [0, x - 1] 区间与 [0, i] 区间内的前缀和同余。于是问题就变成:找到在 [0, i - 1] 区间内,有多少前缀和的余数等于 dp[i] % k 的即可。

代码如下:

		class Solution {public:int subarraysDivByK(vector<int>& nums, int k){int n = nums.size();vector<int> dp(n + 1);unordered_map<int, int> hash;hash[0] = 1; // 0 这个数的余数int ret = 0;for (int i = 1; i <= n; i++){// 当前位置的前缀和dp[i] = dp[i - 1] + nums[i - 1];// 因为 c++ 中负数对正数取余得到的是负数,所以要进行修正,修正后的结果:int tp = (dp[i] % k + k) % k; // 相当于是 dp[i] % k// 统计结果// 如果这个余数在前面出现过,现在加上 nums[i - 1] 后,还是等于这个余数,说明这个数可以被 k 整数if (hash.count(tp)) ret += hash[tp];hash[tp]++;}return ret;}};

7. 连续数组

题目链接 -> Leetcode -525.连续数组

Leetcode -525.连续数组

题目:给定一个二进制数组 nums, 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

示例 1:
输入: nums = [0, 1]
输出 : 2
说明 : [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2 :
输入 : nums = [0, 1, 0]
输出 : 2
说明 : [0, 1] (或[1, 0]) 是具有相同数量0和1的最长连续子数组。

提示:

  • 1 <= nums.length <= 10^5
  • nums[i] 不是 0 就是 1

思路:设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和。如果将 0 记为 -1 , 1 记为 1 ,问题就变成了找出一段区间,这段区间的和等于 0.

  • 想知道最大的「以 i 为结尾的和为 0 的⼦数组」,就要找到从左往右第⼀个 x1 使得 [x1, i] 区间内的所有元素的和为 0 。

  • 那么 [0, x1 - 1] 区间内的和就是 sum[i] 了。于是问题就变成:
    找到在 [0, i - 1] 区间内,第⼀次出现 sum[i] 的位置即可;

  • 我们可以用一个哈希表,⼀边求当前位置的前缀和,一边记录第一次出现该前缀和的位置。

代码如下:

		class Solution {public:int findMaxLength(vector<int>& nums) {int n = nums.size();unordered_map<int, int> hash;// 默认有一个前缀和为 0 的情况hash[0] = -1; int retlen = 0, sum = 0;for(int i = 0; i < n; i++){// 计算当前位置的前缀和sum += nums[i] == 0? -1 : 1;if(hash.count(sum)) retlen = max(i - hash[sum], retlen);// 存下标else hash[sum] = i;}return retlen;}};

8. 矩阵区域和

题目链接 -> Leetcode -1314.矩阵区域和

Leetcode -1314.矩阵区域和

题目:给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:

i - k <= r <= i + k,
j - k <= c <= j + k 且
(r, c) 在矩阵内。

示例 1:
输入:mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]], k = 1
输出: [[12, 21, 16], [27, 45, 33], [24, 39, 28]]

示例 2:
输入:mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]], k = 2
输出: [[45, 45, 45], [45, 45, 45], [45, 45, 45]]

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n, k <= 100
  • 1 <= mat[i][j] <= 100

思路:二维前缀和的简单应用题,画图写出公式即可;

代码如下:

		class Solution {public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));vector<vector<int>> ret(m, vector<int>(n));for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];}}return ret;       }};

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

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

相关文章

nodejs微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

matlab实践(九):分段线性插值与三次样条插值

题目 用matlab对572所在区间分别进行分段线性插值、三次样条插值&#xff0c;计算出151&#xff0c;159&#xff0c;984&#xff0c;995的对数值&#xff0c;画出图形并在图形上用红色圆圈标记151&#xff0c;159&#xff0c;984&#xff0c;995所在的点,同时在图形中显示这些…

Java Socket编程之基于TCP协议通信

1.说明 Socket&#xff08;套接字&#xff09;是计算机网络编程中用于实现网络通信的一种编程接口或抽象概念。 它提供了一种标准的接口&#xff0c;使应用程序能够通过网络与其他计算机进行通信。 Socket可以看作是应用程序与网络之间的一个通信端点&#xff0c;类似于电话中…

如何在 Chrome 上调试文件打断点

1. 控制台进入 Source 2. CtrlP 输入文件名称 3. 在需要的位置手动打断点 4. 重新触发代码运行&#xff0c;触发断点

分享 | 顶刊高质量论文插图配色(含RGB值及16进制HEX码)(第一期)

我在很早之前出过一期高质量论文绘图配色&#xff0c;但当时觉得搜集太麻烦于是就没继续做&#xff0c;后来用MATLAB爬了上万张顶刊绘图&#xff0c;于是又想起来做这么一个系列&#xff0c;拿了一个多小时写了个提取论文图片颜色并得出RGB值和16进制码并标注在原图的代码&…

简单了解传输层协议之TCP和UDP

目录 一、什么是端口号? 二、TCP协议 2.1 TCP报文格式 2.2 三次握手 2.3 四次挥手 2.4 窗口流量控制 三、UDP协议 3.1 UDP报文格式 3.4 传输过程 一、什么是端口号? 我们自己的一台电脑上有时可能会同时运行多个进程软件来进行上网。那么当网络上的服务器响应我们电…

Chrome清除特定网站的Cookie,从而让网址能正常运行(例如GPT)

Chrome在使用某些网址的时候&#xff0c;例如GPT的时候&#xff0c;可能会出现无法访问这个网址的情况&#xff0c;就是点不动啥的 只需要把你需要重置的网址删除就好了

C语言小游戏:三子棋

目录 &#x1f30d;前言 &#x1f685;目录设计 &#x1f48e;游戏逻辑设置 ⚔三子棋棋盘设计 ⚔三子棋运行逻辑 &#x1f440;怎么设置人下棋 &#x1f440;怎么设置电脑下棋 ✈如何判断输赢 ✍结语 &#x1f30d;前言 Hello,csdn的各位小伙伴你们好啊!这次小赵给大…

根据源码梳理Redisson的可重入、锁重试以及看门狗机制原理

Redisson可重入的原理 在上篇文章中我们已经知道了除了需要存储线程标识外&#xff0c;会额外存储一个锁重入次数。那么接下来我们查看使用Redisson时&#xff0c;Redisson的加锁与释放锁流程图。 当开始获取锁时&#xff0c;会先判断锁是否存在&#xff0c;如果存在再进行判断…

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 . 滑动窗口最大值 描述 : 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 题目 : …

EM32DX-C4【C#】

1外观&#xff1a; J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI&#xff1a; 公共端是…

XUbuntu22.04之OBS30.0设置录制音频降噪(一百九十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

LLM之Agent(三):HuggingGPT根据用户需求自动调用Huggingface合适的模型

​ 浙大和微软亚洲研究院开源的HuggingGPT&#xff0c;又名JARVIS&#xff0c;它可以根据用户的自然语言描述的需求就可以自动分析需要哪些AI模型&#xff0c;然后去Huggingface上直接调用对应的模型&#xff0c;最终给出用户的解决方案。 一、HuggingGPT的工作流程 它的…

Linux驱动开发学习笔记3《新字符设备驱动实验》

目录 一、新字符设备驱动原理 1.分配和释放设备号 2.新的字符设备注册方法 &#xff08;1&#xff09; 字符设备结构 &#xff08;2&#xff09;cdev_init函数 &#xff08;3&#xff09; cdev_add函数 &#xff08;4&#xff09;cdev_del 函数 二、自动创建设备节点 …

网络安全(二)-- Linux 基本安全防护技术

4.1. 概述 安全防护基础主要是会用Linux系统&#xff0c; 熟悉Linux基本操作命令。 在这个章节中&#xff0c;我们主要探讨自主访问控制&#xff08;许可位、ACL&#xff09;、文件属性、 PAM技术、能力机制等。 4.1.1. 补充命令 本章节中&#xff0c;涉及一些新的命令&#…

【C++】STL简介(了解)【STL的概念,STL的历史缘由,STL六大组件、STL的重要性、以及如何学习STL、STL的缺陷的讲解】

这里写自定义目录标题 一、什么是STL二、STL的版本1. 原始版本2. P. J. 版本3. RW版本★ 4. SGI版本 三、STL的六大组件四、STL的重要性五、如何学习STL六、STL的缺陷 一、什么是STL STL ( standard template libaray - 标准模板库 )&#xff1a;是C标准库 的重要组成部分&…

红队攻防之隐匿真实IP

0x01 前言 安全态势日益严峻&#xff0c;各大组织普遍采用了综合的安全产品&#xff0c;如态势感知系统、WAF和硬件防火墙等&#xff0c;这些措施加大了渗透测试和攻防演练的难度。即使是一些基本的漏洞验证、端口扫描&#xff0c;也可能导致测试IP被限制&#xff0c;从而阻碍…

DFT新手教程:VASP中ISIF取值设置

新手初学VASP计算时首先接触到的就是结构优化的计算任务。 在结构优化中&#xff0c;INCAR中的关键参数包括 IBRION &#xff0c;NSW&#xff0c;ISIF&#xff0c;EDIFF和EDIFFG 各个参数均可在vaspwiki查到可设置的参数以及该参数所具有的设置的含义。 https://www.vasp.at/…

佛罗里达大学利用神经网络,解密 GPCR-G 蛋白偶联选择性

内容一览&#xff1a;G 蛋白偶联受体 (GPCRs) 是一种将细胞膜外的刺激&#xff0c;传递到细胞膜内的跨膜蛋白&#xff0c;广泛参与到人体生理活动当中。近日&#xff0c;佛罗里达大学的研究者测定了 GPCRs 和 G 蛋白的结合选择性&#xff0c;并开发了预测二者选择性的算法&…

JVM简单了解内存溢出

JVM oracle官网文档&#xff1a;https://docs.oracle.com/en/java/javase/index.html 什么是JVM JVM(Java Virtual Machine)原名Java虚拟机&#xff0c;是一个可以执行Java字节码的虚拟计算机。它的作用是在不同平台上实现Java程序的跨平台运行&#xff0c;即使在不同的硬件…