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

数据结构《图》

数据结构《图论》

图的性质

一、无向图(Undirected Graph)

  1. 定义
  • 由一组顶点(Vertex)和一组无向边(Edge)构成。

  • 每条无向边用一条无方向的线段连接两个顶点,记为 ( (u, v) ),其中 ( u ) 和 ( v ) 是顶点,且 ( u \neq v )。若允许自环,可表示为 ( (u, u) )。

    1. 核心性质
      性质 定义与特点

顶点集 记为 ( V ),大小为 ( V )。
边集 记为 ( E ),每条边是无序对 ( {u, v} \subseteq V ),大小为 ( E )。若允许多重边,则边可重复出现。
度(Degree) 顶点 ( u ) 的度为与之相连的边的数量,即 ( d(u) = \text{number of edges incident to } u )。无向图中每个边贡献度数 +1。
简单图 不含自环且不含多重边的无向图。
连通性 若两个顶点之间存在至少一条路径,则称它们是连通的;否则属于不同的连通分量(Connected Component)。
桥(Bridge) 若删除某条边后图的连通分量数目增加,则该边为桥。桥是图中唯一的连接两个部分的边。
割点(Articulation Point) 删除该顶点后图的连通分量数目增加,则该顶点为割点。

  1. 特殊类型
  • 树(Tree):无环且连通的无向图,满足 ( E = V - 1 )。
  • 森林(Forest):若干棵互不连通的树的集合。
  • 完全图(Complete Graph):每对顶点之间均存在一条边,记为 ( K_n )(( n ) 个顶点)。
  • 环图(Cycle Graph):所有顶点构成一个单一环,满足 ( E = V )。

二、有向图(Directed Graph)

  1. 定义
  • 由一组顶点和一组有向边(Directed Edge)构成。

  • 每条有向边用箭头表示方向,记为 ( (u, v) ),其中 ( u ) 是起点(Source),( v ) 是终点(Target)。允许自环(( u = v ))和多重边。

    1. 核心性质
      性质 定义与特点

顶点集 记为 ( V ),大小为 ( V )。
边集 记为 ( E ),每条边是有序对 ( (u, v) \subseteq V \times V ),允许重复边(多重边)。
入度(InDegree) 顶点 ( v ) 的入度为指向它的边的数量,即 ( d_{\text{in}}(v) = \sum_{u \in V} \text{number of edges } (u, v) )。
出度(OutDegree) 顶点 ( u ) 的出度为从它出发的边的数量,即 ( d_{\text{out}}(u) = \sum_{v \in V} \text{number of edges } (u, v) )。
强连通分量(SCC) 若有向图中任意两个顶点均可互相到达,则该子图为强连通分量。强连通分量是极大强连通子图。
弱连通分量 将有向图视为无向图后,其连通性称为弱连通性。
路径与环 路径:顶点序列 ( v_0 \rightarrow v_1 \rightarrow \cdots \rightarrow v_k ),边方向一致。
环:起点和终点相同的路径,且至少包含一条边。

  1. 特殊类型
  • 有向树(DAG中的树结构):父节点到子节点的单向边构成,无环。
  • 竞赛图(Tournament Graph):每对顶点之间恰好存在一条有向边。
  • 完全有向图(Complete Directed Graph):每对顶点之间存在两条方向相反的有向边,记为 ( \overleftrightarrow{K_n} )。
  • 欧拉回路与路径:
    - 欧拉回路:存在一条回路,遍历每条边恰好一次且起点=终点,需满足所有顶点的入度=出度。
    - 欧拉路径:存在一条路径,遍历每条边恰好一次且起点≠终点,需满足恰有一个顶点出度=入度+1(起点),另一个顶点入度=出度+1(终点)。

三、无向图 vs 有向图的对比
对比维度 无向图 有向图

边方向性 边无方向,( (u, v) \equiv (v, u) )。 边有方向,( (u, v) \neq (v, u) )。
度 每个边贡献顶点度数 +1。 分为入度和出度,每条边仅贡献起点的出度 +1 和终点的入度 +1。
连通性 弱连通性等价于无向图的连通性。 强连通分量是更严格的连通条件。弱连通性需忽略边方向后判断。
环的存在性 环至少需要三个顶点(三角形环)。 可以存在自环(单个顶点的环)。
典型算法 BFS/DFS、最小生成树(Prim/Kruskal)、最短路径(Dijkstra未加权)。 Tarjan算法找强连通分量、BellmanFord检测负权环、拓扑排序。


四、数学表示与存储

  1. 数学表示
  • 邻接矩阵(Adjacency Matrix):

    • 无向图:对称矩阵 ( A_{uv} = A_{vu} )。
    • 有向图:非对称矩阵 ( A_{uv} ) 表示边 ( u \rightarrow v ) 是否存在。
  • 邻接表(Adjacency List):

    • 无向图:每个顶点维护相邻顶点列表,边存储两次(如 ( u \rightarrow v ) 和 ( v \rightarrow u ))。
    • 有向图:每个顶点维护出边列表,边仅存储一次。
    1. 存储复杂度
      数据结构 空间复杂度(最坏情况)

邻接矩阵 ( O(V^2) )
邻接表 ( O(V + E) )


五、应用场景

  • 无向图:社交网络关系建模、交通路线规划、分子结构分析。
  • 有向图:网页链接分析(PageRank)、任务调度依赖关系、神经网络建模。

查考点


一、基础概念与性质

  1. 顶点与边

    • 顶点集 ( V ) 和边集 ( E ),边的表示为无序对 ( {u, v} )。
    • 简单图:无自环(边 ( {u, u} ) 不允许)且无多重边。
    • 多重图:允许多条边连接同一对顶点。
  2. 度(Degree)

    • 每个顶点的度数 ( d(u) = \text{与该顶点相连的边数} )。
    • 奇点与偶点:度数为奇数的顶点称为奇点,否则为偶点。
    • 握手定理:图中所有顶点的度数之和为偶数(每条边贡献两次度数)。
  3. 连通性

    • 连通图:任意两个顶点之间存在至少一条路径。
    • 连通分量:图的极大连通子图,非连通图的每个子图都是一个连通分量。
    • 强连通分量(仅适用于有向图):无向图的弱连通性即忽略方向后的连通性。

二、图的遍历

  1. 广度优先搜索(BFS)

    • 层序遍历,从起点出发逐层扩展,记录访问顺序。
    • 应用:寻找最短路径(无权图)、连通分量标记。
  2. 深度优先搜索(DFS)

    • 递归或栈实现,优先探索某一分支到底。
    • 应用:检测环、生成树、拓扑排序(需配合有向图)。

三、特殊图结构

  1. 树与森林

    • 树:无环且连通的无向图,满足 ( E = V - 1 )。
    • 森林:多个互不连通的树的集合。
    • 二叉树:每个节点最多有两个子节点(左、右子节点),前序/中序/后序遍历。
  2. 完全图与环图

    • 完全图:每对顶点间均有一条边(( K_n ))。
    • 环图:所有顶点构成单一环(( C_n ),满足 ( E = V ))。
  3. 欧拉回路与路径

    • 欧拉回路:存在一条回路经过所有边恰好一次,条件是所有顶点度数为偶数。
    • 欧拉路径:存在一条路径经过所有边恰好一次,条件是恰有两个奇点(作为起点和终点)。

四、经典算法

  1. 最小生成树(MST)

    • Prim算法:贪心策略,每次选择当前顶点到生成树的最小边。
    • Kruskal算法:基于边权排序,使用并查集(Union-Find)避免环。
  2. 最短路径算法

    • Dijkstra算法:适用于无权图或边权非负的情况,找到单源最短路径。
    • Floyd-Warshall算法:计算所有顶点对之间的最短路径(多源最短路径)。
  3. 连通分量统计

    • 使用DFS/BFS遍历整个图,标记未访问的顶点,统计连通分量个数。

五、高频题型与解题思路

  1. 理论题

    • 判断图的连通性:通过BFS/DFS遍历后,检查是否所有顶点都被访问。
    • 证明握手定理:利用边对度数的贡献进行归纳或数学推导。
  2. 编程题

    • 构建图的邻接表:无向图需为每条边存储两次(如 ( u \rightarrow v ) 和 ( v \rightarrow u ))。
    • 求最小生成树:实现Kruskal算法(需排序边并用并查集去重)。
    • 检测欧拉回路:统计所有顶点度数是否均为偶数。
  3. 应用题

    • 交通路网建模:城市作为顶点,道路作为边,求解最短路径或最小生成树。
    • 社交网络分析:用户关系建模为无向图,寻找连通分量或社区划分。

六、易错点总结

  1. 无向图的边存储:邻接表中每条边需双向存储,邻接矩阵需保证对称性。
  2. 连通分量与强连通分量:无向图的连通分量无需考虑方向,而有向图的强连通分量需严格满足双向可达。
  3. 度数计算:自环边贡献度数 +1,多重边需逐条计数。

七、推荐练习

  1. 手写代码实现:
    • BFS/DFS遍历无向图。
    • Kruskal算法生成最小生成树。
  2. 在线平台题目:
    • LeetCode 1274. Minimum Window Substring(需图遍历思想)。
    • 牛客网 1228. 括号生成(树结构的应用)。

通过掌握上述知识点并配合大量练习,可以系统性地应对无向图相关的理论考察和编程问题。

#include <stdio.h>
#include <stdbool.h>#define MAX_VERTICES 4 // 定义最大顶点数// 定义图的结构体
typedef struct {int numVertices; // 顶点数bool adjMatrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵char vertexNames[MAX_VERTICES]; // 顶点名称
} Graph;// 函数声明
void initializeGraph(Graph* graph, int numVertices, char vertexNames[]);
void addEdge(Graph* graph, int src, int dest);
void printAdjMatrix(const Graph* graph); // 使用 const 防止修改// 初始化图
void initializeGraph(Graph* graph, int numVertices, char vertexNames[]) {graph->numVertices = numVertices;// 初始化顶点名称for (int i = 0; i < numVertices; i++) {graph->vertexNames[i] = vertexNames[i];}// 初始化邻接矩阵for (int i = 0; i < numVertices; i++) {for (int j = 0; j < numVertices; j++) {graph->adjMatrix[i][j] = false; // 初始化为 false,表示没有边}}
}// 添加边
void addEdge(Graph* graph, int src, int dest) {// 无向图,需要对称设置graph->adjMatrix[src][dest] = true;graph->adjMatrix[dest][src] = true;
}// 打印邻接矩阵
void printAdjMatrix(const Graph* graph) {printf("邻接矩阵:\n");for (int i = 0; i < graph->numVertices; i++) {for (int j = 0; j < graph->numVertices; j++) {printf("%d ", graph->adjMatrix[i][j]);}printf("\n");}
}int main() {// 定义图的顶点名称char vertexNames[MAX_VERTICES] = { 'A', 'B', 'C', 'D' };// 创建图并初始化Graph graph;initializeGraph(&graph, MAX_VERTICES, vertexNames);// 添加边addEdge(&graph, 0, 1); // A - BaddEdge(&graph, 0, 2); // A - CaddEdge(&graph, 1, 3); // B - DaddEdge(&graph, 2, 3); // C - D// 打印邻接矩阵printAdjMatrix(&graph);return 0;
}

图的表示

在代码中,图是通过邻接矩阵表示的。邻接矩阵是一个二维数组 adjMatrix,其中:

  • adjMatrix[i][j] = true 表示顶点 i 和顶点 j 之间有一条边。
  • adjMatrix[i][j] = false 表示顶点 i 和顶点 j 之间没有边。

对于无向图,邻接矩阵是对称的,即 adjMatrix[i][j] = adjMatrix[j][i]


顶点编号

在代码中,顶点被编号为:

  • A → 0
  • B → 1
  • C → 2
  • D → 3

添加边的操作

addEdge 函数的定义如下:

void addEdge(Graph *graph, int src, int dest) {// 无向图,需要对称设置graph->adjMatrix[src][dest] = true;graph->adjMatrix[dest][src] = true;
}

它的作用是在邻接矩阵中设置两个顶点之间的边。由于是无向图,需要同时设置 adjMatrix[src][dest]adjMatrix[dest][src]


具体操作分析

1. 添加边 A - B
addEdge(&graph, 0, 1); // A - B
  • src = 0(A),dest = 1(B)。
  • 设置 adjMatrix[0][1] = true,表示 A 和 B 之间有一条边。
  • 设置 adjMatrix[1][0] = true,表示 B 和 A 之间有一条边。

邻接矩阵更新为:

A [ 0, 1, 0, 0 ]
B [ 1, 0, 0, 0 ]
C [ 0, 0, 0, 0 ]
D [ 0, 0, 0, 0 ]
2. 添加边 A - C
addEdge(&graph, 0, 2); // A - C
  • src = 0(A),dest = 2(C)。
  • 设置 adjMatrix[0][2] = true,表示 A 和 C 之间有一条边。
  • 设置 adjMatrix[2][0] = true,表示 C 和 A 之间有一条边。

邻接矩阵更新为:

A [ 0, 1, 1, 0 ]
B [ 1, 0, 0, 0 ]
C [ 1, 0, 0, 0 ]
D [ 0, 0, 0, 0 ]
3. 添加边 B - D
addEdge(&graph, 1, 3); // B - D
  • src = 1(B),dest = 3(D)。
  • 设置 adjMatrix[1][3] = true,表示 B 和 D 之间有一条边。
  • 设置 adjMatrix[3][1] = true,表示 D 和 B 之间有一条边。

邻接矩阵更新为:

A [ 0, 1, 1, 0 ]
B [ 1, 0, 0, 1 ]
C [ 1, 0, 0, 0 ]
D [ 0, 1, 0, 0 ]
4. 添加边 C - D
addEdge(&graph, 2, 3); // C - D
  • src = 2(C),dest = 3(D)。
  • 设置 adjMatrix[2][3] = true,表示 C 和 D 之间有一条边。
  • 设置 adjMatrix[3][2] = true,表示 D 和 C 之间有一条边。

邻接矩阵更新为:

A [ 0, 1, 1, 0 ]
B [ 1, 0, 0, 1 ]
C [ 1, 0, 0, 1 ]
D [ 0, 1, 1, 0 ]

最终邻接矩阵

经过上述操作后,邻接矩阵如下:

    A  B  C  D
A [ 0, 1, 1, 0 ]
B [ 1, 0, 0, 1 ]
C [ 1, 0, 0, 1 ]
D [ 0, 1, 1, 0 ]

可视化图结构

根据邻接矩阵,图的结构可以可视化如下:

A -- B
| \  |
|  \ |
C -- D
  • A 与 B、C 相连。
  • B 与 A、D 相连。
  • C 与 A、D 相连。
  • D 与 B、C 相连。

总结

addEdge 函数通过修改邻接矩阵来表示顶点之间的边。对于无向图,需要同时设置 adjMatrix[src][dest]adjMatrix[dest][src]。通过多次调用 addEdge,可以逐步构建出完整的图结构。

邻接矩阵的算法分析

邻接矩阵是图的一种常见表示方法,特别适用于稠密图(即边数接近顶点数平方的图)。以下是对邻接矩阵的算法分析以及优劣分析,从时间复杂度、空间复杂度、适用场景等方面进行详细科学分析。


1. 邻接矩阵的定义

邻接矩阵是一个二维数组 matrix,其中:

  • matrix[i][j] = 1(或权重值)表示顶点 i 和顶点 j 之间有一条边。
  • matrix[i][j] = 0(或无穷大)表示顶点 i 和顶点 j 之间没有边。

对于无向图,邻接矩阵是对称的;对于有向图,邻接矩阵不一定对称。


2. 算法分析

(1) 空间复杂度

  • 邻接矩阵的空间复杂度为 O(V²),其中 V 是顶点数。
  • 无论图中实际有多少条边,邻接矩阵都需要存储 V × V 个元素。
  • 对于稀疏图(边数远小于顶点数平方),邻接矩阵会浪费大量空间。

(2) 时间复杂度

查询两个顶点之间是否有边
  • 时间复杂度为 O(1)
  • 直接访问 matrix[i][j] 即可判断顶点 i 和顶点 j 之间是否有边。
遍历某个顶点的所有邻居
  • 时间复杂度为 O(V)
  • 需要遍历该顶点对应的整行或整列,检查哪些位置的值为 1
添加或删除一条边
  • 时间复杂度为 O(1)
  • 直接修改 matrix[i][j]matrix[j][i](无向图)即可。
初始化邻接矩阵
  • 时间复杂度为 O(V²)
  • 需要初始化一个 V × V 的二维数组。

3. 优劣分析

(1) 优点

  1. 查询边的存在性高效

    • 时间复杂度为 O(1),适合需要频繁查询边是否存在的场景。
  2. 适合稠密图

    • 当图的边数接近顶点数平方时,邻接矩阵的空间利用率较高。
  3. 易于实现

    • 邻接矩阵的实现简单直观,适合初学者理解和实现。
  4. 支持快速修改

    • 添加、删除或修改边的时间复杂度为 O(1)
  5. 适合存储带权图

    • 邻接矩阵可以直接存储边的权重,适合需要处理带权图的场景。

(2) 缺点

  1. 空间复杂度高

    • 空间复杂度为 O(V²),对于稀疏图会浪费大量空间。
  2. 遍历邻居效率低

    • 遍历某个顶点的所有邻居需要 O(V) 时间,即使该顶点的实际邻居很少。
  3. 不适合动态图

    • 如果图的顶点数动态变化,邻接矩阵需要重新分配和复制数据,效率较低。
  4. 无法高效存储稀疏图

    • 对于稀疏图,邻接表(Adjacency List)是更优的选择。

4. 适用场景

(1) 适合使用邻接矩阵的场景

  1. 稠密图

    • 边数接近顶点数平方的图,邻接矩阵的空间利用率高。
  2. 需要频繁查询边的存在性

    • 例如,某些图算法需要快速判断两个顶点是否相邻。
  3. 带权图

    • 邻接矩阵可以直接存储边的权重,适合处理带权图。
  4. 小规模图

    • 当顶点数较少时,邻接矩阵的空间开销可以接受。

(2) 不适合使用邻接矩阵的场景

  1. 稀疏图

    • 边数远小于顶点数平方的图,邻接矩阵会浪费大量空间。
  2. 大规模图

    • 当顶点数很大时,邻接矩阵的空间开销会变得不可接受。
  3. 动态图

    • 顶点数动态变化的图,邻接矩阵的调整成本较高。

5. 与邻接表的对比

特性邻接矩阵邻接表
空间复杂度O(V²)O(V + E)
查询边的存在性O(1)O(degree(V))
遍历邻居O(V)O(degree(V))
添加边O(1)O(1)
删除边O(1)O(degree(V))
适合的图类型稠密图稀疏图
实现复杂度简单较复杂

6. 总结

  • 邻接矩阵适合稠密图、带权图以及需要频繁查询边存在性的场景。
  • 邻接表适合稀疏图、大规模图以及需要高效遍历邻居的场景。
  • 在实际应用中,应根据图的特点(稠密或稀疏)和操作需求(查询、遍历、修改等)选择合适的表示方法。

相关文章:

数据结构《图》

数据结构《图论》 图的性质 一、无向图&#xff08;Undirected Graph&#xff09; 定义 由一组顶点&#xff08;Vertex&#xff09;和一组无向边&#xff08;Edge&#xff09;构成。 每条无向边用一条无方向的线段连接两个顶点&#xff0c;记为 ( (u, v) )&#xff0c;其中…...

WPF实现打印机控制及打印

在WPF中实现打印机控制和打印功能&#xff0c;通常需要使用System.Printing命名空间中的类来管理打印机和打印任务。以下是一个简单的示例&#xff0c;展示如何在WPF应用程序中实现打印功能。 1. 添加必要的引用 首先&#xff0c;确保在项目中引用了System.Printing命名空间。…...

springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作

文章目录 注入Servlet, Filter, Listener官方文档基本介绍使用注解方式注入使用RegistrationBean方法注入DispatcherServlet详解 内置Tomcat配置和切换基本介绍内置Tomcat配置通过application.yml完成配置通过类配置 切换Undertow 数据库操作 JdbcHikariDataSource需求分析应用…...

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

从传统到轻量级5G:网络架构演变与优化路径

轻量级5G​​​​ 随着5G技术的不断发展&#xff0c;通信网络架构正经历着前所未有的变革。传统的5G核心网架构虽然在性能和容量方面表现出色&#xff0c;但在灵活性、部署效率以及成本控制方面却面临一些挑战。为了应对日益复杂的通信需求&#xff0c;轻量级5G核心网成为了一种…...

独立开发者如何寻找产品设计灵感

作为独立开发者&#xff0c;面对激烈的市场竞争和不断变化的用户需求&#xff0c;寻找优秀的产品设计灵感是至关重要的一步。以下是一篇关于独立开发者如何寻找产品设计灵感的教程&#xff0c;希望能为你提供一些有益的指导。 一、观察日常生活 1.1 关注身边的小问题 在日常生…...

技术解析 | 适用于TeamCity的Unreal Engine支持插件,提升游戏构建效率

龙智是JetBrains授权合作伙伴、Perforce授权合作伙伴&#xff0c;为您提供TeamCity、Perforce Helix Core等热门的游戏开发工具及一站式服务 TeamCity 是游戏开发的热门选择&#xff0c;大家选择它的原因包括支持 Perforce、可以进行本地安装&#xff0c;并提供了多种配置选项。…...

uniapp h5端和app端 使用 turn.js

前提:添加页后,添加页与当前页会重叠在一起,不知道为什么,没有找到解决办法 1.h5端 <template><view class"container"><view id"flipbook"><view class"page page1">Page 1</view><view class"page pag…...

智慧校园系统在学生学习与生活中的应用

随着科技的快速发展&#xff0c;智慧校园系统逐渐成为现代教育不可或缺的一部分。它整合了先进的信息技术、物联网技术以及人工智能等&#xff0c;旨在构建一个全面、智能、个性化的学习与生活环境。对于学生而言&#xff0c;这一系统不仅能够极大地提高学习效率&#xff0c;还…...

umi: valtio的使用

一、基本用法 import { proxy, useSnapshot } from umijs/max;// 1、定义数据 const state proxy({ count: 33 });export default () > {// 2、使用数据const snap useSnapshot(state);function increaseCount() {state.count 1;}return (<><h1>{snap.count}…...

什么是矩阵账号?如何高效运营tiktok矩阵账号

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​​‌‌​‍‌​‌​​‌‌‌‍‌​​‌‌​‌​‍‌​‌​​‌‌‌‍‌​‌‌‌​​‌‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍‌…...

C语言.h头文件的写法

头文件的内容 #ifndef __SEQUENCE_LIST_H // 定义以防止递归包含 #define __SEQUENCE_LIST_H // (1)、其它头文件 #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <stdbool.h> // (2)、宏定义(函数、变量、常量) // (3)、…...

【Day44 LeetCode】图论问题 Ⅱ

一、图论问题 Ⅱ 1、岛屿的最大面积 这题和上一篇博客求岛屿数量如出一辙&#xff0c;都是要找出所有岛屿&#xff0c;深度优先搜索代码如下&#xff1a; # include<iostream> # include<vector>using namespace std;int dfs(vector<vector<int>> …...

设计模式教程:责任链模式(Chain of Responsibility Pattern)

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种常用的设计模式&#xff0c;它属于行为型模式&#xff0c;主要解决的是多个对象处理一个请求时&#xff0c;如何解耦请求的发送者和接收者&#xff0c;以及如何将请求的处理职责分配给不同的对象。 1…...

java网络编程

计算机网络基础 网络编程的目的就是直接或间接地通过网络协议与其他计算机进行通信。 在 Java 语言中包含网络编程所需要的各种类&#xff0c;编程人员只需要创建这些类的对象&#xff0c;调用相应的方法&#xff0c;就可以进行网络应用程序的编写。 要进行网络程序的编写&am…...

计算机网络面试知识点总结

目录 1. 计算机网络的基本知识点2. OSI 七层模型3. TCP/IP 四层模型4. TCP 和 UDP4.1 TCP 协议4.2 TCP 流量控制4.3 TCP 拥塞控制4.4 TCP 三次握手4.5 TCP 四次挥手4.6 TCP 粘包问题4.7 TCP Socket交互流程4.8 UDP 协议以及和 TCP 协议的不同 5. HTTP协议5.1 HTTP 请求方法以及…...

ubuntu22.4搭建单节点es8.1

下载对应的包 elasticsearch-8.1.1-linux-x86_64.tar.gz 创建es租户 groupadd elasticsearc useradd elasticsearch -g elasticsearch -p elasticsearch chmod uw /etc/sudoers chmod -R elasticsearch:elasticsearch elasticsearch 修改配置文件 vim /etc/sysctl.conf vm…...

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制&#xff1f;2.2 如何将注意力机制集成到YOLOv8中&#xff1f;2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块&#xff1f;3.3 效果分析 4. 卷积操作的优化4.1 卷积操…...

【Altium Designer】差分对等长设置以及绕线

在Altium Designer 17中设置差分对的等差规则及绕等长操作&#xff0c;需结合规则配置与交互式布线工具完成。以下是详细操作步骤&#xff1a; 目录 一、差分对等差规则设置 1. 原理图端差分对定义 2. PCB端差分规则配置 二、差分对等长绕线操作 1. 差分对布线 2. 交互式…...

BFS 和 DFS(深度优先搜索、广度优先搜索)

深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;是两种常用的图遍历算法&#xff0c;用于解决图相关的问题。它们在搜索问题中具有广泛的应用&#xff0c;如路径搜索、连通性检测等。 以下是具体区别&#xff1a; &#xff08;图片引自&am…...

汽车免拆诊断案例 | 2013 款奔驰 S300L 车起步时车身明显抖动

故障现象  一辆2013款奔驰S300L车&#xff0c;搭载272 946发动机&#xff0c;累计行驶里程约为15万km。车主反映&#xff0c;将挡位置于D挡&#xff0c;稍微释放一点制动踏板&#xff0c;车辆蠕动时车身明显抖动&#xff0c;类似气缸失火时的抖动&#xff0c;又类似手动变速器…...

基于UnrealEngine(UE5)的太空探索

视频部分可参见&#xff1a;https://www.bilibili.com/video/BV1JWA8eSEVg/ 中国 天宫号 空间站 人造卫星可视化 星链卫星可视化 小行星分布及运动轨迹可视化 月球基地 可视化 八大行星轨道 太阳系宜居带可视化 阿波罗8号拍摄的地球升起 谷神星模型及轨迹可视化 星座可视化 十…...

HTML Application(hta)入门教程

简介 HTA是HTML Application的缩写&#xff0c;又称为HTML应用程序。 hta是一个可执行文件&#xff0c;双击可以直接运行 hta与html非常相似&#xff0c;可直接将文件后缀改为.hta来获得HTA格式的文件。 支持VBS和JavaScript html的权限被限制在网页浏览器内&#xff0c;只有操…...

IOS UITextField 无法隐藏键盘问题

设置UITextField 键盘按钮返回键为“完成”&#xff0c;即return key 设置done .m代码设置代理 //设置代理协议 UITextFieldDelegate&#xff0c; self.mobileTextField.delegate self; ///点击完成键隐藏键盘 - (BOOL)textFieldShouldReturn:(UITextField *)textField{//取…...

ES6箭头函数:基础与进阶指南

目录 引言 一、基础篇&#xff1a;核心语法与特性 1.1 语法革新 1.2 this绑定机制 二、进阶篇&#xff1a;深度特性解析 2.1 闭包中的this继承 2.2 限制与注意事项 三、实践指南&#xff1a;应用场景与陷阱规避 3.1 推荐使用场景 3.2 应避免的场景 四、性能考量 结语…...

AI赋能编程:PyCharm与DeepSeek的智能开发革命

在这个智能化的时代&#xff0c;人工智能技术正在深刻地改变着我们的工作方式&#xff0c;尤其是在编程领域。无论是初学者还是资深开发者&#xff0c;都希望借助更高效的工具和智能助手来提升生产力、优化代码质量。今天&#xff0c;我们将聚焦于两个强大的工具&#xff1a;Py…...

在Spring Boot中如何使用Freemaker模板引擎

在 Spring Boot 中使用 FreeMarker 模板引擎可以帮助你创建动态的 Web 页面。以下是详细的步骤和示例代码,介绍如何在 Spring Boot 项目里集成和使用 FreeMarker。 1. 添加依赖 如果你使用的是 Maven 项目,需要在 pom.xml 文件中添加 FreeMarker 相关依赖。Spring Boot 提供…...

【论文精读】VLM-AD:通过视觉-语言模型监督实现端到端自动驾驶

论文地址&#xff1a; VLM-AD: End-to-End Autonomous Driving through Vision-Language Model Supervision 摘要 人类驾驶员依赖常识推理来应对复杂多变的真实世界驾驶场景。现有的端到端&#xff08;E2E&#xff09;自动驾驶&#xff08;AD&#xff09;模型通常被优化以模仿…...

【HarmonyOS Next】鸿蒙应用进程和线程详解

【HarmonyOS Next】鸿蒙应用进程和线程详解 一、前言 进程的定义&#xff1a; 进程是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。 在鸿蒙系统中&#xff0c;一个应用下会有三类进程&#xff1a; (1) 主进程&#xff0c; (2) ExtensionAbility进程&#xff…...

基于深度学习的信号滤波:创新技术与应用挑战

一、引言 1.1 研究背景 随着科技的不断发展&#xff0c;信号处理领域面临着越来越复杂的挑战。在众多信号处理技术中&#xff0c;基于深度学习的信号滤波技术逐渐崭露头角&#xff0c;成为研究的热点。 基于深度学习的信号滤波在信号处理领域具有至关重要的地位。如今&#…...

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;点击这里立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 前言 – 人工智能教程https://www.captainbed.cn/l…...

什么是方法

System.out.println(),那么它是什么呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建&#xff0c;在其他地方被使用 这段Java代码出现错误的原因在于&#xff0c;在…...

Python strip() 方法详解:用途、应用场景及示例解析(中英双语)

Python strip() 方法详解&#xff1a;用途、应用场景及示例解析 在 Python 处理字符串时&#xff0c;经常会遇到字符串前后存在多余的空格或特殊字符的问题。strip() 方法就是 Python 提供的一个强大工具&#xff0c;专门用于去除字符串两端的指定字符。本文将详细介绍 strip(…...

合并区间(56)

56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if (intervals.size() 1) {return intervals;}//现根据每一项的第一个值&#…...

如何保存爬虫获取商品评论的数据?

保存爬取的评论数据是爬虫项目中的一个重要环节。根据需求&#xff0c;你可以选择将数据保存为本地文件&#xff08;如CSV、JSON、TXT&#xff09;&#xff0c;或者存储到数据库&#xff08;如MySQL、MongoDB等&#xff09;。以下是几种常见的数据保存方式及其示例代码。 1. 保…...

使用docker配置PostgreSQL

配置docker阿里云镜像仓库 国内使用docker hub拉取镜像比较慢&#xff0c;所以首先配置个人的镜像仓库。 阿里云的个人镜像仓库是免费的&#xff0c;对个人来说足够用。 具体操作参考阿里云官方链接 。 关于个人镜像仓库的使用参考链接。 配置完个人镜像仓库后将公网配置到doc…...

阿里云虚机的远程桌面登录提示帐户被锁定了

提示由于安全原因&#xff0c;帐户被锁定。 阿里云虚机ECS的远程桌面登录提示帐户被锁定了&#xff0c;只能登录阿里云处理 阿里云-计算&#xff0c;为了无法计算的价值 需选择通过VNC连接 然后计算机管理&#xff0c;解除帐户锁定即可。...

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)...

抽象类、接口、枚举

一、抽象类 1.1 简介 作为父类&#xff0c;里面的方法逻辑不能满足任何一个子类的需求&#xff0c;提供的逻辑根本就用不上&#xff0c;那么就不添加方法体了&#xff0c;此时这个方法需要 使用关键字abstract来修饰&#xff0c;表示为抽象方法&#xff0c;而抽象方法所在的类…...

GO系列-IO 文件操作

os io 判断文件是否存在 func fileExist(filePath string) (bool, error) {_, err : os.Stat(filePath)if err nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath} } 读取文件内容 func readFileContext(…...

【前端】使用WebStorm创建第一个项目

文章目录 前言一、步骤1、启动2、创建项目3、配置Node.js4、运行项目 二、Node.js介绍 前言 根据前面文章中记录的步骤&#xff0c;已经安装好了WebStorm开发软件&#xff0c;接下来我们就用这个IDE开发软件创建第一个项目。 一、步骤 1、启动 启动软件。 2、创建项目 新建…...

自定义类型:结构体,枚举,联合

结构体 结构体的基本声明 基础知识&#xff1a;结构是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量。 //学生 struct Stu {//学生的相关信息char name[20];int age; }s1,s2; //s1,s2是直接创建的结构体变量&#xff08;全局变…...

柠檬水找零(力扣860)

这道题的贪心很简单&#xff0c;就是体现在对于20元的找零上。根据题意&#xff0c;20元有两种找零方式&#xff1a;1.找一张5元和一张10元&#xff1b;2.找3张5元。但是5元比较万能&#xff0c;因为无论是10还是20都需要用5元来找零&#xff0c;所以我们优先考虑第一种找零方式…...

sprintf和sscanf的用法和区别

sprintf和sscanf是C语言中常用的字符串处理函数&#xff0c;它们各自有不同的用途和用法。 1、sprintf的用法 sprintf函数主要用于将数据格式化为字符串并存储在指定的缓冲区中。其函数原型为&#xff1a; int sprintf(char *str, const char *format, ...); str&#xff1a…...

deepseek自动化代码生成

使用流程 效果第一步&#xff1a;注册生成各种大模型的API第二步&#xff1a;注册成功后生成API第三步&#xff1a;下载vscode在vscode中下载agent&#xff0c;这里推荐使用cline 第四步&#xff1a;安装完成后&#xff0c;设置模型信息第一步选择API provider&#xff1a; Ope…...

静态时序分析:时钟组间的逻辑独立、物理独立和异步的区别

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 当设计中存在多个时钟&#xff08;同步或异步&#xff09;时&#xff0c;该如何使用SDC命令约束设计呢&#xff1f;本文就将对此进行讨论。 逻辑独立 例1 多个时钟完全逻辑独立 图1 逻辑…...

深入HBase——数据结构与算法

引入 通过前面的文章&#xff0c;我们对HBase已经有了基本认识&#xff0c;下面我们从HBase最核心的算法和数据结构进一步深入HBase。 HBase的一个列簇&#xff08;Column Family&#xff09;本质上就是一棵LSM树&#xff08;Log-Structured Merge-Tree&#xff09;​。LSM树…...

学习Linux准备2

使用win10系统带的wsl配置ubuntu系统&#xff0c;通过wsl功能我们可以更简单更轻松的获得Linux系统环境。 首先开启Windows自带的wsl功能 打开控制面板&#xff0c;选中启用或关闭Windows功能 这里我们点击进入 将上图红√点击上&#xff0c;点击确定&#xff0c;然后重新启动…...

MATLAB图像处理:图像分割方法

图像分割将图像划分为具有特定意义的子区域&#xff0c;是目标检测、医学影像分析、自动驾驶等领域的核心预处理步骤。本文讲解阈值分割、边缘检测、区域生长、聚类分割、基于图的方法等经典与前沿技术&#xff0c;提供MATLAB代码实现。 目录 1. 图像分割基础 2. 经典分割方…...

什么是“可迭代”

在 Python 中&#xff0c;“可迭代”&#xff08;Iterable&#xff09;是一个非常重要的概念&#xff0c;它指的是任何可以被逐个访问其元素的对象。换句话说&#xff0c;如果一个对象支持迭代操作&#xff08;比如可以通过 for 循环逐个访问其元素&#xff09;&#xff0c;那么…...