DFS/BFS简介以及剪枝技巧
DFS简介
DFS含义 ⭐
DFS,即Depth-first-search,是深度优先搜索的简称。
它的主要思路是一直沿当前分支搜索,当搜索到尽头之后返回,再逐步向其他地方扩散。
我们可以通过一个树形结构说明DFS的遍历顺序
A/ | \B C D/ \ |E F G/ \H I
遍历顺序:(假设一直沿左分支走)
A→B→E→H→I→F→C→D→G
当然,完全可以沿右分支先走,甚至遍历起点并不非得是树的顶端。
事实上,DFS的实现依赖于递归,而遍历的顺序也和递归的位置息息相关。
甚至通过调整递归的顺序,我们可以用三种方法遍历一个二叉树,不过这并不是本次重点,不过多叙述
接下来让我们通过一个简单的例题来看看DFS的实现。
全球变暖
P8662 [蓝桥杯 2018 省 AB] 全球变暖
题目描述
你有一张某海域 N × N N \times N N×N 像素的照片,.
表示海洋、 #
表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中 “上下左右” 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 2 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数 N N N。 ( 1 ≤ N ≤ 1000 ) (1 \le N \le 1000) (1≤N≤1000)。
以下 N N N 行 N N N 列代表一张海域照片。
照片保证第 1 1 1 行、第 1 1 1 列、第 N N N 行、第 N N N 列的像素都是海洋。
输出格式
一个整数表示答案。
输入输出样例 #1
输入 #1
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出 #1
1
说明/提示
时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛
题解
这是一个连通性问题,要把图内所有联通的点都遍历一次,可以使用DFS去遍历。
DFS遍历的格式大概是
void dfs(){if(已遍历完){记录return;}for(...){//枚举情况if(遍历过)continue;记录此点dfs();回溯}
}
观察可知,此题需要我们不断向四周扩散记录联通区域。
解题思路大概是:
先对输入数据预处理,令我们可以通过二维数组中的值得知这块陆地周围有几个岛屿。
然后每次检查,都把一整片岛屿标记为已检查,在这个过程中寻找有没有周围有四块陆地的点。如果有,说明这个岛屿不会被淹没。
而这个检查的过程就可以通过DFS递归来实现:
每次检查完一块陆地都检查这块陆地周围的陆地有没有 4 4 4
最后达到同时遍历一整块岛屿的效果。
其中,关键在于DFS递归时的退出条件以及正确清空已经遍历过的岛屿,避免死循环。
代码
#include<iostream>
using namespace std;
int map[1002][1002]={0};
void doo(int i,int j){if(map[i][j-1])map[i][j]++;if(map[i][j+1])map[i][j]++;if(map[i+1][j])map[i][j]++;if(map[i-1][j])map[i][j]++;
}
void check(int i,int j,bool&flag){if(map[i][j]==0)return;if(map[i][j]==5)flag=1;map[i][j]=0;check(i+1,j,flag);check(i-1,j,flag);check(i,j+1,flag);check(i,j-1,flag);return;
}
int main(){int n;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++){char temp;cin>>temp;if(temp=='#')map[i][j]=1;elsemap[i][j]=0;}for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(map[i][j]==0)continue;doo(i,j);}int ans=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(map[i][j]==0)continue;bool flag=0;check(i,j,flag);if(flag==0)ans++;}cout<<ans;return 0;
}
DFS练习题目:建议看完剪枝技巧再做其中难度较高的题
P1219八皇后
P1019单词接龙
P5194 Scales S
BFS简介 ⭐⭐
BFS含义
BFS指广度优先搜索。与DFS的区别在于,bfs的遍历顺序并不是优先搜索到分支的尽头,而是先遍历完当前层的全部节点,再扩散到下一层。
这样的好处在于,并不需要遍历完一整个分支,而是尽可能判断多个分支,在解决最短路径问题时十分优越,因为在找到最短路径后就可以退出。
让我们通过一个简单的树形结构观察一下BFS的遍历顺序
A/ | \B C D/ \ |E F G/ \H I
遍历顺序:A→B→C→D→E→F→G→H→I
显然 BFS在遍历到 C C C 的时候就会发现,这是目前最短的路径,因此BFS在完成最短路径,最少步数问题时更为便捷。
我们还是通过同一个例题来看看BFS如何实现,以便感受DFS和BFS的相同与不同
全球变暖
题干请看上一节,不再赘述。
题解
DFS的实现依赖于递归,也就是栈,先进后出。
相应的,BFD的实现依赖于队列,先进先出。
对于每个节点,BFS会先把当前节点出队,然后把该节点的全部子节点入队,如此反复直到队列为空。
这样可以保证队列中永远只有两层节点,因为父层节点遍历完之后子层节点才会开始弹出并放入新的子节点。
对于全球变暖这道题来说,BFS就是不断把陆地弹出,然后把这个陆地联通的的全部陆地入队。在这个过程中不断标记那些节点已经访问过,就实现了BFS遍历联通的全部陆地。
在BFS的实现中,因为父节点与子节点紧密练习,所以只需要观察当前陆地联通的四块是不是都是陆地就可以判断有没有被淹没。
注意标记是否访问过数组上的点。
#include <bits/stdc++.h>
using namespace std;
int my_map[1002][1002]={0},vis[1001][1001];
int arounds[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
bool flag;
void bfs(int x,int y){//一次BFS,把全部相关元素入队,标记,检测queue<pair<int,int>> q;vis[x][y]=1;q.push({x,y});while(!q.empty()){pair<int,int> tempPair=q.front();q.pop();int tempX=tempPair.first,tempY=tempPair.second;int count=0;for(int i=0;i<4;i++){int tx=tempX+arounds[i][0],ty=tempY+arounds[i][1];if(my_map[tx][ty]==1){count++;if(vis[tx][ty]==0){vis[tx][ty]=1;q.push({tx,ty});}}}if(count==4)flag=1;}return;
}int main(){int n;cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++){char temp;cin>>temp;if(temp=='#')my_map[i][j]=1;}int ans=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){ if(vis[i][j]==0&&my_map[i][j]){flag=0;bfs(i,j);if(flag==0)ans++;} }}cout<<ans;return 0;
}
剪枝技巧 ⭐⭐⭐⭐
⭐表示难度:
可行性剪枝 ⭐
Count that cows
FJ 丢失了他的一头牛,他决定追回他的牛。已知 FJ 和牛在一条直线上,初始位置分别为 x x x 和 y y y,假定牛在原地不动。FJ 的行走方式很特别:他每一次可以前进一步、后退一步或者直接走到 2 × x 2\times x 2×x 的位置。计算他至少需要几步追上他的牛。
第一行为一个整数 t ( 1 ≤ t ≤ 10 ) t\ ( 1\le t\le 10) t (1≤t≤10),表示数据组数;
接下来每行包含一个两个正整数 x , y ( 0 < x , y ≤ 1 0 5 ) x,y\ (0<x,y \le 10^5) x,y (0<x,y≤105),分别表示 FJ 和牛的坐标。
对于每组数据,输出最少步数。
输入:
1
5 17
输出:
4
题解:
可行性剪枝是最为简单、直观的一种剪枝技巧。
即使没有特意学过剪枝,只接触过基本的DFS与BFS概念的同学也可能独立想出。
其本质是:确定当前情况已经不合法,就不需要再做剩下的“无谓”运算去寻找答案,而是直接把这一分支砍掉。
在本题中,显然当位置小于牛时,可以选择进一步,退一步和乘二,它们分别代表三种可能性。
但当位置大于牛时,无论是进一步还是乘二,都不可能接近答案,因此这是“不可行”的分支,需要砍去。
本题也利用了哈希表去判重剪枝,具体可参考下面的BFS去重剪枝
代码:
#include <iostream>
#include<queue>
#include<unordered_set>
using namespace std;unordered_set<int> my_set;int bfs(int x,int y){if(x==y)return 0;queue<pair<int,int>> q;q.push({x,0});my_set.insert(x);while(q.size()){pair<int,int> a=q.front();q.pop();int num=a.first,steps=a.second;if(num==y){return steps; }else if(num>y){//可行性剪枝if(!my_set.count(num-1)){q.push({num-1,steps+1});my_set.insert(num-1);}}else{if(!my_set.count(num-1)){q.push({num-1,steps+1});my_set.insert(num-1);}if(!my_set.count(num+1)){q.push({num+1,steps+1});my_set.insert(num+1);}if(!my_set.count(num*2)){q.push({num*2,steps+1});my_set.insert(num*2);}}}return -1;
}
int main()
{ int t;cin>>t;for(int i=0;i<t;i++){int x,y;cin>>x>>y;my_set.clear();cout<<bfs(x,y)<<endl;}return 0;
}
最优性剪枝 ⭐⭐⭐
P1118 [USACO06FEB] Backward Digit Sums G/S
题目描述
游戏描述
有这么一个游戏:
写出一个 1 ∼ n 1 \sim n 1∼n 的排列 a a a,然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作。
显然每次构成的序列都比上一次的序列长度少 1 1 1,直到只剩下一个数字位置。
3 1 2 44 3 67 916
任务要求
现在要倒着玩这个游戏。如果知道 n n n 和最终得到的数字的大小 sum,请你求出最初的序列 a a a。
注意:如果有多种答案,要求输出字典序最小的那一个。
字典序
我们称序列 a = ⟨ a 1 , a 2 , … , a n ⟩ a = \langle a_1, a_2, \dots, a_n \rangle a=⟨a1,a2,…,an⟩ 的字典序小于序列 b = ⟨ b 1 , b 2 , … , b n ⟩ b = \langle b_1, b_2, \dots, b_n \rangle b=⟨b1,b2,…,bn⟩ 的字典序,当且仅当存在一个位置 p p p,满足:
a 1 = b 1 , a 2 = b 2 , … , a p − 1 = b p − 1 a_1 = b_1, a_2 = b_2, \dots, a_{p-1} = b_{p-1} a1=b1,a2=b2,…,ap−1=bp−1,
且 a p < b p a_p < b_p ap<bp。
输入:共一行两个正整数 n , s u m n,sum n,sum。
输出:输出包括一行,为字典序最小的那个答案。
当无解的时候,请什么也不输出。
输入 #1
4 16
输出 #1
3 1 2 4
说明/提示
- 对于 40 % 40\% 40% 的数据, 1 ≤ n ≤ 7 1\le n\le 7 1≤n≤7;
- 对于 80 % 80\% 80% 的数据, 1 ≤ n ≤ 10 1\le n \le 10 1≤n≤10;
- 对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 12 1\le n \le 12 1≤n≤12, 1 ≤ s u m ≤ 12345 1\le sum\le 12345 1≤sum≤12345。
题解:
本题主要运用的剪枝技巧是对杨辉三角预处理,以及最优性剪枝。
对杨辉三角的预处理是在于,如果需要调用组合数的话,可以先把杨辉三角存入全局数组方便调用,不多赘述。
最优性剪枝指 如果当前答案的最大可能值都无法超过目前的最优答案,那么就可以直接舍弃当前分支。
这是一种求解最优问题的剪枝思路。
回到本题,本题思路大概是:通过dfs对1到n的数字全排列,当其杨辉三角和为sum时即找到正确答案。
dfs从小到大遍历可保证第一个答案是字典序最小的答案。
最优化剪枝的应用在于对目前截取出来的数字串进行处理,计算其可能的值,若目前列出的值已经超过sum,则应当剪去该分支。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,sum,flag;
int numbers[13]={0,1,2,3,4,5,6,7,8,9,10,11,12};
vector<int> temp;
vector<int> yhsj[13] = {{0}, // 第 0 行(可忽略){1}, // 第 1 行{1, 1}, // 第 2 行{1, 2, 1}, // 第 3 行{1, 3, 3, 1},{1, 4, 6, 4, 1},{1, 5, 10, 10, 5, 1},{1, 6, 15, 20, 15, 6, 1},{1, 7, 21, 35, 35, 21, 7, 1},{1, 8, 28, 56, 70, 56, 28, 8, 1},{1, 9, 36, 84, 126, 126, 84, 36, 9, 1},{1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1},{1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1}
};
void dfs(int count,int nowSum){//准备取第count个for(int i=1;i<=n;i++){if(flag)return;if(numbers[i]==0)continue;temp.push_back(i);numbers[i]=0;nowSum=nowSum+yhsj[n][count-1]*i;if(nowSum>sum){numbers[i]=i;temp.pop_back();return;}else if(nowSum==sum&&count==n){flag=1;for(auto& a:temp)cout<<a<<" ";return;}dfs(count+1,nowSum);nowSum-=yhsj[n][count-1]*i;numbers[i]=i;temp.pop_back();}return;
}int main(){cin>>n>>sum;dfs(1,0);return 0;
}
BFS判重剪枝 ⭐⭐
0跳蚂蚱 蓝桥杯2017
此题是一个简单的八数码问题:
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下图所示:
有 9 只盘子,排成 1 个圆圈。其中 8 只盘子内装着 8 只蚱蜢,有一个是空盘。
我们把这些蚱蜢顺时针编号为 1 ~ 8。
规则
每只蚱蜢都可以:
跳到相邻的空盘中。
也可以用力一点,越过一个相邻的蚱蜢 跳到空盘中。
目标
请计算至少要经过多少次跳跃,才能使蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变。
题解
我们可以将问题视作是空盘与相邻盘的置换,每次有四种置换的可能。
不断置换,得到答案后返回。
求解最短次数,显然用BFS解决。
但是,假如空盘与右边盘子互换后,又与左侧盘子互换。左换右,右换左,无穷无尽,陷入死循环。
因此我们需要判断一种可能性有没有出现过,如果它出现过,那么它延伸出的所有分支都会位于队列中,不需要重复计算。
可以使用哈希表解决这个问题。
另外,计算BFS复杂问题的步数时,可以采用pair或结构体记载层数。
代码:
#include <iostream>
#include<queue>
#include<unordered_set>
using namespace std;
struct node{string s;int step;int index_0;node(string s="",int step=0,int index_0=0):s(s),step(step),index_0(index_0){};
};
int main()
{ node a;unordered_set<string> mm;a.s="012345678";a.step=0;a.index_0=0;queue<node> q;//把结构体入队int op[]={-2,-1,1,2};q.push(a);node ans;mm.insert(a.s);while(q.size()){node now=q.front();q.pop();int Now_0=now.index_0;string nowS=now.s;for(int i=0;i<4;i++){int nI=(Now_0+op[i]+9)%9;//得到新位置string temp=nowS;temp[Now_0]=temp[nI];temp[nI]='0';if(mm.find(temp)!=mm.end())//如果已经有了continue;mm.insert(temp);node b(temp,now.step+1,nI);if(temp=="087654321")ans=b;if(ans.step)break;q.push(b);}if(ans.step)break;}cout<<ans.step;return 0;
}
搜索顺序剪枝 ⭐⭐⭐⭐
P1120小木棍:较难
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 50 50 50。
现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。
给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入格式
第一行是一个整数 n n n,表示小木棍的个数。
第二行有 n n n 个整数,表示各个木棍的长度 a i a_i ai。
输出格式
输出一行一个整数表示答案。
输入 #1
9
5 2 1 5 2 1 5 2 1
输出 #1
6
对于全部测试点, 1 ≤ n ≤ 65 1 \leq n \leq 65 1≤n≤65, 1 ≤ a i ≤ 50 1 \leq a_i \leq 50 1≤ai≤50。
题解
阅读题干,想到尝试暴力深搜,只需要把每个可能的长度枚举出来,对每个长度进行DFS,看看能否拼接成全部是这个长度的长木棍即可。
如果全部都成功拼接,则输出答案,如果不行,则继续搜索。
此题关键在于暴力搜索的时间复杂度过高,需要极强的剪枝技巧。
搜索顺序剪枝是指,按一定的顺序去搜索,可以有效避免产生大量的无效分支。
对于本题而言,无论木棍长短,都总是要拼接进去的,那么如果先尝试长的小木棍,就可以快速把长度积累到目标值附近,或者直接判断出不可能拼接出目标值(若目标值太小)。
而把小木棍放前面则会产生大量冗杂的可能性。
因此,可以先对数组进行降序处理,再继续DFS搜索。
此外。本题还有很多独属于此题的剪枝技巧,因为没有太多的可重复性,所以在此仅简单提及,有兴趣的同学可以观看洛谷题解:
1、排序之后可以通过预处理出next数组,假如一个长度的小木棍不符合,就快速跳到下一个长度的木棍区间,而不是一个一个检索。
2、若本次恰好可以组成一个长木棍,但是后面的拼接失败了,那么不需要在本次DFS的基础之上再搜索,而是直接return。
因为把恰好能组成木棍的放入必然是最优解,如果这样都不行,那无论怎么调整都是不行的。
3、先把可能的答案预处理一下,因为答案只可能是总和的因数。
从小到大检查答案,检查到的第一个一定是最小的,直接输出即可。
#include<bits/stdc++.h>
using namespace std;int nums[100],vis[100],len,sum,currentLen,nes[100];
bool Answer_right=0;
inline vector<int> maybeAnswer();
void dfs(const int& d,int nowOper,const int& total,int startCount){if(currentLen==d){//进入下一组循环if(total==nowOper){Answer_right=1;return;}currentLen=0;dfs(d,nowOper+1,total,0);}else{//还是小于//在DFS的进程中已经有了一个CurrentLen,现在想获取下一个加进当前len的值for(int i=startCount;i<len;i++){if(vis[i]) continue;if(currentLen+nums[i]>d){//如果大,下一个i=nes[i]-1;continue;}vis[i]=1;currentLen+=nums[i];int newStart=i;while(newStart>=0&&nums[newStart]==nums[i])newStart--;dfs(d,nowOper,total,newStart);if(Answer_right)return;currentLen-=nums[i];vis[i]=0;if(currentLen+nums[i]==d)return;i=nes[i]-1;if(i==len-1)return;}}return;
}
int main(){cin>>len;for(int i=0;i<len;i++){cin>>nums[i];sum+=nums[i];}sort(nums,nums+len,greater<int>());for(int slow=0;slow<len;slow++){int fast=slow+1;while(fast<len&&nes[fast]==nums[slow])fast++;nes[slow]=fast;}vector<int> d_s=maybeAnswer();for(auto& d:d_s){dfs(d,1,sum/d,0);currentLen=0;if(Answer_right){cout<<d;break;}}return 0;
}inline vector<int> maybeAnswer(){vector<int> res;for(int i=1;i*i<=sum;i++){if(sum%i==0){res.push_back(i);if(sum/i!=i)res.push_back(sum/i);}}sort(res.begin(),res.end());return res;
}
相关文章:
DFS/BFS简介以及剪枝技巧
DFS简介 DFS含义 ⭐ DFS,即Depth-first-search,是深度优先搜索的简称。 它的主要思路是一直沿当前分支搜索,当搜索到尽头之后返回,再逐步向其他地方扩散。 我们可以通过一个树形结构说明DFS的遍历顺序 A/ | \B C D/ \ |E…...
LeetCode[15]三数之和
思路: 一开始我想的用哈希表来做,但是怎么想怎么麻烦,最后看解析,发现人家用的双指针,那我来讲一下我这道题理解的双指针。 这道题使用双指针之前一定要给数组进行排序,ok为什么排序?因为我需要…...
高性能计算面经
高性能计算面经 C八股文真景一面凉经自我介绍,介绍一下你做过的加速的模块(叠噪,噪声跟原图有什么关系?)OpenGL和OpenCL有什么区别?**1. 核心用途****2. 编程模型****3. 硬件抽象****4. API设计****5. 典型应用场景****6. 互操作性…...
HTML 标签类型全面介绍
HTML 标签类型全面介绍 HTML(HyperText Markup Language)是构建 Web 页面结构的基础语言。HTML 由不同类型的标签组成,每种标签都有特定的用途。本文将全面介绍 HTML 标签的分类及其用法。 1. HTML 标签概述 HTML 标签通常成对出现…...
【漫话机器学习系列】168.最大最小值缩放(Min-Max Scaling)
在机器学习和数据预处理中,特征缩放(Feature Scaling) 是一个至关重要的步骤,它可以使模型更稳定,提高训练速度,并优化收敛效果。最大最小值缩放(Min-Max Scaling) 是其中最常见的方…...
Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异
以下是Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异: 一、接口方式实现切面排序 1. 定义接口 // 服务接口 public interface MyService {void methodA();void methodB(); }// 接口实现类…...
基于SpringBoot的高校学术交流平台
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
数据治理的专题库
数据治理专题库的全面解析 一、专题库的定义与定位 数据治理专题库是围绕特定业务领域或场景构建的专业化数据库,其核心在于业务导向性和自主性。与基础库(如人口、法人、地理信息等跨部门核心实体数据)和主题库(如市场监管中的…...
【MathType】MathType安装和嵌入word
MathType 是一款功能强大的数学公式编辑器,广泛应用于学术论文、教材编写、科研报告等领域。它支持多种数学符号、公式排版,并且与 Microsoft Word、Google Docs、WPS 等办公软件兼容,极大地方便了数学公式的输入和编辑 记录一下安装的过程 …...
mediacodec服务启动时加载media_codecs.xml
media.codec服务启动时, 会创建 implementation::Omx 和 implementation::OmxStore, 构造 Omx时, 会解析codec相关的xml文件,一般从会如下目录中, // from getDefaultSearchDirs() { "/product/etc",&quo…...
Scala(三)
本节课学习了函数式编程,了解到它与Java、C函数式编程的区别;学习了函数的基础,了解到它的基本语法、函数和方法的定义、函数高级。。。学习到函数至简原则,高阶函数,匿名函数等。 函数的定义 函数基本语法 例子&…...
kafka 报错消息太大解决方案 Broker: Message size too large
kafka-configs.sh --bootstrap-server localhost:9092 \ --alter --entity-type topics \ --entity-name sim_result_zy \ --add-config max.message.bytes10485880 学习营课程...
APScheduler定时
异步IO 定时(协程) import asyncio import logging from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTriggerlogging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__)class Schedul…...
[GESP202503 C++六级题解]:P11962:树上漫步
[GESP202503 C++六级题解]:P11962:树上漫步 题目描述 小 A 有一棵 n n n 个结点的树,这些结点依次以 1 , 2 , ⋯ , n 1,2,\cdots,n 1,2,⋯,n 标号。 小 A 想在这棵树上漫步。具体来说,小 A 会从树上的某个结点出发,每⼀步可以移动到与当前结点相邻的结点,并且小 A…...
JavaScript基础-常见网页特效案例
在现代Web开发中,JavaScript不仅是处理业务逻辑的核心工具,也是实现丰富交互体验的关键。通过JavaScript,我们可以轻松地为网页添加各种动态效果和交互特性,从而提升用户体验。本文将介绍几种常见的网页特效案例,并提供…...
数据结构4
day4 5.队列 Queue 5.1 特性 队列是只允许再两端进行插入和删除操作的线性表,在队尾插入,在队头删除,插入的一段被称为“队尾”,删除的一端被称为“队头”。队列包括循环队列(顺序队列)、链式队列。结构:先进先出&…...
Rust 为什么不适合开发 GUI
前言 在当今科技蓬勃发展的时代,Rust 编程语言正崭露头角,逐步为世界上诸多重要基础设施提供动力支持。从存储海量信息到应用于 Linux 内核,Rust 展现出强大的实力。然而,当涉及构建 GUI(图形用户界面)时&…...
DisplayPort版本对比
目前视频接口标准基本上被HDMI和DisplayPort两大标准给瓜分天下了。 (1) HDMI由消费电子厂商主导,最新版本(如HDMI 2.1)理论带宽为48Gbps,主要应用于电视、游戏主机及家庭影音设备。 (2…...
YOLOv12即插即用-Pconv(风车卷积)
1.模块介绍 PinwheelConv(风车状卷积)充分利用了IRST(红外搜索与跟踪)中的高斯分布特性,以极少的参数实现了高效且更大感受野的特性。此外,本文还提出了一种简单而高效的 SD 损失函数,有效缓解了标签 IoU 变化带来的不稳定性。通过与现有卷积模块和损失函数的广泛对比,…...
AI知识补全(十四):零样本学习与少样本学习是什么?
名人说:一笑出门去,千里落花风。——辛弃疾《水调歌头我饮不须劝》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(十三):注意力…...
Pycharm(十一):字符串练习题
1.输入一个字符串,打印所有偶数位上的字符(下标是0,2,4,6...位上的字符) # 练习题1:输入一个字符串,打印所有偶数位上的字符(下标是0,2,4,6...位上的字符) # 1.键盘录入字符串&…...
设计原则之迪米特法则
一、定义 迪米特法则又称为最少知识原则(Law of Demeter,LoD),是一项用于面向对象设计的基本原则之一。该原则强调一个对象应该对其他对象有最少的了解,即一个类不应该知道太多关于其他类的内部细节。 二、好处 迪米…...
Debian系统_主板四个网口1个配置为WAN,3个配置为LAN
Debian系统_主板四个网口1个配置为WAN,3个配置为LAN 一、重新配置网口 1、查看当前网口的状态 ifconfig 或者 ip link show 或者 ls /sys/class/net 2、修改网络配置文件 sudo vi /etc/network/interfaces 注意WAN口的网关地址如果是192.168.3.1的话,L…...
Spring Boot 快速入手
前言:为什么选择 Spring Boot? 🚀 在现代 Java 开发中,Spring Boot 已成为最流行的后端框架之一。无论是小型 Web 应用、企业级系统,还是微服务架构,Spring Boot 都能提供快速开发、自动配置、轻量级部署的…...
Ubuntu Live USB 如何使用
以下是使用 Ubuntu Live USB 的详细指南,涵盖启动、试用系统、安装系统及常用工具操作: 1. 制作 Ubuntu Live USB • 所需工具: • Ubuntu ISO 镜像(从 官网 下载)。 • U盘(至少 4GB,数据将被…...
基于单片机的音乐播放器系统设计
基于单片机的音乐播放器系统设计是一个综合性较强的电子系统开发项目 系统概述 基于单片机的音乐播放器旨在利用单片机的控制功能,结合音频处理电路、存储单元等,实现音乐的播放、暂停、切换、音量调节等功能,可应用于小型便携式音频设备、电子玩具、智能家居背景音乐系统等…...
HttpClient-01.介绍
一.介绍 通过HttpClient,我们可以在Java程序中构造并发送Http请求。要使用HttpClient,就要导入依赖坐标。 核心API: HttpClient:Http客户端,使用它可以发送http请求。 HttpClients:构建器,使…...
2025年win10使用dockerdesktop安装k8s
一、写作背景 百度了一圈, 要么教程老,很多操作步骤冗余, 要么跑不通,或者提供的链接失效等情况。 二、看前须知 1、安装过程使用的AI辅助, 因为参考的部分博客卡柱了。 2、如果操作过程中遇到卡顿, …...
技术回顾day2
1.获取文件列表 流程:前端根据查询条件封装查询信息,后端接收后进行封装,封装为FileInfoQuery,根据fileInfoQuery使用mybatis的动态sql来进行查询。 2.文件分片上传 每次上传需要上传包括(文件名字,文件,md5值&#…...
软件工程-UML
例图,类图,状态图,顺序图,活动图 目录 例图 类图 状态图 顺序图 活动图 例图 例图由四个元素组成,参与者、用例、系统边界、参与者和用例之间的关系 参与者用一个小人表示,用例用椭圆表示ÿ…...
赛逸展2025“创新引擎”启动:限量席位,点亮科技绿色新征程
当今时代,科技革新与绿色发展已然成为推动社会进步的双引擎。2025第七届亚洲消费电子技术贸易展(赛逸展)敏锐捕捉这一趋势,重磅打造“科技创新专区”,并面向科技、绿色企业吹响限量招募号角。 这个独具特色的专区紧扣…...
前后台系统
前后台系统(Foreground/Background System)是一种常见的嵌入式系统编程模型,尤其是在那些不需要复杂操作系统的简单系统中。这种系统架构通常用于实时性要求不是极端苛刻的环境,但在响应外部事件时仍需要一定的及时性。下面我将详…...
VHT AMPDU
A - MPDU 由一个或多个 A - MPDU 子帧以及可变数量的 EOF填充子帧组成。 在 VHT中,存在如下填充: 一个 A - MPDU 子帧的填充子字段中有 0 - 3 个字节。 EOF 填充字段中有零个或多个 EOF 填充子帧。 EOF 填充子帧中EOF填充字节中有 0 - 3 个字节。 A - MPDU 帧结束前填充(A -…...
Spring框架如何做EhCache缓存?
在Spring框架中,缓存是一种常见的优化手段,用于减少对数据库或其他资源的访问次数,从而提高应用性能。Spring提供了强大的缓存抽象,支持多种缓存实现(如EhCache、Redis、Caffeine等),并可以通过…...
助力 Windows 文件管理:重命名与清理重复文件软件精选
软件介绍 在日常的电脑使用中,高效管理文件至关重要。接下来为大家介绍几款实用软件,能助您轻松搞定文件管理难题。 AdvancedRenamer:全能批量重命名利器 专为 Windows 系统打造的 AdvancedRenamer,功能堪称强大。无论是文本替…...
重建二叉树(C++)
目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 初始化 4.2 递归部分 4.3 主逻辑 5 总结 1 问题描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序…...
Go+Gin实现安全多文件上传:带MD5校验的完整解决方案
后端 package mainimport ("encoding/json""fmt""log""net/http""os""path/filepath""github.com/gin-contrib/cors""github.com/gin-gonic/gin" )// 前端传来的文件元数据 type FileMetaRe…...
SwanLab Slack通知插件:让AI训练状态同步更及时
在AI模型训练的过程中,开发者常常面临一个难题:如何及时跟踪训练状态?无论是实验超参数的调整、关键指标的变化,还是意外中断的告警,传统的监控方式往往依赖手动刷新日志或反复检查终端,这不仅效率低下&…...
JavaScript元素尺寸与位置
目录 client 家族与 offset 家族 一、client 家族:内容区域 内边距 示例代码 应用场景 二、offset 家族:内容区域 内边距 边框 滚动条 示例代码 应用场景 三、综合应用场景 1. 动态调整元素高度 2. 拖拽元素 3. 判断元素是否在视口内 四…...
IS-IS:单区域集成配置与多区域集成配置
一、IS-IS概述 IS-IS(Intermediate System to Intermediate System) 是一种链路状态内部网关协议(IGP),设计用于自治系统(AS)内部的路由选择。最初由ISO为OSI模型的无连接网络服务(…...
Cesium学习(未完继续)
添加底图 viewer.imageryLayers.addImageryProvider(imageryProvider)常见 ImageryProvider 实现类 ArcGisMapServerImageryProvider:用于从 ArcGIS Server 获取影像数据。 BingMapsImageryProvider:用于从 Bing Maps 获取影像数据。 OpenStreetMapIm…...
【学Rust写CAD】22 双圆径向渐变的结构体(two_circle_radial_gradient.rs)
源码 //two_circle_radial_gradient.rs //! 定义双圆径向渐变的结构体和相关功能/// 表示一个双圆径向渐变的源 /// /// 该结构体描述了两个圆之间的渐变,支持矩阵变换和颜色查找表优化 #[derive(Debug, Clone, PartialEq)] pub struct TwoCircleRadialGradientSou…...
基于SpringAOP面向切面编程的一些实践(日志记录、权限控制、统一异常处理)
前言 Spring框架中的AOP(面向切面编程) 通过上面的文章我们了解到了AOP面向切面编程的思想,接下来通过一些实践,去更加深入的了解我们所学到的知识。 简单回顾一下AOP的常见应用场景 日志记录:记录方法入参、返回值、执…...
acwing 5438. 密接牛追踪2
农夫约翰有 NN 头奶牛排成一排,从左到右依次编号为 1∼N。 不幸的是,有一种传染病正在蔓延。 最开始时,只有一部分奶牛受到感染。 每经过一个晚上,受感染的牛就会将病毒传染给它左右两侧的牛(如果有的话)…...
【Linux】线程池
目录 线程池 日志 线程池 在程序中,会预先创建一批线程,在内部会有一个叫任务队列task_queue的东西,未来如果有任务要处理,就把任务push到任务队列里,然后自动有线程去任务队列里拿任务并处理,如果没有任…...
【11408】考研英语长难句解析策略:三步断开与简化法,快速提升阅读得分
2025.04.01 英语断开长难句分析主谓心得 简化长难句心得 英语 断开长难句 在一些长难句中,有时从句的连词会被省略,且没有标点将其隔开,此时就无法通过标点和连接词来断开长难句。那么我们只能够通过分析主谓来断开长难句。 分析主谓 谓语…...
Spring Cloud 2023.x安全升级:OAuth2.1与JWT动态轮换实战
引言:当安全遇上云原生,零停机密钥轮换成为刚需 在微服务架构中,OAuth2.1与JWT已成为身份验证的黄金标准,但传统方案存在两大痛点: 密钥轮换风险:手动替换JWT密钥需重启服务,导致短暂鉴权中断&…...
Vue3.5 企业级管理系统实战(十二):组件尺寸及多语言实现
1 组件尺寸切换 1.1 用 Pinia 进行 Size 的持久化存储 首先,在 src/plugins/element.ts 中增加 size 类型,代码如下: //src/plugins/element.ts import type { App } from "vue";import { ElMessage, ElNotification, ElMessageBo…...
15:00开始面试,15:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
Java学习路线 - 第三阶段笔记
Java学习路线 - 第三阶段笔记 Java高级特性(2-3个月) 1. 集合框架深入 1.1 List详解 ArrayList:基于动态数组实现,随机访问高效,插入删除效率低LinkedList:基于双向链表实现,插入删除高效&a…...