数据结构与算法:宽度优先遍历
前言
进入图论部分难度明显提升了一大截,思路想不到一点……
一、宽度优先遍历
1.内容
宽度优先遍历主要用于在图上求最短路。
(1)特点
宽度优先遍历的特点就是逐层扩展,最短路即层数
(2)使用条件
无向图且任意节点间距离相等
(3)注意
进入队列后需标记状态防止重复入队。
可剪枝!!可单源头可多源头!!
(4)难点
主要难点在于节点如何找路、路的展开以及剪枝方法。
2.题目
(1)地图分析
class Solution {
public://移动 -> 上下左右vector<int>move={-1,0,1,0,-1};int maxDistance(vector<vector<int>>& grid) {int n=grid.size();vector<vector<bool>>visited(n,vector<bool>(n));queue<pair<int,int>>node;int seas=0;//初始化for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(grid[i][j]==1)//陆地{visited[i][j]=true;node.push(make_pair(i,j));}else//海洋{seas++;}}}//特例if(seas==0||seas==n*n){return -1;}//统计int level=0;while(!node.empty()){level++;int size=node.size();for(int i=0,x,y,nx,ny;i<size;i++){x=node.front().first;y=node.front().second;node.pop();for(int j=0;j<4;j++)//j=0:上//j=1:下//j=2:左//j=3:右{nx=x+move[j];ny=y+move[j+1];if(nx>=0&&nx<n&&ny>=0&&ny<n&&grid[nx][ny]==0&&!visited[nx][ny]){visited[nx][ny]=true;node.push(make_pair(nx,ny));} }}}return level-1;//到最后还被多加了一次}
};
这个题主要是引入节点向周围找路的方法。
整体思路就是从每个陆地往外进行宽度优先遍历,遇到海就“感染”入队,最后返回层数-1即可。
首先,要遍历每个陆地入队,与此同时还可以顺便统计海洋数量。若全为海或者全为陆地就直接返回。之后进行宽度优先遍历统计level层数,每次从队列里取队列的size个,即当前层的所有节点,然后每个节点向外扩。注意这里向外扩的写法,设置move数组为-1,0,1,0,-1,之后每来到一个位置就让下一步的nx=x+move[j],ny=y+move[j+1],这样就能实现向上下左右四个方向扩。当下一步的位置有效时,就记录状态然后入队。
(2)贴纸拼词
class Solution {
public://邻接表建图vector<vector<string>>graph;int minStickers(vector<string>& stickers, string target) {int n=stickers.size();graph.resize(26);//能消目标某字母的字符串//路的展开 -> 用每个贴纸会导致不同的剩余情况for(int i=0;i<n;i++){//排序字符串 -> 只考虑词频和字母sort(stickers[i].begin(),stickers[i].end());//建图for(int j=0;j<stickers[i].length();j++){//统计能消的字符if(j==0||stickers[i][j]!=stickers[i][j-1])//不重复加{graph[stickers[i][j]-'a'].push_back(stickers[i]);}}}//排序sort(target.begin(),target.end());set<string>visited;//剩余字符串去重queue<string>node;visited.insert(target);node.push(target);int level=0;while(!node.empty()){level++;int size=node.size();for(int i=0;i<size;i++){string cur=node.front();node.pop();//剪枝 -> 统计前缀 -> 先消前缀for(int j=0;j<graph[cur[0]-'a'].size();j++){//求消完后的字符串string next=findNext(cur,graph[cur[0]-'a'][j]);if(next==""){return level;}else if(visited.find(next)==visited.end())//没进过{visited.insert(next);node.push(next);}}}}return -1;}string findNext(string cur,string s){string next;for(int i=0,j=0;i<cur.length();)//双指针{if(j==s.length())//用完了{next+=cur[i++];}else{if(cur[i]<s[j])//消不完{next+=cur[i++];}else if(cur[i]>s[j])//用不着{j++;}else//能消{i++;j++;}}}return next;}
};
这个题就很有难度了,最难想的地方就是之前提到过的三点:节点如何找路、路的展开和剪枝。
首先考虑是如何想到用宽度优先遍历的。过程就是在分析题目时可以发现,选择不同的贴纸会消出不同的后续字符串,而这样的结构就可以看作一张图。
对于节点如何找路的问题,因为每用一张贴纸就会消出一条路,所以就是去找能消除当前字符串里字符的所有贴纸。
再就是在路的展开时,需要统计每张贴纸可以消除哪些字符。所以可以建立邻接表,根据每张贴纸能消的所有字符,将这个贴纸加到每个字符对应的表里,之后在消除时只需要去能消这些字符的表里选即可。
然后就是剪枝,观察可以发现,在消的过程中每个字符的相对次序并不重要,重要的是每个字符的个数。所以可以考虑将字符串排序,只保留词频信息。还有,排序后可以发现,当前节点其实可以不用展开全部的路,因为每个字符都需要消除,且现在已经有序,所以只需要按照顺序依次消除,即每次展开时只找能消当前字符前缀字符的贴纸即可。
之后就是细节部分,首先是统计所有贴纸能消的字符,需要遍历字符串,为了避免重复加入,所以相同的字符只加一次。之后进行宽度优先遍历,设置一个set去重,然后每次只根据当前字符串的前缀字符去邻接表里找所有能消前缀字符的贴纸,之后去展开。在展开时,需要找到消完之后的字符串,那么就要用到findNext函数。方法就是用双指针遍历当前字符串和贴纸,若贴纸用完了,就把后面剩下的字符串全加上;否则,即没用完时,若当前的字符比贴纸的小,说明字符串里的这种字符消不完,就加到next里;若大于,说明贴纸里的这种字符用不着了,就让贴纸的指针往下跳;否则就说明能消除。
真的难啊……
(3)为高尔夫比赛砍树
class Solution {
public:vector<int>move={-1,0,1,0,-1};int cutOffTree(vector<vector<int>>& forest) {int n=forest.size();int m=forest[0].size();vector<pair<int,int>>trees;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(forest[i][j]>1){trees.push_back({i,j});}}}sort(trees.begin(),trees.end(),[&](pair<int,int>&a,pair<int,int>&b){return forest[a.first][a.second]<forest[b.first][b.second];});int ans=0;for(int i=0,x=0,y=0,result;i<trees.size();i++){result=bfs(x,y,trees[i].first,trees[i].second,n,m,forest);if(result==-1){return -1;}ans+=result;x=trees[i].first;y=trees[i].second;} return ans;}int bfs(int ix,int iy,int fx,int fy,int n,int m,vector<vector<int>>&forest){if(ix==fx&&iy==fy){return 0;}queue<pair<int,int>>node;vector<vector<bool>>visited(n,vector<bool>(m));node.push({ix,iy});visited[ix][iy]=true;int level=0;while(!node.empty()){level++;int size=node.size();for(int i=0;i<size;i++){int x=node.front().first;int y=node.front().second;node.pop();for(int j=0,nx,ny;j<4;j++){nx=x+move[j];ny=y+move[j+1];if(nx==fx&&ny==fy){return level;}if(nx>=0&&nx<n&&ny>=0&&ny<m&&forest[nx][ny]>0&&!visited[nx][ny]){node.push({nx,ny});visited[nx][ny]=true;}}}}return -1;}
};
这个题思路倒不是很难,就是tnnd卡常,节点用vector表示会超时,必须得改成pair才行。
具体思路其实挺简单的,就是根据第一反应去暴力。先遍历找出每棵树,然后把所有树根据高度从小到大排序,然后根据排序后的顺序,每次跑一遍宽度优先遍历bfs求最短路即可。(一开始还担心这个方法时间会超…)
之后没啥好说的了,就是bfs的模板。中间再注意一下特例的处理就行,比如初始点就是树的情况bfs要返回0。
二、01bfs
1.内容
当节点与节点间存在权重,求最短路就不能用宽度优先遍历。此时,若权重要么是0要么是1,那么就可以使用01bfs,否则就得用dijkstra等其他求最短路的算法了。
2.题目
(1)到达角落需要移除障碍物的最小数目
class Solution {
public:vector<int>move={-1,0,1,0,-1};int minimumObstacles(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<int>>distance(n,vector<int>(m,INT_MAX));//初始无穷大deque<vector<int>>node;node.push_front({0,0});distance[0][0]=0;while(!node.empty()){vector<int>cur=node.front();//每次从头部弹出node.pop_front();int x=cur[0];int y=cur[1];if(x==n-1&&y==m-1)//到终点{return distance[x][y];}for(int i=0,nx,ny;i<4;i++){nx=x+move[i];ny=y+move[i+1];if(nx>=0&&nx<n&&ny>=0&&ny<m&&distance[x][y]+grid[nx][ny]<distance[nx][ny])//可以让去这个点的代价更小{distance[nx][ny]=distance[x][y]+grid[nx][ny];//更新if(grid[nx][ny]==0){node.push_front({nx,ny});//头入}else{node.push_back({nx,ny});//尾入}}}} return -1;}
};
观察发现,这个题完全符合上面对01bfs的描述,所以直接跑一遍01bfs就行。
01bfs的具体方法是,设置一个distance数组存从起点到每个点的最短距离,初始每个都为无穷大。然后设置一个双端队列存节点,初始加入起点并将起点的distance设置为0。之后只要队列不为空,每次取头部节点弹出,若到了终点就直接返回,否则去周围四个点,若当前点的distance加上去往下一个点的代价小于下一个点的distance,即能把下一个点的距离变得更小,就更新下一个点的distance为当前点加代价,之后若代价为0就从头部入队,代价为1就从尾部入队。
(2)使网格图至少有一条有效路径的最小代价
class Solution {
public:vector<vector<int>>move={{},{0,1},{0,-1},{1,0},{-1,0}};int minCost(vector<vector<int>>& grid) {int n=grid.size();int m=grid[0].size();vector<vector<int>>distance(n,vector<int>(m,INT_MAX));deque<vector<int>>node;node.push_front({0,0});distance[0][0]=0;while(!node.empty()){vector<int>cur=node.front();node.pop_front();int x=cur[0];int y=cur[1];if(x==n-1&&y==m-1){return distance[x][y];}for(int i=1,nx,ny,cost;i<=4;i++){nx=x+move[i][0];ny=y+move[i][1];cost=nx!=x+move[grid[x][y]][0]||ny!=y+move[grid[x][y]][1];if(nx>=0&&nx<n&&ny>=0&&ny<m&&distance[nx][ny]>distance[x][y]+cost){distance[nx][ny]=distance[x][y]+cost;if(cost==0){node.push_front({nx,ny});}else{node.push_back({nx,ny});}}}}return -1;}
};
这个题主要是需要转化一下,当来到每个格子,若下一步往箭头方向走,代价就是0;若往非箭头方向走,代价就是1。
转化完就是01bfs的模板了,没啥好说的。
三、宽度优先遍历与堆——接雨水 II
class Solution {
public:vector<int>move={-1,0,1,0,-1};static bool cmp(vector<int>&a,vector<int>&b){return a[2]>b[2];}int trapRainWater(vector<vector<int>>& heightMap) {int n=heightMap.size();int m=heightMap[0].size();//小根堆priority_queue<vector<int>,vector<vector<int>>,decltype(&cmp)>heap(cmp);vector<vector<bool>>visited(n,vector<bool>(m,false));//先入外围一圈for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(i==0||i==n-1||j==0||j==m-1){heap.push({i,j,heightMap[i][j]});//存水线高度visited[i][j]=true;}}}//宽度优先遍历int ans=0;while(!heap.empty()){vector<int>cur=heap.top();heap.pop();int x=cur[0];int y=cur[1];int h=cur[2];//水线高度!!ans+=h-heightMap[x][y];for(int i=0,nx,ny;i<4;i++){nx=x+move[i];ny=y+move[i+1];if(nx>=0&&nx<n&&ny>=0&&ny<m&&!visited[nx][ny]){//水线高度=max(格子高度,当前点水线高度)heap.push({nx,ny,max(heightMap[nx][ny],h)});visited[nx][ny]=true;}}}return ans;}
};
这个题确实有点小恶心,但想到思路之后的coding还是不难的。
首先,因为能盛的水量主要取决于周围一圈水线最低的格子,所以考虑从外向内扩,每次统计下一个格子的水线。因为每次考虑的都是水线最低的格子,所以这里使用一个小根堆存位置和水线。之后,先让外面一圈入堆,由于在最外层,所以它们的水线就是自己的高度,即盛不了水。然后每次从水线最小的格子考虑,取出即统计答案,即水线减去自己的高度。这里,水线就是自己高度和上一格水线高度的最大值,因为若自己的高度比上一格的水线小,那么之后格子依然依赖上一格的水线,若自己高度比上一格的水线大,那么之后的格子就可以盛更多的水。
这个从外到内和更新水线的思路真不好想……
四、bfs和dfs结合——单词接龙 II
class Solution {
public:vector<vector<string>>ans;vector<string>path;//建反图 -> a能由谁生成map<string,vector<string>>graph;//将单词表转化成setset<string>words;//每一层去重set<string>curLevel;set<string>nextLevel;vector<vector<string>> findLadders(string beginWord, string endWord, vector<string>& wordList) {words={wordList.begin(),wordList.end()};if(words.find(endWord)==words.end())//没有endWord{return ans;}if(bfs(beginWord,endWord)){//反向搜生成路径dfs(endWord,beginWord);}return ans;}//建图,返回是否存在bool bfs(string beginWord,string endWord){bool find=false;curLevel.insert(beginWord);while(!curLevel.empty()){//单词表删当前层,去重for(auto iter=curLevel.begin();iter!=curLevel.end();iter++){words.erase(*iter);}//当前层生成路for(string word:curLevel){//每个位置字符从a到z换一遍,检查是否存在for(int i=0;i<word.length();i++){string old=word;for(char ch='a';ch<='z';ch++){word[i]=ch;if(words.find(word)!=words.end())//词表中有{if(word==endWord)//找到了{find=true;}graph[word].push_back(old);nextLevel.insert(word);}}word=old;}}if(find){return true;}else{curLevel=nextLevel;nextLevel.clear();}}return false;}void dfs(string endWord,string beginWord){//反搜 -> 头插path.insert(path.begin(),endWord);if(endWord==beginWord)//找到了{ans.push_back(path);}else{for(string next:graph[endWord]){dfs(next,beginWord);}}path.erase(path.begin());}
};
这个题的思路有点过于逆天了,初见肯定得超时几次才能改得出来……
首先,分析题目可以发现,当前字符串根据改法的不同会展开不同的路,所以整体思路是用宽度优先遍历建图,然后找最短路。那么再进一步想,因为展开的路会有很多,但其中肯定大部分都走不到终点,是无效的路,所以为了加快找路的速度,可以使用深度优先搜索dfs,从终点开始往起点搜,这样就能避免走“死胡同”。再进一步考虑,为了实现反向dfs,所以在建图时要建反图,即让产生的新字符串指向旧字符串。
首先是bfs,为了实现去重,所以设置curLevel和nextLevel两个set,curLevel充当队列。之后首先往里加入初始字符串,然后每到一层,为了让路径最短,不走回头路,所以要让总词表减去curLevel的词,之后遍历当前层的所有情况去生成路,这里,若去遍历词表里的每个字符串,然后一个字符一个字符比对的话时间复杂度就太高了,所以考虑遍历当前字符的每个位置,让每个位置从a到z换一遍,然后去词表里找有没有,那么可以直接将词表转成一个set。若找到了就更新find,之后建图并往nextLevel里加入。遍历完所有位置,若找到了就直接返回,否则让curLevel来到nextLevel准备下一层。这里不能找到了就直接返回,会漏掉其他可能性。
再就是dfs建路了,因为是反搜,所以每次往path的开头插入。若找到了就往ans里加,没找到就遍历下一层的所有情况去递归,最后在回来时还要还原现场。
总结
太难了……
END
相关文章:
数据结构与算法:宽度优先遍历
前言 进入图论部分难度明显提升了一大截,思路想不到一点…… 一、宽度优先遍历 1.内容 宽度优先遍历主要用于在图上求最短路。 (1)特点 宽度优先遍历的特点就是逐层扩展,最短路即层数 (2)使用条件 …...
PyTorch 面试题及参考答案(精选100道)
目录 PyTorch 的动态计算图与 TensorFlow 的静态计算图有何区别?动态图的优势是什么? 解释张量(Tensor)与 NumPy 数组的异同,为何 PyTorch 选择张量作为核心数据结构? 什么是 torch.autograd 模块?它在反向传播中的作用是什么? 如何理解 PyTorch 中的 nn.Module 类?…...
【数理基础】【概率论与数理统计】概率论与数理统计本科课程总结、资料汇总、个人理解
1 前言 概率论与数理统计是数学系核心的基础专业课,我本科的时候,是拆开上的,对应工科专业的高数中的概率论与数理统计,在量子力学,机器学习,计算机领域深度学习,大模型,机器人控制…...
美制 / 英制单位换算/公制/帝国制 单位转换速查表
文章目录 💡Introduction📏 英制(美制)单位与公制换算速查表🧱 一、长度(Length)🧴 二、体积(Volume / Liquid Measure)⚖️ 三、质量 / 重量(Wei…...
ENSP学习day9
ACL访问控制列表实验 ACL(Access Control List,访问控制列表)是一种用于控制用户或系统对资源(如文件、文件夹、网络等)访问权限的机制。通过ACL,系统管理员可以定义哪些用户或系统可以访问特定资源&#x…...
我爱学算法之——滑动窗口攻克子数组和子串难题(中)
学习算法,继续加油!!! 一、将 x 减到 0 的最小操作数 题目解析 来看这一道题,题目给定一个数组nums和一个整数x;我们可以在数组nums的左边或者右边进行操作(x减去该位置的值)&#…...
Linux centos 7 vsftp本地部署脚本
下面是脚本: #!/bin/bash #function:vsftpd脚本 #author: 20230323 IT 小旋风# 判断是否是root用户 if [ "$USER" ! "root" ]; thenecho "不是root 装个蛋啊"exit 1 fi# 关闭防火墙 systemctl stop firewalld && systemctl disable …...
编程考古-安德斯·海尔斯伯格(Anders Hejlsberg)回答离开Borland的原因
安德斯海尔斯伯格(Anders Hejlsberg)是著名的编程语言和工具开发者,曾主导开发了 Turbo Pascal、Delphi(Borland 时期),以及加入微软后参与的 C# 和 TypeScript。关于他离开 Borland 的原因,可以…...
数据库数值函数详解
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 数值函数是数据库中用于处理数值数据的函数,可以用于执行各种数学运算、统计计算等。数值函数在数据分析及处理时非常重要,能够帮助我们进行数据的聚合、计算和转换。在本篇博客中,我们将详细介绍常用的…...
SpringBoot与Redisson整合,用注解方式解决分布式锁的使用问题
文章引用:https://mp.weixin.qq.com/s/XgdKE2rBKL0-nFk2NJPuyg 一、单个服务 1.代码 该接口的作用是累加一个值,访问一次该值加1 RestController public class LockController {Autowiredprivate StringRedisTemplate stringRedisTemplate;GetMappin…...
Bash 脚本基础
一、Bash 脚本基础 什么是 Bash 脚本:Bash 脚本是一种文本文件,其中包含了一系列的命令,这些命令可以被 Bash shell 执行。它用于自动化重复性的任务,提高工作效率。 Bash 脚本的基本结构:以 #!/bin/bash 开头&#x…...
【Linux】线程库
一、线程库管理 tid其实是一个地址 void* start(void* args) {const char* name (const char *)args;while(true){printf("我是新线程 %s ,我的地址:0x%lx\n",name,pthread_self());sleep(1);}return nullptr; }int main() {pthread_t tid…...
Smith3.0 4.0的阻抗匹配操作方法
阅读了这篇文章中,我get到一些知识点的总结: 百度安全验证https://baijiahao.baidu.com/s?id1822624157494292625 1)红色圆代表阻抗圆,绿色圆代表导纳圆。 2)圆心位于50欧,最左侧为0欧,最右侧…...
装饰器模式 (Decorator Pattern)
装饰器模式 (Decorator Pattern) 是一种结构型设计模式,它动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。 一、基础 1 意图 动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰器模式相比生成子类更为灵活。 2 适用场景 当…...
生活电子类常识——搭建openMauns工作流+搭建易犯错解析
前言 小白一句话生成一个网站?小白一句话生成一个游戏?小白一句话生成一个ppt?小白一句话生成一个视频? 可以 原理 总体的执行流程是 1,用户下达指令 2,大模型根据用户指令,分解指令任务为多个细分步骤…...
题型笔记 | Apriori算法
目录 内容拓展知识 内容 其步骤如下: 扫描全部数据,产生候选项 1 1 1 项集的集合 C 1 C_1 C1根据最小支持度,由候选 1 1 1 项集的集合 C 1 C_1 C1 产生频繁 1 1 1 项集的集合 L 1 L_1 L1。若 k > 1 k > 1 k>1…...
雷电模拟器启动94%卡住不动解决方案
安卓模拟器启动失败/启动加载卡0-29%/启动卡50%/启动卡94%的解决方法 首先看官方论坛常见问题来尝试解决: 安卓模拟器启动失败/启动加载卡0-29%/启动卡50%/启动卡94%的解决方法-雷电安卓模拟器-手游模拟器安卓版_android手机模拟器电脑版_雷电模拟器帮助中心 所有…...
站群服务器是什么意思呢?
站群服务器是一种专门为托管和管理多个网站而设计的服务器,其核心特点是为每个网站分配独立的IP地址。这种服务器通常用于SEO优化、提高网站权重和排名,以及集中管理多个网站的需求。以下是站群服务器的详细解释: 一、站群服务器的定义 站群…...
靶场(十五)---小白心得思路分析---LaVita
启程: 扫描端口,发现开放22,80端口,发现ws.css可能存在exp,经查发现无可利用的exp PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5deb11u2 (protocol 2.0) | ssh-hostkey: | 3072 c9…...
第十六次CCF-CSP认证(含C++源码)
第十六次CCF-CSP认证 小中大满分思路遇到的问题 二十四点(表达式求值)难点满分思路 小中大 这次我觉得是非常难的 只有一道easy 做的时候看这个通过率就有点不对劲 上官网看了一眼平均分 106 就是人均A一道的水准 一开始看了半天 第三题几乎还是下不了手…...
大数据中的数据预处理:脏数据不清,算法徒劳!
大数据中的数据预处理:脏数据不清,算法徒劳! 在大数据世界里,数据预处理是个让人又爱又恨的环节。爱它,是因为数据预处理做好了,后续的模型跑起来又快又准,仿佛给AI装上了火箭助推器࿱…...
17153 班级活动
17153 班级活动 ⭐️难度:简单 🌟考点:2023、思维、国赛 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10…...
算力100问☞第93问:算力资源为何更分散了?
目录 1、政策驱动与地方投资的盲目性 2、美国芯片断供与国产替代的阵痛 3、政企市场对私有云的偏好 4、技术标准与供需结构的失衡 5、产业生态与市场机制的滞后 6、破局路径与未来展望 在大模型和人工智能技术快速发展的背景下,算力资源已成为数字经济时代的核心基础设施…...
记录 macOS 上使用 Homebrew 安装的软件
Homebrew 是 macOS 上最受欢迎的软件包管理器之一,能够轻松安装各种命令行工具和 GUI 应用。本文记录了我通过 Homebrew 安装的各种软件,并对它们的用途和基本使用方法进行介绍。 🍺 Homebrew 介绍 Homebrew 是一个开源的包管理器ÿ…...
Java 安装开发环境(Mac Apple M1 Pro)
下载 Java Downloads 查看本地安装的 JDK 所在位置以及 JAVA 版本 系统默认的安装处 /Library/Java/JavaVirtualMachines配置Java 添加环境变量 vim ~/.bash_profileAdd # 安装位置 export JAVA_11_HOME"/Library/Java/JavaVirtualMachines/zulu-11.jdk…...
微前端框架的实战demo
以下是基于主流微前端框架的实战 Demo 开发指南,综合多个开源项目与实践案例整理而成: 一、qiankun 框架实战 1. 核心架构 主应用:负责路由分发、子应用注册与生命周期管理子应用:独立开发部署,支持不同技术栈&#…...
win32汇编环境,网络编程入门之九
;在上一教程里,我们学习了在连接成功网站后,应该发送什么数据给网站 ;在前面的几个教程里,简单地运行了套接字机制连接网站的方式,这是字节级的网络连接,扩展几乎是无限的。 ;想了想,这个开个头就行了&…...
OceanBase 4.3.3 AP 解析:应用 RoaringBitmaps 类型处理海量数据的判重和基数统计
对于大数据开发人员而言,处理海量数据的判重操作和基数统计是常见需求,而 RoaringBitmap类型及其相关函数是当前非常高效的一种解决方案,许多大数据库产品已支持RoaringBitmap类型。OceanBase 4.3.3版本,作为专为OLAP场景设计的正…...
点亮STM32最小系统板LED灯
对于如何点亮板载LED灯只需要掌握如何初始化GPIO引脚,并改变GPIO引脚的电平即可实现点亮或者熄灭LED。 Led_INFO led_info {0}; led_info 是一个结构体变量,类型为 Led_INFO,用于存储LED的状态信息。这里初始化为 {0},表示所有成…...
分区表的应用场景与优化实践
当表的数据量非常大,达到几千万甚至上亿行时,全表扫描会很慢,这时候分区可以帮助缩小扫描范围。比如,在一个电商系统中,订单表可能按月份分区,这样查询某个月的订单时,只需要扫描对应的分区,而不是整个表。或者在日志系统中,按天分区,方便归档和删除旧日志。 另外,如…...
如何高效参与 GitHub 知名项目开发并成为核心贡献者
参与知名 GitHub 项目开发不仅能提升你的编程能力,还能积累开源贡献经验,甚至为求职加分。以下是详细步骤: 1. 选择合适的 GitHub 项目 (1) 确定兴趣方向 后端开发:Spring、Spring Boot、Netty前端开发:React、Vue、…...
AIGC 新势力:探秘海螺 AI 与蓝耘 MaaS 平台的协同创新之旅
探秘海螺AI:多模态架构下的认知智能新引擎 在人工智能持续进阶的进程中,海螺AI作为一款前沿的多功能AI工具,正凭借其独特的多模态架构崭露头角。它由上海稀宇科技有限公司(MiniMax)精心打造,依托自研的万亿…...
银河麒麟桌面版包管理器(三)
以下内容摘自《银河麒麟操作系统进阶应用》一书 麒麟系统软件源配置 使用官方内置源时,无须任何操作。仅在使用其他镜像源(Mirror)时,需要修改/etc/apt/sources.list文件,根据不同版本,将原始sources.lis…...
在 .NET 9.0 Web API 中实现 Scalar 接口文档及JWT集成
示例代码:https://download.csdn.net/download/hefeng_aspnet/90408075 介绍 随着 .NET 9 的发布,微软宣布他们将不再为任何 .NET API 项目提供默认的 Swagger gen UI。以前,当我们创建 .NET API 项目时,微软会自动添加 Swagger…...
XSS跨站脚本攻击漏洞(Cross Site Scripting)
前提概要 本文章主要用于分享XSS跨站脚本攻击漏洞基础学习,以下是对XSS跨站脚本攻击漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 XSS跨站脚本攻击漏洞描述 跨站脚本攻击(XSS)漏洞是一种常见且危害较…...
Android:蓝牙设置配套设备配对
一、概述 在搭载 Android 8.0(API 级别 26)及更高版本的设备上,配套设备配对会代表您的应用对附近的设备执行蓝牙或 Wi-Fi 扫描,而不需要 ACCESS_FINE_LOCATION 权限。这有助于最大限度地保护用户隐私。使用此方法执行配套设备&am…...
MFC中CString类型是如何怎么转std::string的
文章目录 一、转换方法总结二、详细步骤1. Unicode 项目(CStringW → std::string)2. 多字节项目(CStringA → std::string) 三、注意事项四、总结更多信息(知识点存在重复,可跳过)方法 1:项目使用 Unicode…...
使用vscode搭建pywebview集成vue项目示例
文章目录 前言环境准备项目源码下载一、项目说明1 目录结构2 前端项目3 后端项目获取python安装包(选择对应版本及系统) 三、调试与生成可执行文件1 本地调试2 打包应用 四、核心代码说明1、package.json2、vite.config.ts设置3、main.py后端入口文件说明 参考文档 前言 本节我…...
JAVASCRIPT 基础 DOM元素,MAP方法,获取输入值
从输入框获取数据的一般写法是: javascript const w parseFloat(document.getElementById("weight").value); const h parseFloat(document.getElementById("height").value); 而从弹窗获取数据一般写法是: javascript const w …...
VLAN间通信
目录 第一步:配vlan 第二步:配置核心vlanif,MAC地址信息。 第三步:ospf协议 三层交换机(汇聚层): 对于交换机、路由器、防火墙等网络设备而言,接口类型一般存在两种:二层接口,三…...
MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇
文章目录 前言一、窗口函数(Window Functions)1.1 窗口函数概念1.2 常见的窗口函数 二、公用表表达式(Common Table Expressions, CTEs)2.1 公用表表达式的概念2.2 常见的公用表表达式 三、JSON增强3.1 JSON增强的概念3.2 常见的J…...
5.安全相关(双手启动、安全触边传感器)
一、关于双手启动按钮的使用规范 本文介绍双手启动按钮的使用。概括来讲: 双手按下之间的时间差间隔应该在0.5-2秒之间。一旦释放任何一个按钮,启动信号输出结束。只有两个按钮都被释放之后,才能再次触发双手启动信号。如果某按钮被按下超过…...
国产达梦(DM)数据库的安装(Linux系统)
目录 一、安装前的准备工作 1.1 导包 1.2 创建用户和组 1.3 修改文件打开最大数 1.4 目录规划 1.5 修改目录权限 二、安装DM8 2.1 挂载镜像 2.2 命令行安装 2.3 配置环境变量 2.4 启动图形化界面 三、配置实例 四、注册服务 五、启动 停止 查看状态 六、数据库客…...
mapper.xml中 “http://mybatis.org/dtd/mybatis-3-mapper.dtd“> 报错的解决方法
我用mybatisx自动生成代码,但是mapepr.xml中的 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">报错,如下图,圈起来的部分是之前的报错,现在已经解决,所以没有爆红: 解决方法:…...
01_JavaScript
目录 一、js介绍、能做什么 --了解 二、JavaScript的组成-重点 三、JavaScript代码的书写位置 行内JS 内嵌 JS 外链 JS 四、JS 中的注释 单行 多行 五、变量(重点) 定义变量及赋值 变量的命名规则和命名规范 六、数据类型(重…...
数组作为哈希表的妙用:寻找缺失的第一个正数
数组作为哈希表的妙用:寻找缺失的第一个正数 大家好,我是Echo_Wish,今天我们来探讨一个经典的算法问题——“缺失的第一个正数”。听起来可能有点简单,但它实际上是一个非常有意思且富有挑战性的题目,在面试中常常会碰…...
JAVA学习*Object类
Object类 Object类是所有类的父类 类中有一些方法(都需要掌握) toString()方法 在学习类的对象的时候有介绍过了,当我们重新给此方法就会打印类与对象的信息 equals()方法 在Java中的比较, 如果左右两侧是基本类型变量&#…...
《论语别裁》第02章 为政(03)星辰知多少
第二个问题说到“北辰”。我们中国文化发达得最早的是天文。过去我们把天体分成二十八宿和三垣——紫微、少微、太微,类似于我们现在讲天文的经纬度。经纬度是西方的划分法。曾经有位天文学家主张,我们自己重新划过,不照西方的度数划…...
git_version_control_proper_practice
git_version_control_proper_practice version control,版本控制的方法之一就是打tag 因为多人协作的项目团队,commit很多,所以需要给重要的commit打tag,方便checkout,检出这个tag 参考行业的实践方式。如图git、linux…...
playwright-go实战:自动化登录测试
1.新建项目 打开Goland新建项目playwright-go-demo 项目初始化完成后打开终端输入命令: #安装项目依赖 go get -u github.com/playwright-community/playwright-go #安装浏览器 go run github.com/playwright-community/playwright-go/cmd/playwrightlatest insta…...