图表在不同学科中被使用。它们被用于生物学中表示基因相互作用,用于交通运输中的路线优化,以及用于社交网络中的用户连接分析。图表的视觉表示复杂关系和观察模式和趋势的能力是其两个优点。然而,处理大型数据集可能会使图表变得笨重且难以理解。此外,创建图表可能需要时间和知识。尽管存在这些缺点,图表仍然是跨学科数据分析和决策制定的有效工具。
使用的方法
-
设置表示
-
链接表示
-
顺序表示
设置表示
图中的每个顶点都与一个包含其周围顶点的集合相关联,该集合表示图。在这种方法中,图的边存储在包含集合的邻接集或哈希表中。每个顶点的集合确保没有重复的相邻顶点,并且它有效地管理稀疏图。与其他表示方法相比,添加和删除边更容易,并且内存利用率降低。在处理具有不同连接程度的网络时,这种技术非常有帮助,因为它可以有效地执行诸如检查边缘和迭代附近顶点等操作。
-
邻接集:在图的集合表示中,邻接集使用集合记录每个顶点的邻居,防止重复,并便于有效处理边缘。
-
哈希表:哈希表在图的集合表示的上下文中使用,将每个顶点与包含其相邻顶点的集合相连。
算法
-
图的顶点应该由一个类或数据结构表示。每个顶点对象需要有一个集合来包含其相邻的顶点,同时还需要有一个ID或标签。
-
创建一个空的存储空间来保存图的顶点(例如数组、向量或哈希表)。
-
对于图中的每个顶点:
为图中的每个顶点创建一个具有指定ID或标签的新顶点对象。
将与其相邻的顶点添加到邻接集中。
-
使用以下技术在顶点之间添加边:
收集源顶点和目标顶点的顶点对象。
将目标顶点包含在源顶点的邻接集合中。
-
实现以下边缘移除技术:
收集源顶点和目标顶点的顶点对象。
从源顶点的邻接集中删除目标顶点。
-
实现图操作所需的其他技术,例如确定边是否存在以及获取顶点的邻居。
示例
#include
#include
#include
class Graph {
private:
std::unordered_map adjacencySets;
public:
void addEdge(int source, int destination) {
adjacencySets[source].insert(destination);
adjacencySets[destination].insert(source); // If the graph is undirected, add both edges
}
void removeEdge(int source, int destination) {
adjacencySets[source].erase(destination);
adjacencySets[destination].erase(source); // If the graph is undirected, remove both edges
}
void printNeighbors(int vertex) {
std::cout