图深度学习——2.图的理论知识

1.图

1.1 图的定义

图是由节点(顶点)和边构成的数学结构。图用于表示对象之间的关系,其中节点表示对象,边表示对象之间的关系。

一个图,记为 G = <V, E> ,它包括以下两个要素:

        1.节点(顶点)(Vertices):表示图中的对象或实体。通常用 V = {v1, v2, v3, …} 表示图的节点集合。

        2.边(Edges):表示对象之间的关系。通常用E = {e1, e2, e2,  …}表示图的边集合。也可用两个节点表示 E = {( v1, v2), (v2, v3), (v3, v4),  …}

例如,一个简单的无向图,其中包含一些城市和它们之间的道路。表示为二元组 G = (V, E),其中:

  • V = {a, b, c, d, e} 是城市的集合,分别代表着城市a, b, c, d, e
  • E = { (a, b), (a, c), (b, d), (c, d), (d, e) } 是道路的集合,每一对表示一条连接的道路。

节点和边的信息可以是类别型,数值型的,例如:

1.2 图的类型

根据节点和边等特征,图可以分为不同类型:

  • 有向图(Directed Graph):边有方向,从一个节点指向另一个节点。
  • 无向图(Undirected Graph):边没有方向,表示对等关系。
  • 加权图(Weighted Graph):边具有权重,代表关系的强度或成本。记为点 𝑣𝑖 到 𝑣𝑗 的权重为 𝑤𝑖𝑗​.
  • 无权图(Unweighted Graph):边没有权重。
  • 简单图(Simple Graph):每对节点之间最多只有一条边,且没有自环。
  • 多重图(Multigraph):允许多条边连接相同的节点。
  • 连通图(Connected Graph):所有节点都可以通过路径连接到其他节点。
  • 非连通图(Disconnected Graph):存在至少一个孤立节点或子图。

2.Python创建图

安装networkx库:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple networkx

networkx的中文教程 — NetworkX 2.8 文档icon-default.png?t=N7T8https://www.osgeo.cn/networkx/tutorial.html创建图的基本步骤

  1. 导入NetworkX:首先,导入NetworkX库。
  2. 创建图:可以创建一个空图,或通过数据结构(如列表、字典)直接构建图。
  3. 添加节点:使用 add_node()add_nodes_from() 添加单个或多个节点。
  4. 添加边:使用 add_edge()add_edges_from() 添加单个或多个边。
  5. 操作图:可以查询节点和边、计算图的属性、执行算法等。

2.1 创建一个图:

import networkx as nx
import matplotlib.pyplot as plt

# 创建一个空图
G = nx.Graph()

# 添加节点
G.add_nodes_from([1, 2, 3, 4, 5])

# 添加边
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)])

# 绘制图
nx.draw(G, with_labels=True, node_color='lightpink')
plt.show()

输出: 

3.2 创建有向图:

# 有向图
import networkx as nx
import matplotlib.pyplot as plt

# 创建一个空的有向图
G = nx.DiGraph()

# 添加节点
G.add_nodes_from([1, 2, 3, 4, 5])

# 添加有向边
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)])  # 这些边是有方向的

# 绘制有向图
# with_labels:是否有节点标签,node_color:节点的颜色
nx.draw(G, with_labels=True, node_color='lightblue', arrowstyle='-|>')
plt.show()

输出:

2.3 创建有权图:

# 创建一个空的加权图
WG = nx.DiGraph()  # 也可以是 nx.Graph(),取决于是否需要有向

# 添加节点
WG.add_nodes_from([1, 2, 3, 4, 5])

# 添加加权边
WG.add_edge(1, 2, weight=0.5)
WG.add_edge(2, 3, weight=1.2)
WG.add_edge(3, 4, weight=0.8)
WG.add_edge(4, 5, weight=1.5)
WG.add_edge(5, 1, weight=2.0)

# 绘制加权图
# 使用边权重进行可视化
edge_labels = nx.get_edge_attributes(WG, 'weight')

nx.draw(WG, with_labels=True, node_color='lightgreen', arrowstyle='-|>')
nx.draw_networkx_edge_labels(WG, pos=nx.spring_layout(WG), edge_labels=edge_labels)
plt.show()

3.图的性质

3.1 邻接节点(neighbors)

  • 节点 𝑣𝑖​ 的邻接节点是与节点 𝑣𝑖 直接相连的节点,其被记为 𝑁(𝑣𝑖)。
  • 节点 𝑣𝑖 的 𝑘 跳远的邻接节点(neighbors with 𝑘-hop)是到节点 𝑣𝑖​ 要走 𝑘 步的节点(一个节点的 2 跳远的邻接节点包含了自身)。

3.2 图的度(degree)

一个顶点在图中的 (degree)为与这个顶点相连接的边的数目。

如下图,武则天的度为6,上官婉儿的度为1。

在无向图中,节点的度表示与该节点直接相连的边的数量:

  • 度(Degree):无向图中节点的度是连接到该节点的边的数量。度越高,表示该节点越活跃。
  • 平均度:整个图中所有节点的平均度。
  • 最大度和最小度:图中节点的最高和最低度。

在有向图中,度分为两种:入度和出度:

  • 入度(In-degree):指向某个节点的边的数量,表示有多少条边进入该节点。
  • 出度(Out-degree):从某个节点发出的边的数量,表示有多少条边从该节点出去。
  • 总度(Total degree):入度和出度的总和。

我们使用一个 NetworkX 中自带的图 The Karate Club Network(空手道俱乐部网络)进行学习。空手道俱乐部网络描述了空手道俱乐部 34 名成员的社交网络,并记录了在俱乐部外互动的成员之间的链接。

# 创建一个空手道俱乐部网络
G = nx.karate_club_graph()

# G 是否是一个有向图
print(type(G))

# 可视化图
nx.draw(G, with_labels = True, node_color='Gold')
plt.show()

# 计算了每个节点的度,接着计算了度的总和,并用节点数量求平均
# 获取所有节点的度
degrees = dict(G.degree())

# 计算平均度
average_degree = sum(degrees.values()) / len(degrees)
print("空手道俱乐部网络的平均度是:", average_degree)

 3.3 行走(walk)和路径(path)

  • 𝑤𝑎𝑙𝑘(𝑣1,𝑣2)=(𝑣1,𝑒6,𝑒5,𝑒4,𝑒1,𝑣2),这是一次“行走”,它是一次从节点 𝑣1 出发,依次经过边 𝑒6,𝑒5,𝑒4,𝑒1​,最终到达节点 𝑣2 的“行走”。
  • 下图所示为 𝑤𝑎𝑙𝑘(𝑣1,𝑣2)=(𝑣1,𝑒6,𝑒5,𝑒4,𝑒1,𝑣2),其中红色数字标识了边的访问序号。
  • 在“行走”中,节点是允许重复的。
  • 路径是节点不可重复的行走。

3.4 节点间的距离和图的直径

节点距离(distance)指的是在图中两个节点之间的最短路径长度(shortest path)。对于无向图和有向图的距离计算略有不同:

  • 无向图:节点之间的距离是指通过最少的边连接这两个节点的路径长度。
  • 有向图:节点之间的距离是指沿着方向连接这两个节点的最短路径长度。

在NetworkX中,计算节点距离的方法有:

  • shortest_path_length(G, source, target): 计算两个特定节点之间的最短路径长度。
  • all_pairs_shortest_path_length(G): 计算所有节点对之间的最短路径长度。

直径(diameter):给定一个连通图 𝐺={𝑉,𝐸}G={V,E},其直径为其所有节点对之间的最短路径的最大值。

# 创建一个简单的无向图
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (3, 4), (4, 5), (1, 5)])

nx.draw(G, with_labels = True, node_color='LightGreen')
plt.show()

# 计算两个节点之间的最短路径长度
distance_1_3 = nx.shortest_path_length(G, source=1, target=3)
distance_1_4 = nx.shortest_path_length(G, source=1, target=4)

# 计算图的直径
graph_diameter = nx.diameter(G)

print("节点 1 和 3 之间的距离:", distance_1_3)
print("节点 1 和 4 之间的距离:", distance_1_4)

print("图的直径:", graph_diameter)

3.5 子图、连通分量,连通图

子图(Subgraph)

子图是从一个图中选择部分节点和边组成的新图。子图保留原始图中的连接关系,但通常包含更少的节点和边。

子图可以基于特定条件来构建,例如选择特定的节点或边。在NetworkX中,可以使用 subgraph() 方法从一个图中提取子图。例如:

# 创建一个空手道俱乐部网络
G = nx.karate_club_graph()

# 可视化完整的空手道俱乐部网络
nx.draw(G, with_labels=True, node_color='Gold', edge_color='gray')
plt.show()

# 创建子图,包括节点 0 到 5 及其连接的边
sub_G = G.subgraph([0, 1, 2, 3, 4, 5])

# 可视化子图
nx.draw(sub_G, with_labels=True, node_color='lightgreen', edge_color='blue')
plt.show()

# 打印子图中的节点和边
print("子图中的节点:", list(sub_G.nodes()))
print("子图中的边:", list(sub_G.edges()))

连通分量(Connected Component)

连通分量是指图中所有节点之间都有路径可以到达的最大子图。在无向图中,连通分量是图的一个重要性质,表示节点之间的连通性。在有向图中,有弱连通分量和强连通分量。弱连通分量是将有向图视为无向图后得到的连通分量,强连通分量则是指在有向图中,所有节点之间有路径可以到达的子图。

在NetworkX中,可以使用 connected_components() 方法找到无向图中的连通分量例如:

# 找到空手道俱乐部网络(无向图)中的连通分量
connected_components = list(nx.connected_components(G))
print("连通分量:", connected_components)

 使用 strongly_connected_components()weakly_connected_components() 方法找到有向图中的强连通和弱连通分量,例如:

# 创建一个有向图,让图中一些点不连接
# 找到有向图中的强连通分量

DG = nx.DiGraph([(1, 2), (2, 3), (3, 1), (4, 5)])

# 可视化图
nx.draw(DG, with_labels = True, node_color='Gold')
plt.show()

strongly_connected_components = list(nx.strongly_connected_components(DG))
print("强连通分量:", strongly_connected_components)

# 找到有向图中的弱连通分量
weakly_connected_components = list(nx.weakly_connected_components(DG))
print("弱连通分量:", weakly_connected_components)

连通图(Connected Graph)

连通图是指一个无向图中,所有节点之间都存在至少一条路径。连通图只有一个连通分量。

在NetworkX中,可以使用 is_connected() 方法检查一个无向图是否是连通图。例如:

# 检查无向图是否是连通图
is_connected = nx.is_connected(G)
print("该图是否是连通图:", is_connected)

3.6 聚类系数(Clustering Coefficient)

# 创建一个空手道俱乐部网络
G = nx.karate_club_graph()

# 计算每个节点的局部聚类系数
local_clustering = nx.clustering(G)

# 计算全局聚类系数(平均局部聚类系数)
global_clustering = nx.average_clustering(G)

print("局部聚类系数:", local_clustering)  # 打印所有节点的局部聚类系数
print("全局聚类系数:", global_clustering)  # 打印全局聚类系数

3.7 接近中心度 (closeness centrality)

接近中心度(Closeness Centrality)是一种度量图中节点的重要性或影响力的指标。它衡量了一个节点与其他所有节点之间的距离,也即最短路径的平均距离。接近中心度的值越高,意味着该节点与其他节点之间的距离越短,具有更大的影响力。

接近中心性计算:计算一个节点与其他节点之间的最短路径之和,再对得到的和求倒数,得到该节点的接近中心性得分。

更常见的做法是将该得分归一化,以此表示最短路径的平均长度,而不是最短路径之和。利用这一修正方法可以比较在不同规模的图中节点的接近中心性。

在NetworkX中,可以使用 closeness_centrality() 方法计算节点的接近中心度:

# 创建一个图
G= nx.Graph()

# 添加节点和边
G.add_edges_from([(1, 2),(1, 3),(2, 3),(2, 4),(3, 4),(4,5)])

# 计算接近中心度
closeness = nx.closeness_centrality(G)
# 将接近中心度转换为列表
closeness_values =list(closeness.values())

# 绘制条形
plt.bar(range(len(closeness_values)),closeness_values)
plt.xlabel("节点")
plt.ylabel("接近中心度")
plt.title("接近中心度条形图")

# 标记节点
plt.xticks(range(len(closeness_values)),closeness.keys())
# 显示图形
plt.show()

4. 邻接矩阵、关联矩阵、拉普拉斯矩阵

4.1 邻接矩阵

邻接矩阵(Adjacency Matrix)是图的一种常用表示方式,它是一个方阵,用于表示图中的节点和边的关系。邻接矩阵的大小为 𝑛×𝑛,其中 𝑛 是图中的节点数量。

1.无向图的邻接矩阵

在无向图中,邻接矩阵是对称的。若节点 𝑖 和节点 𝑗 之间存在边,则矩阵的相应位置为 1,否则为 0。

2.有向图的邻接矩阵

在有向图中,邻接矩阵不一定是对称的。若从节点 𝑖 到节点 𝑗 有边,则矩阵的位置 [𝑖,𝑗]为 1,否则为 0。

3.加权图的邻接矩阵

在加权图中,邻接矩阵的位置值是边的权重。如果没有边,则该位置的值可以设置为 0、无穷大或其他特殊值。

4.生成邻接矩阵

在NetworkX中,可以使用 to_numpy_array()adjacency_matrix() 方法来生成图的邻接矩阵。

1.无向图的邻接矩阵: 

# 创建一个图
G= nx.Graph()

# 添加节点和边
G.add_edges_from([(1, 2),(1, 3),(2, 4),(3, 4),(4,5)])
nx.draw(G, with_labels = True, node_color='yellow')
plt.show()

# 生成邻接矩阵
adj_matrix = nx.to_numpy_array(G)
print("无向图的邻接矩阵:\n", adj_matrix)

2.有向图的邻接矩阵 

# 创建一个有向图
DG = nx.DiGraph([(1, 2), (2, 3), (3, 1), (4, 5)])
nx.draw(DG, with_labels = True, node_color='Lightblue')
plt.show()

# 生成邻接矩阵
adj_matrix = nx.to_numpy_array(DG)
print("有向图的邻接矩阵:\n", adj_matrix)

 

3.加权有向图的邻接矩阵:

# 创建一个空的加权图
WG = nx.DiGraph()  # 也可以是 nx.Graph(),取决于是否需要有向

# 添加节点
WG.add_nodes_from([1, 2, 3, 4])

# 添加加权边
WG.add_edge(1, 2, weight=0.5)
WG.add_edge(2, 3, weight=1.2)
WG.add_edge(3, 4, weight=0.8)
WG.add_edge(4, 1, weight=0.5)


# 绘制加权图
# 使用边权重进行可视化
edge_labels = nx.get_edge_attributes(WG, 'weight')

nx.draw(WG, with_labels=True, node_color='lightgreen', arrowstyle='-|>')
nx.draw_networkx_edge_labels(WG, pos=nx.spring_layout(WG), edge_labels=edge_labels)
plt.show()

# 生成加权邻接矩阵
adj_matrix = nx.to_numpy_array(WG, weight='weight')

print("加权图的邻接矩阵:\n", adj_matrix)

 4.2 关联矩阵

关联矩阵(Incidence Matrix)是图的一种表示方式,展示了节点和边之间的关系。对于给定的图,关联矩阵是一个大小为 𝑛×𝑚n×m 的矩阵,其中 𝑛n 是节点的数量,𝑚m 是边的数量。

1.无向图的关联矩阵

在无向图中,关联矩阵的每一行对应一个节点,每一列对应一条边。如果某条边连接了节点 𝑖 和节点 𝑗,那么对应的列中这两个节点的行将设置为 1。

2.有向图的关联矩阵

在有向图中,关联矩阵不仅表示节点和边之间的关系,还表明边的方向。如果边从节点 𝑖 指向节点 𝑗,那么对应的列在节点 𝑖 的行中设置为 -1,而在节点 𝑗 的行中设置为 1。

3.生成关联矩阵

在NetworkX中,您可以使用 incidence_matrix() 方法生成关联矩阵。

# 创建一个有向图
DG = nx.DiGraph([(1, 2), (2, 3), (3, 1), (4, 5)])
nx.draw(DG, with_labels = True, node_color='Lightblue')
plt.show()

# 生成关联矩阵
inc_matrix = nx.incidence_matrix(DG, oriented=True).toarray()
print("有向图的关联矩阵:\n", inc_matrix)

# 创建一个空的加权图
WG = nx.DiGraph()  # 也可以是 nx.Graph(),取决于是否需要有向

# 添加节点
WG.add_nodes_from([1, 2, 3, 4])

# 添加加权边
WG.add_edge(1, 2, weight=0.5)
WG.add_edge(2, 3, weight=1.2)
WG.add_edge(3, 4, weight=0.8)
WG.add_edge(4, 1, weight=0.5)
WG.add_edge(2, 4, weight=0.1)

# 绘制加权图
# 使用边权重进行可视化
edge_labels = nx.get_edge_attributes(WG, 'weight')

nx.draw(WG, with_labels=True, node_color='lightgreen', arrowstyle='-|>')
nx.draw_networkx_edge_labels(WG, pos=nx.spring_layout(WG), edge_labels=edge_labels)
plt.show()

# 生成加权关联矩矩阵
inc_matrix = nx.incidence_matrix(WG, oriented=True, weight='weight').toarray()
print("加权图的关联矩阵:\n", inc_matrix)

4.3 拉普拉斯矩阵

拉普拉斯矩阵(Laplacian Matrix)是基于图的度矩阵和邻接矩阵定义的。设 𝐷 为度矩阵,是一个对角矩阵,其中每个对角线元素表示相应节点的度;设 𝐴 为邻接矩阵,表示图中节点之间的连接关系。

拉普拉斯矩阵定义为: 𝐿=𝐷−𝐴

拉普拉斯矩阵的性质:

  • 拉普拉斯矩阵是对称矩阵。
  • 对于无向图,拉普拉斯矩阵的每一行和每一列的和都是零。
  • 拉普拉斯矩阵的特征值可以反映图的性质,例如第二小的特征值(通常称为 Fiedler 值)与图的连通性相关。

生成拉普拉斯矩阵

在NetworkX中,可以使用 laplacian_matrix()normalized_laplacian_matrix() 方法生成拉普拉斯矩阵。

5. 图的类型

  • 按照不同的划分规则,图可以被划分为很多不同的种类。在 2.2 节中,我们根据边是否具有指向性,区分得到了有向图和无向图。下面,我们会根据更多不同的属性来对图进行划分。

5.1 图的拓扑结构

图的拓扑结构是指图中节点和边的组织方式,以及它们之间的连接关系。拓扑结构反映了图的整体布局和性质,揭示了图的某些特征和行为。

例如,环(Cycle):节点和边形成的闭合路径。 树(Tree):无环连通无向图。 森林(Forest):不连通的树的集合等。

根据图的拓扑结构,规则网络(regular network)可以分为

  • 全连接网络(fully-connected network)(下图左)
  • 环形网络(ring-shape network)(下图中)
  • 星形网络(start-shape network)(下图右)

图的拓扑结构在分析网络、社交关系、数据流、任务依赖等方面具有重要意义。理解图的拓扑结构可以帮助我们理解系统的行为和特征。 

5.2 同质图和异质图

质图(Homogeneous Graph)和异质图(Heterogeneous Graph)是根据图中节点和边的性质分类的两种概念。这两个概念主要用来区分网络中节点和边的同质性或异质性。

  • 同质图(Homogeneous Graph):只有一种类型的节点和一种类型的边的图。
  • 异质图(Heterogeneous Graph):存在多种类型的节点和多种类型的边的图。

5.3 二分图

二分图是一类特殊的图,又称为二部图、偶图、双分图。二分图的顶点可以分成两个互斥的独立集合 U 和 V 的图,使得所有边都是连结一个 U 中的点和一个 V 中的点。

也就是,节点分为两类,只有不同类的节点之间存在边

二分图在很多实际应用中都发挥着重要作用,包括:

  • 匹配问题:如婚配问题、工作分配问题。
  • 社交网络:表示两类不同节点的关系,例如用户和兴趣、学生和课程。
  • 生物信息学:表示蛋白质与基因、药物与靶标的关系。

 创建二分图:

# 创建一个二分图
B = nx.Graph()

# 添加左组节点
B.add_nodes_from([1, 2, 3, 4], bipartite=0)  # bipartite=0 表示左组
# 添加右组节点
B.add_nodes_from(['A', 'B', 'C', 'D'], bipartite=1)  # bipartite=1 表示右组

# 添加边,连接左右组
B.add_edges_from([(1, 'A'), (1, 'C'), (2, 'C'), (3, 'D'), (3, 'C'), (1, 'B'), (4, 'D')])

# 检查是否是二分图
is_bipartite = nx.is_bipartite(B)

# 确定布局
# data=True: bipartite为 1
left_nodes = {n for n, d in B.nodes(data=True) if d["bipartite"] == 0}
pos = nx.bipartite_layout(B, left_nodes)

# 设置颜色
node_colors = ['lightblue' if node in left_nodes else 'lightgreen' for node in B.nodes()]

# 可视化二分图
plt.figure(figsize=(8, 6))
nx.draw(B, pos, with_labels=True, node_color=node_colors, edge_color='gray')
plt.title("二分图的可视化")
plt.show()  # 显示图形

 在分配问题中,我们通常有两个节点组:一个是资源或任务的提供者,另一个是需求者或接收者。二分图的特性使其非常适合表示这些分配问题。分配问题的目标通常是将左组和右组的节点进行最佳匹配,以满足某种条件或优化某个目标。在实际应用中,分配问题经常涉及优化,例如:

  • 最大化匹配:找到在二分图中将两个组连接最多的匹配方式。
  • 最小成本匹配:找到一种匹配方式,使总成本最小化(每条边有权重表示成本)。
  • 任务-人员分配:在一个组织中,将任务有效分配给合适的人员。

解决分配问题的常用算法包括:

  • 匈牙利算法:一种用于求解最大匹配和最小成本匹配的有效算法。
  • Hopcroft-Karp算法:用于求解二分图最大匹配的高效算法。

eg. 匈牙利法求解指派问题(运筹学):

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

函数的内容

一&#xff0c;概念 封装一份可以被重复执行的代码块&#xff0c;让大量代码重复使用 二&#xff0c;函数使用 大体分两步&#xff1a;声明函数&#xff0c;调用函数 声明函数有关键字&#xff1a;function 函数名&#xff08;&#xff09;{ 函数体 } 为基本格式&#xf…

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper&#xff08;JR&#xff09; 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…

哈希表实现[很详细!]

目录 哈希表 定义节点类 根据hash码获取value 向hash表存入新key value,如果key重复,则更新value 根据hash码删除,返回删除的value 关于resize()一些问题的解答 冲突测试 MurmurHash 设计思考 练习 Leetcode01 Leetcode03 Leetcode49 Leetcode217 Leetcode136 L…

人工智能大模型培训老师叶梓 探索知识库问答中的查询图生成:处理多跳复杂问题的新方法

在人工智能领域&#xff0c;基于知识库的问答&#xff08;KBQA&#xff09;技术正变得越来越重要。它使得机器能够理解自然语言问题&#xff0c;并从结构化的知识库中检索答案。然而&#xff0c;面对多跳复杂问题&#xff0c;传统的KBQA方法往往力不从心。近期&#xff0c;研究…

账号安全基本措施1

一、系统账号清理 1.1 将用户设置为无法登录 useradd -s /sbin/nologin lisi shell类型设置为/sbin/nologin用户将无法使用bash或其他shell来登录系统。 1.2 锁定用户。passwd -l 用户名 正常情况下是可以送普通用户切换到其他普通用户的 当锁定密码后passwd -l lisi就用普…

第22天:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

第二十二天 一、PHP留言板前后端功能实现 开发环境&#xff1a; DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy &#xff1a;Apache MYSQL环境 Navicat Premium: 全能数据库管理工具 二、数据库创建&架…

【解决】echarts条形图纵坐标显示不全

先说结论&#xff1a; option:{...grid: {containLabel: true},... }这个属性是控制整体的坐标标签的。加上这个就可以显示完整了。然后再根据其他属性调整标签的字体、颜色之类的 yAxis : [{...axisLabel:{width:100,overflow:break,truncate:...,color:red,fontSize:10,},..…

JavaScript进阶部分知识总结

作用域 局部作用域 作用域规定了变量能够被访问的范围&#xff0c;离开了这个范围变量就不能被访问作用域分为&#xff1a;局部作用域和全局作用域 局部作用域分为函数作用域和块作用域 1.函数作用域&#xff1a; 在函数内部声明的变量只能在函数内部被访问&#xff0c;外…

AWD线下攻防万字最完整战术(记第一届“长城杯”半决赛战术)

目录 准备阶段 1.登录比赛平台&#xff08;获取资产&#xff09; 查看账号账号修改 服务器SSH口令mysqlWEB服务口令(后台密码)数据库后台管理员密码 账号用户检查 2.dump源码&#xff08;方便应急响应恢复靶机&#xff09; 网站源码备份 压缩文件解压文件备份到服务器本地上传…

这10款VS Code神仙插件,嵌入式程序员必备

大家好&#xff0c;我是知微&#xff01; 嵌入式软件开发工程师平时可能更多的是使用Source Insight、Keil、IAR来阅读代码&#xff0c;写代码。 VSCode大家都听说过&#xff0c;功能十分强大&#xff0c;而且免费&#xff01; 或许是因为这款软件上手有一定的学习成本&…

css:echarts渐变色转换为css渐变色

通过一个下拉框来选择渐变类型&#xff0c;为了简化&#xff0c;我设置了三种&#xff1a;水平方向的渐变、垂直方向的渐变和径向渐变用&#xff0c;表格来配置echarts渐变色的百分比位置和颜色。 config是表格里的数据格式如下&#xff1a; offset是百分比位置&#xff0c;co…

C语言项目实践——贪吃蛇

引言&#xff1a;本篇博客中&#xff0c;我将会使用结构体&#xff0c;链表&#xff0c;WIN32 API等一系列知识完成C语言项目——贪吃蛇的实现。在观看此篇博客之前&#xff0c;请将这些知识所熟悉&#xff0c;不然可能会造成理解困难。 更多有关C语言的知识详解可前往个人主页…

[C++][算法基础]求组合数(IV)

输入 &#x1d44e;,&#x1d44f;&#xff0c;求 的值。 注意结果可能很大&#xff0c;需要使用高精度计算。 输入格式 共一行&#xff0c;包含两个整数 &#x1d44e; 和 &#x1d44f;。 输出格式 共一行&#xff0c;输出 的值。 数据范围 1≤b≤a≤5000 输入样例…

一线实战:国产数据库Mogdb双网卡同步最佳实践

前言 大家都知道Oracle数据库无论是单机还是RAC集群在进行生产部署实施时&#xff0c;我们都会对网卡做冗余考虑&#xff0c;使用双网卡&#xff0c;比如public、心跳网络。这样的目的主要是为了安全&#xff0c;避免单点故障。当然双网卡Bond不仅是可以做主备还可以支持负载均…

安装mysql的流程

安装mysql的步骤 安装流程 [rootlocalhost z]# cd /mnt/share/share[rootlocalhost share]# ll[rootlocalhost share]# cp mysql157-community-release-el7-10.noarch.rmp /usr/localcp: cannot stat ‘mysql157-community-release-el7-10.noarch.rmp’: No such file or direc…

企业车辆管理系统平台是做什么的?

企业车辆管理系统平台是一种综合性的管理系统&#xff0c;它主要集车辆信息管理、车辆调度、车辆维修、油耗管理、驾驶员管理以及报表分析等多种功能于一体。通过这个平台&#xff0c;企业可以实现对车辆的全面管理&#xff0c;优化车辆使用效率&#xff0c;降低运营成本&#…

JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

一、Spring配置优先级 不同配置文件&#xff0c;配置同一个属性谁有效 properties>yml>yaml 命令行参数>Java系统属性 项目打包后要改变属性&#xff1a; 红色是Java系统属性&#xff0c;绿色是命令行参数 ‘ 二、Bean管理 1.获取bean 获取IOC容器&#xff1a;ap…

linux之进程通信

目录 一、进程通信介绍 1.目的 2.发展 3.进程通信是什么&#xff0c;怎么通信&#xff1f; 二、管道 1.介绍 2.匿名管道 1.单向通信管道原理 2.代码实现 3.管道特征 4.管道的四种情况 5.管道的应用场景 使用管道实现一个简易版本的进程池 3.命名管道 1.思考 2.…

了解IPS和IDS:这5个差异将改变你的安全观念!

IPS 代表 入侵防御系统&#xff08;Intrusion Prevention System&#xff09;&#xff0c;它是 IDS 的进一步发展&#xff0c;不仅具备检测攻击的能力&#xff0c;还能在检测到攻击后主动采取措施阻止攻击。IPS 通常部署在防火墙和网络设备之间&#xff0c;能够深度感知并检测流…

ubuntu18.04与windows文件互传

目录 window下载Xftp软件ubuntu上的配置windows端Xftp软件的使用 window下载Xftp软件 下载&#xff1a;家庭/学校免费版 安装教程推荐下面的文章 xftp7免费版安装教程&#xff08;详细&#xff09; ubuntu上的配置 在进入系统后&#xff0c;确保有网络连接的情况下按Ctrl A…