当前位置: 首页 > news >正文

图的遍历|深度优先搜索|广度优先搜索(C)

图的基本操作

图的基本操作是独立于图的存储结构的。而对于不同的存储方式,操作算法的具体实现会有着不同的性能。在设计具体算法的实现时,应考虑采用何种存储方式的算法效率会更高。
图的基本操作主要包括(仅抽象地考虑,所以忽略各变量的类型):

Adjacent(G, x, y);       // 判断图G是否存在边<x,y>或(x,y)
Neighbors(G, x);         // 列出图G中与节点x邻接的边
InsertVertex(G, x);      // 在图G中插入顶点x
DeleteVertex(G, x);      // 在图G中删除顶点x
AddEdge(G, x, y);        // 若无向边(x,y)或有向边<x,y>不存在,则向图G中添加该边
RemoveEdge(G, x, y);     // 若无向边(x,y)或有向边<x,y>存在,则从图G中删除该边
FirstNeighbor(G, x);     // 求图G中顶点x的第一个邻接点,若有则返回顶点号,若x没有邻接点或图中不存在x,则返回-1
NextNeighbor(G, x, y);   // 假设图G中顶点y是顶点x的一个邻接点,返回除y外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1
Get_edge_value(G, x, y);    // 获取图G中边(x,y)或<x,y>对应的权值
Set_edge_value(G, x, y, v); // 设置图G中边(x,y)或<x,y>对应的权值为v

图的遍历

图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次,且仅访问一次。
注意到树是一种特殊的图,所以树的遍历实际上也可视为一种特殊的图的遍历。图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。
图的遍历比树的遍历要复杂得多,因为图的任意一个顶点都可能和其余的顶点相邻接,所以在访问某个顶点后,可能沿着某条路径搜索又回到该顶点。
为避免同一顶点被访问多次,在遍历图的过程中,必须记下每个已访问过的顶点,为此可以设一个辅助数组visited[]来标记顶点是否被访问过。
图的遍历算法主要有两种:广度优先搜索和深度优先搜索。
![[Pasted image 20241217230349.png]]

广度优先搜索

广度优先搜索(Breadth-First-Search,BFS)类似于二叉树的层序遍历算法。
基本思想是:

  1. 首先访问起始顶点v,接着由v出发,依次访问的各个未访问过的邻接顶点 w 1 , w 2 , … , w i w_{1},w_{2},\dots,w_{i} w1,w2,,wi,然后依次访问 w 1 , w 2 , … , w i w_{1},w_{2},\dots,w_{i} w1,w2,,wi;的所有未被访问过的邻接顶点;
  2. 再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点,直至图中所有顶点都被访问过为止。
  3. 若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为始点,重复上述过程,直至图中所有顶点都被访问到为止。
    Dijkstra单源最短路径算法和Prim最小生成树算法也应用了类似的思想。
    换句话说,广度优先搜索遍历图的过程是以v为起始点,由近至远依次访问和v有路径相通且路径长度为1,2…的顶点。
    广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法。
    为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。
伪代码
bool visited[maxVertexNum];         // 访问标记数组
void BFSTraverse(Graph G)           // 对图G进行广度优先遍历
{for(i = 0; i < G.vexnum; ++i){// 访问标记数组初始化visited[i] = false;}// 初始化辅助队列QInitQueue(Q);// 从0号顶点开始遍历for(i = 0; i < G.vexnum; ++i){// 对每个连通分量调用一次BFS()if (!visited[i])// 若vi未访问过,从vi开始调用BFS()BFS(G, i);}
}
    0 —— 1|    |2    3
  • 顶点:0, 1, 2, 3
  • 边:(0, 1), (0, 2), (1, 3)
  1. 初始化:
    visited[] = {false, false, false, false}
    队列初始化为空。
  2. 开始遍历:
    从顶点 0 开始,因为 visited[0] == false
    0 入队,访问 0
  3. BFS 遍历:
    访问 0 的邻接顶点 12,并将它们入队:
    visited[] = {true, true, true, false}
    Queue: [1, 2]
    
    出队顶点 1,访问 1 的邻接顶点 3,并将 3 入队:
    visited[] = {true, true, true, true} 
    Queue: [2, 3]
    
    出队顶点 2,发现它没有未访问的邻接顶点。
    出队顶点 3,发现它没有未访问的邻接顶点。
  4. 完成第一个连通分量:
    此时队列为空,连通分量遍历完成。
  5. 继续检查其他顶点:
    visited[] = {true, true, true, true},所有顶点已访问,无需再调用 BFS()
邻接表广度优先搜索
void BFS(ALGrapg G, int i)
{// 访问初始顶点ivisit(i);// 对i做已访问标记visited[i] = true;// 顶点i入队EnQueue(Q, i);while (!QueEmpty(Q)){// 队首顶点v出队DeQueue(Q, v);// 检测v的所有邻接点for (p = G.vertices[v].firstarc; p; p = p->nextarc){w = p->adjvex;if (visited[w] == false){// w为v的尚未访问的邻接点,访问wvisit(w);// 对w做已访问标记visited[w] = true;// 顶点w入队EnQueue(Q, w);}}}
}

初始操作:
访问起始顶点 i
标记 i 为已访问,并将其入队。
进入队列循环:
当队列不空时,执行以下操作:
1. 队首顶点 v 出队。
2. 遍历 v 的所有邻接点。
对于每个邻接点 w
如果 w 未被访问,则执行:
1. 访问 w
2. 标记 w 为已访问
3. 将 w 入队。
终止条件:
当队列为空时,广度优先搜索结束。

邻接矩阵广度优先搜索
void BFS(MGraph G, int i)
{// 访问初始节点ivisit(i);// 对i做已访问标记visited[i] = true;// 顶点i入队EnQueue(Q, i);while (!QueEmpty(Q)){// 队首顶点v出队DeQueue(Q, v);// 检测v的所有邻接点for (w = 0; w < G.vexnum; w++){if (visited[w] == false && G.edge[v][w] == 1){// w为v的尚未访问的邻接点,访问wvisit(w);// 对w做已访问的标记visited[w] = true;// 顶点w入队EnQueue(Q, w);}}}
}

辅助数组visited[]标志顶点是否被访问过,其初始状态为FALSE。在图的遍历过程中,一旦某个顶点v被访问,就立即置visited[i]为TRUE,防止它被多次访问。

深度优先搜索

与广度优先搜索不同,深度优先搜索(Depth-First-Search,DFS)类似于树的先序遍历。
如其名称中所暗含的意思一样,这种搜索算法所遵循的策略是尽可能“深”地搜索一个图。
它的基本思想如下:

  1. 首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任意一个顶点 w 1 w_{1} w1,再访问与w邻接且未被访问的任意一个顶点 w 2 w_{2} w2
  2. 重复上述过程。
  3. 当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直至图中所有顶点均被访问过为止。
bool visited[maxVertexNum];        // 访问标记数组
void DFSTraverse(Graph G)          // 对图G进行深度优先遍历
{for (i = 0; i < G.vexnum; i++) // 初始化已访问标记数组visited[i] = false;         for (i = 0; i < G.vexnum; i++) // 从v0开始遍历// 对尚未访问过的顶点调用DFS()if (!visited[i])DFS(G, i);
}

初始化访问标记数组:
遍历所有顶点,将 visited[] 数组初始化为 false,表示所有顶点都尚未访问。
开始遍历:
遍历所有顶点,对于每个未被访问的顶点i,调用 DFS(G, i) 进行深度优先搜索。

邻接表深度优先搜索

void DFS(ALGraph G, int i)
{// 访问初始顶点ivisit(i);// 对i做已访问标记visited[i] = true;// 检查i的所有邻接点for (p = G.vertices[i].firstarc; p; p->nextarc){// 获取邻接点 jj = p->adjvex;// 如果邻接点 j 未被访问if (visited[j] == false)// j为i的尚未访问的邻接点,递归访问jDFS(G, j);}
}

访问当前顶点 i:调用 visit(i) 进行访问操作,例如打印顶点编号。
标记已访问:visited[i] = true,确保不会重复访问当前顶点。
遍历所有邻接点:
使用 for 循环遍历顶点i的邻接点列表,依次访问所有邻接点。
对每个尚未访问的邻接点j,递归调用 DFS(G, j),继续深度搜索。
递归结束条件:当邻接点全部遍历完毕,返回上一层调用。

0 - 1
|   |
2   3顶点  邻接表0    → 1 → 21    → 0 → 32    → 03    → 1
初始状态
  • visited[] = {false, false, false, false}
DFS(G, 0)
  1. 访问顶点 0visit(0) → 标记 visited[0] = true
  2. 遍历邻接点:
    • j=1:visited[1] = false,递归调用 DFS(G, 1)
DFS(G, 1)
  1. 访问顶点 1visit(1) → 标记 visited[1] = true
  2. 遍历邻接点:
    • j=0:visited[0] = true,跳过。
    • j=3:visited[3] = false,递归调用 DFS(G, 3)
DFS(G, 3)
  1. 访问顶点 3visit(3) → 标记 visited[3] = true
  2. 遍历邻接点:
    • j=1:visited[1] = true,跳过。
      回溯到 DFS(G, 0),继续遍历 0 的邻接点:
  • j=2:visited[2] = false,递归调用 DFS(G, 2)
DFS(G, 2)
  1. 访问顶点 2visit(2) → 标记 visited[2] = true
  2. 遍历邻接点:
    • j=0:visited[0] = true,跳过。
0 → 1 → 3 → 2

邻接矩阵深度优先搜索

void DFS(MGraph G, int i)
{// 访问初始顶点ivisit(i);// 对i做已访问标记visited[i] = true;// 检测i的所有邻接点for (j = 0; j < G.vexnum; j++){if (visited[j] == false && G.edge[i][j] == 1)// j为i尚未访问过的邻接点,递归访问jDFS(G, j);}
}
  • 访问当前顶点 i
    • visit(i) 对顶点 i 执行访问操作,例如输出顶点编号。
    • 标记 visited[i] = true,防止重复访问。
  • 检测所有邻接点:
    • 使用 for 循环遍历顶点j(0 到 G.vexnum-1)。
    • 如果 G.edge[i][j] == 1(表示 i 和 j 有一条边)且 j 未访问:
      • 递归调用 DFS(G, j),继续访问顶点 j。
  • 递归结束条件:
    • 遍历完 i 的所有邻接点后,返回上一层递归调用。
  0 1 2 3
0 1 1 1 0
1 1 1 0 1
2 1 0 1 0
3 0 1 0 1
初始状态
  • visited[] = {false, false, false, false}
  • 从顶点 0 开始调用 DFS(G, 0)
步骤 1DFS(G, 0)
  • 访问 0visited[0] = true
  • 遍历邻接点:
    • j=1:G.edge[0][1] == 1visited[1] == false
      • 递归调用 DFS(G, 1)
步骤 2DFS(G, 1)
  • 访问 1visited[1] = true
  • 遍历邻接点:
    • j=0:visited[0] == true,跳过。
    • j=3:G.edge[1][3] == 1visited[3] == false
      • 递归调用 DFS(G, 3)
步骤 3DFS(G, 3)
  • 访问 3visited[3] = true
  • 遍历邻接点:
    • j=1:visited[1] == true,跳过。
  • 返回 DFS(G, 1)
    回到 DFS(G, 0)
  • j=2:G.edge[0][2] == 1visited[2] == false
    • 递归调用 DFS(G, 2)
步骤 4DFS(G, 2)
  • 访问 2visited[2] = true
  • 遍历邻接点:
    • j=0:visited[0] == true,跳过。
  • 返回 DFS(G, 0)

相关文章:

图的遍历|深度优先搜索|广度优先搜索(C)

图的基本操作 图的基本操作是独立于图的存储结构的。而对于不同的存储方式&#xff0c;操作算法的具体实现会有着不同的性能。在设计具体算法的实现时&#xff0c;应考虑采用何种存储方式的算法效率会更高。 图的基本操作主要包括&#xff08;仅抽象地考虑&#xff0c;所以忽略…...

Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架

Pytest-Bdd vs Behave&#xff1a;选择最适合的 Python BDD 框架 Pytest BDD vs Behave&#xff1a;选择最适合的 Python BDD 框架BDD 介绍Python BDD 框架列表Python BehavePytest BDDPytest BDD vs Behave&#xff1a;关键区别Pytest BDD vs Behave&#xff1a;最佳应用场景结…...

python文字转语音

一、安装对应的包 pip install pyttsx3 二、代码实现 import pyttsx3# 初始化tts引擎 engine pyttsx3.init()# 设置要转换的文本 text "你好"# 设置语速&#xff0c;范围从-1到1&#xff0c;1是正常速度&#xff0c;-1是最慢速度 rate engine.getProperty(rate…...

【安全研究】某黑产网站后台滲透与逆向分析

文章目录 x01. 前言x02. 分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与…...

XSLT 编辑 XML

XSLT 编辑 XML 介绍 XSLT&#xff08;可扩展样式表语言转换&#xff09;是一种用于转换XML文档的语言。它允许开发人员将XML数据转换为其他格式&#xff0c;如HTML、PDF或纯文本。XSLT通过使用XPath查询来定位XML文档中的元素&#xff0c;并对这些元素应用转换规则。在本教程…...

计算机网络信息系统安全问题及解决策略

目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 &#xff08;一&#xff09;计算机网络信息系统研究现状 &#xff08;二&#xff09;计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 &#xff08;一&#xff09;环境危害引发的安全问…...

112.【C语言】数据结构之排序(详解插入排序)

目录 1.排序定义 2.插入排序 "插入"的含义 代码 函数框架 函数设计思路 以升序为例,分析插入的三种可能 单趟排序代码 优化后 将单趟排序代码嵌入到循环中 错误代码 两种改法 运行结果 时间复杂度 1.排序定义 使一串记录,按照其中的某个或某些关键字的…...

洞察:OpenAI 全球宕机,企业应该如何应对 LLM 的不稳定性?

北京时间12月12日上午&#xff0c;OpenAI证实其聊天机器人ChatGPT正经历全球范围的宕机&#xff0c;ChatGPT、Sora及API受到影响。 OpenAI 更新事故报告称&#xff0c;已查明宕机原因&#xff0c;正努力以最快速度恢复正常服务&#xff0c;并对宕机表示歉意。 此次 OpenAI 故障…...

Git Bash Here 中文显示乱码的处理方法

在使用"open Git Bash Here"时&#xff0c;遇到中文显示乱码问题。 原因&#xff1a;通常是由于编码设置不正确导致的。 open Git Bash Here —>鼠标右击空白处&#xff0c;点击「选项」|或「Options」 在「文本」或 「Text」选项卡中&#xff0c;找到"local…...

【python因果库实战6】LaLonde 数据集

目录 LaLonde 数据集 数据 收入指示变量 教育年限的因子化 变量选择 模型 估计因果效应 未经调整的估计 LaLonde 数据集 经济学家长期以来假设培训项目可以改善参与者的劳动力市场前景。为了测试&#xff08;或证明&#xff09;这一点&#xff0c;国家支持性工作示范项…...

和Ente交流

今日去清华大学深圳国际研究生院能源环境大楼与研三师弟交流。 交流内容&#xff1a; 今年年初3月份的时候去实习&#xff0c;刚刚开始字节远程实习&#xff08;海投&#xff09;&#xff0c;然后远程了一个月&#xff0c;让去线下&#xff0c;然后就去线下待了一个月&#x…...

imx6ull qt多页面控制系统(正点原子imx系列驱动开发)

开题答辩完了也考完了四六级&#xff0c;赶紧来更新一下一个月前留下的坑吧 QAQ首先&#xff0c;因为毕业设计需要用到这些知识所以就从网络上找了一个智能车机系统&#xff0c;借鉴了一下大佬的项目思路&#xff0c;缝缝补补一个月终于完成了这一内容。 在这里先感谢从两位大佬…...

[C++]运算符重载

一、 什么是运算符重载&#xff1f; 运算符重载是 C 中的一种功能&#xff0c;它允许用户定义的类或数据类型重新定义或扩展运算符的行为&#xff0c;使运算符能够作用于用户定义的对象。 二、 通俗解释 在 C 中&#xff0c;运算符&#xff08;如 , -, *, 等&#xff09;默认…...

C++基础

01引用的本质 int a 10;/**引用本质是指针常量&#xff0c;指针指向不可更改,因此引用一旦初始化就不可以更改*自动转换为int* const ref&a;*/int &ref a;/*内部发现是引用&#xff0c;自动转换为*ref20;*/ref20; 02函数高级 2.1默认参数 #include <iostream&g…...

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现

鸿蒙项目云捐助第七讲鸿蒙App应用的首页推荐模块布局的实现 最后设置首页的推荐模块&#xff0c;参考模板如下图所示。 一、首页热门推荐模块的实现 对于热门推荐模块&#xff0c;先有上面的小标题栏&#xff0c;这里的标题栏也有一个小图标&#xff0c;首先从“百度图库”中…...

【网络安全设备系列】1、防火墙

0x00 前言 最近由于工作原因&#xff0c;需要详细如今各类网络安全设备&#xff0c;所以开了此系列文章&#xff0c;希望通过对每个网络安全设备进行整理总结&#xff0c;来详细了解各类网络安全设备作用功能以及实现原理、部署配置方法等。 0x01 定义&#xff1a;防火墙指的…...

C# 备份文件夹

C# 备份目标文件夹 方法1&#xff1a;通过 递归 或者 迭代 结合 C# 方法 参数说明&#xff1a; sourceFolder&#xff1a;源文件夹路径destinationFolder&#xff1a;目标路径excludeNames&#xff1a;源文件夹中不需备份的文件或文件夹路径哈希表errorLog&#xff1a;输出错…...

【sizeof】各种数据类型所占空间大小

各种数据类型所占空间大小 文章目录 前言 一、sizeof是什么&#xff1f; 二、使用步骤 1.整型 2.字符型 总结 前言 ‌sizeof在C语言中是一个运算符&#xff0c;用于获取数据类型或变量在内存中所占的字节数。‌它可以在编译时计算数据类型或变量的内存大小&#xff0c;而…...

水仙花数(流程图,NS流程图)

题目&#xff1a;打印出所有的100-999之间的"水仙花数"&#xff0c;并画出流程图和NS流程图。所谓"水仙花数"是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff1a;153是一个"水仙花数"&#xff0c;因为1531的三次方&#…...

wireshark捕获过滤和操作方式详解

大家觉得有用记得关注和点赞&#xff0c;谢谢。 一、Wireshark介绍 Wireshark&#xff08;前身是Ethereal&#xff09;是一个网络封包分析软件&#xff0c;目前是全球使用最广泛的开源抓包软件&#xff0c;别名小鲨鱼或者鲨鱼鳍。 网络封包分析软件的功能是截取网卡进出的网络…...

ChatGPT Search开放:实时多模态搜索新体验

点击访问 chatTools 免费体验GPT最新模型&#xff0c;包括o1推理模型、GPT4o、Claude、Gemini等模型&#xff01; ChatGPT Search&#xff1a;功能亮点解析 本次更新的ChatGPT Search带来了多项令人瞩目的功能&#xff0c;使其在搜索引擎市场中更具竞争力。 1. 高级语音模式&…...

【docker】docker swarm常用命令以及电商平台构建案例

1. 初始化Swarm集群 用于初始化一个Swarm集群&#xff0c;并将当前节点设置为Manager节点。 docker swarm init 用法&#xff1a; docker swarm init --advertise-addr <Manager节点IP>示例&#xff1a; docker swarm init --advertise-addr 192.168.1.100这会将当前节…...

3D计算机视觉概述

3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像&#xff08;像素表达&#xff…...

23. 合并 K 个升序链表(java)

题目描述&#xff1a; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff…...

与乐鑫相约 CES 2025|创新技术引领物联网与嵌入式未来

2025 国际消费电子产品展览会 (International Consumer Electronics Show, CES) 将于 2025 年 1 月 7 至 10 日在美国拉斯维加斯盛大开幕。作为全球规模最大、水准最高&#xff0c;且影响力最广的消费电子类科技盛会&#xff0c;CES 每年都吸引着全球行业领袖、开发者和技术爱好…...

MIPS指令集(一)基本操作

目录 计算机硬件的操作数 存储器操作数 常数或立即数操作数 有符号数和无符号数 指令的格式 逻辑操作 决策指令 循环 计算机硬件的操作数 先从一条C语句入手 a b c; 将其翻译为MIPS add a, b, c 其中a&#xff0c;b&#xff0c;c就是这条指令的操作数。表示将b与c…...

半导体数据分析(二):徒手玩转STDF格式文件 -- 码农切入半导体系列

一、概述 在上一篇文章中&#xff0c;我们一起学习了STDF格式的文件&#xff0c;知道了这是半导体测试数据的标准格式文件。也解释了为什么码农掌握了STDF文件之后&#xff0c;好比掌握了切入半导体行业的金钥匙。 从今天开始&#xff0c;我们一起来一步步地学习如何解构、熟…...

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前&#xff0c;让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目&#xff0c;让我们创建一个名为node-ssl -server 的目录&#xff0c;用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…...

C++中类和对象的细节原理

文章目录 一、C中的构造函数二、C中的析构函数三、两者的配合与注意事项四、C中的静态成员变量五、C中的静态成员函数六、C中普通成员函数和静态成员函数的区别七、C中的const成员变量八、C中的const 成员函数九、C中构造函数的初始化列表十、C中的浅拷贝操作十一、C中的深拷贝…...

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误&#xff1a;index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时&#xff0c;调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误&#xff1a; Model inference er…...

OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

windows和LINUX下校验文件的哈希值(MD5、SHA256)

可以通过两个文件的哈希值来对比两个文件是不是一模一样&#xff0c;有没有缺失 1、windows CertUtil -hashfile 文件路径 MD5 CertUtil -hashfile 文件路径 SHA256 2、Liunx 校验当前目录下所有文件 sha256sum . 校验指定文件名 sha256sum 文件名...

〔 MySQL 〕视图

以下是上述文章的目录&#xff1a; 一、视图概述 视图的定义 二、基本使用 创建视图查询视图修改视图影响基表查询验证删除视图 三、视图规则和限制 命名规则数量限制索引和触发器安全性ORDER BY规则与表一起使用 四、实战案例 牛客实战OJ修改基表影响视图查询验证删除…...

嵌入式硬件产品:CC254x 蓝牙升级

目录 固件更新 OAD原理 作者简介 固件更新 支持固件更新的CC2541芯片中, 包括三段代码: Boot Image Manager(BIM)、ImageA、Im...

Drag and Drop API 实现 JavaScript 中的原生拖放功能

理解什么是拖放&#xff0c;我们先做个简单的实验。鼠标移动到页面左上角“CSDN” 图片上方&#xff0c;点击左键不放开&#xff0c;拖动鼠标&#xff0c;发现图片随着鼠标移动&#xff0c;松开鼠标时&#xff0c;图片消失。 一、拖放&#xff08;Drag and Drop&#xff09;有…...

人脸检测的若干思考!!!

1.目前主要有人脸检测方法分类&#xff1f; 主要包含两类&#xff1a;传统人脸检测算法和基于深度学习的人脸检测算法。 传统人脸检测算法主要可以分为4类&#xff1a; 基于知识、模型、特征和外观的人脸检测方法&#xff1b; 基于深度学习的方法&#xff1a;基于级联CNN的人脸…...

【时间序列分析】斯皮尔曼(Spearman)相关系数理论基础及python代码实现

文章目录 1. 斯皮尔曼相关系数1.1 公式定义1.2 计算过程1.3 计算示例1.4 注意事项&#xff08;当有重复值时&#xff09; 2. 优缺点2.1 优点2.2 缺点 3. 适用场景4. Python代码实现4.1 调用scipy库 5 思考5.1 什么是单调关系&#xff1f;与线性关系的区别是什么&#xff1f;5.2…...

python | linux | ModuleNotFoundError: No module named ‘WFlib‘ |找不到模块

问题&#xff1a; (base) beautyby521-7:~/Website-Fingerprinting-Library-master$ bash scripts/NetCLR.sh Traceback (most recent call last):File "/home/beauty/Website-Fingerprinting-Library-master/exp/pretrain.py", line 8, in <module>from WFli…...

B-TREE详解

B - tree 的详细结构特点 节点结构细节 关键字存储方式&#xff1a;B - tree 节点中的关键字是按照一定顺序排列的&#xff0c;这个顺序可以是升序或者降序。例如&#xff0c;在一个以数字为关键字的 B - tree 中&#xff0c;关键字从左到右依次增大。每个关键字都有一个分隔作…...

Kotlin复习

一、Kotlin类型 1.整数 2.浮点 显示转换&#xff1a; 所有数字类型都支持转换为其他类型&#xff0c;但是转换前会检测长度。 toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double 不同进制的数字表示方法&#xff08;为了提高…...

批处理文件的创建与编辑方法

批处理命令保存在以BAT为扩展名地文本文件中&#xff0c;因此可以使用任何字处理软件创建、编辑批处理文件&#xff0c;如Word、WinHex、Editpuls等。 案例一 使用copy con命令创建批处理文件 ”copy con“是一个功能简单、易于使用的创建文本文件命令&#xff0c;命令中”con…...

Spring Boot集成Kafka:最佳实践与详细指南

文章目录 一、生产者1.引入库2.配置文件3.配置类PublicConfig.javaMessageProducer.java 4.业务处理类 三、消费者1.引入库2.配置类PublicConfig.javaMessageConsumer.java 3.业务类 一、生产者 1.引入库 引入需要依赖的jar包&#xff0c;引入POM文件&#xff1a; <depend…...

maven 中 有历史模块缓存 怎么清

Maven 在运行时会将一些数据保存在本地仓库中&#xff0c;以加快构建过程。其中一部分是项目的依赖项&#xff0c;还有就是“历史模块缓存”。这些缓存信息保存在本地仓库的 _remote.repositories 文件中。 解决方案&#xff1a; 手动删除缓存文件&#xff1a; 进入你的Maven本…...

云计算HCIP-OpenStack04

书接上回&#xff1a; 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务&#xff0c;最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…...

【信息系统项目管理师-论文真题】2015下半年论文详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

C# 面试中常见递归算法

前言 今天我们主要总结一下C#面试中常见递归算法。 C#经典十大排序算法&#xff08;完结&#xff09; C#递归算法计算阶乘的方法 一个正整数的阶乘&#xff08;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;并且0的阶乘为1。自然数n的阶乘写作n!。180…...

qemu源码解析【02】qom基本概念

目录 qemu源码解析【02】qom基本概念参考资料基本数据结构TypeImplObjectClassObjectTypeInfo qemu源码解析【02】qom基本概念 参考资料 https://blog.csdn.net/u011364612/article/details/53485856qemu中为了模拟各种虚拟设备和总线&#xff0c;采用了面向对象的思想&#…...

C++算法第八天

本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 第三题 题目链接 题目展示 代码原理 代码编写 第一题 题目链接 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目展示…...

大语言模型的常用微调方法

文章目录 数据构造与清洗数据构造方法1.基于 Self-Instruct 方法的数据构造2.面向结构化知识的数据构造 数据清洗方法1.IFD 指标法2. MoDS 方法 2.2 分词器构造2.2.1 分词器概述BPE 分词器WordPiece 分词器Unigram 分词器 2.3 大型语言模型的微调方法前缀调优提示调优P-Tuning …...

安卓获取所有可用摄像头并指定预览

在Android设备中&#xff0c;做预览拍照的需求的时候&#xff0c;我们会指定 CameraSelector DEFAULT_FRONT_CAMERA前置 或者后置CameraSelector DEFAULT_BACK_CAMERA 如果你使用的是平板或者工业平板&#xff0c;那么就会遇到多摄像头以及外置摄像头问题&#xff0c;简单的指…...