算法-无向图

简介:

图是由一组顶点和一组能够将两个顶点连接的边组成的,两个顶点通过一条边相连的时,我们称这两个顶点是相邻的,并称这条边依附于两个顶点,某个顶点的都市即为依附于它的边的总数。图是一种比线性表和树更复杂的数据结构,树算是图的一种特殊情况下的数据结构(无环连通图),图的密度是指已经连接的顶点对占所有可能被连接的顶点对的比例,如果一幅图中不同的边的数量只占顶点总数的一小部分,那么图称之为稀疏图,反之是稠密图。

无向图基础

我们首先来来看一个最基本的图:

我们需要一个数据结构能够快速的处理开发过程的各种用例,有三种可选方式,邻接矩阵(当节点的数量太大的时候不能满足需求),边的数组,我们可以通过实例化一个类,保存两个节点的变量,但是实现起来效率很低,第三种就是邻接表数组,以一个顶点为索引的相邻数组,使用的空间是边和顶点的和,添加一条边的时间为常数。现在我们通过代码实现邻接表的形式,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
@ interface  Graph : NSObject
//顶点的数量
@property  (assign,nonatomic) NSInteger  vertexs;
//边的数量
@property (assign,nonatomic) NSInteger  edges;
//连接点的边
@property (strong,nonatomic)  NSMutableArray  *adjDataSource;
 
-(instancetype)initWithVertex:(NSInteger)vertexs;
//添加一条链接它们的边
-( void )addEdges:(NSInteger)startVertex  endVertex:(NSInteger)endVertex;
 
@end

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@implementation Graph
 
-(instancetype)initWithVertex:(NSInteger)vertexs{
     self=[super init];
     if  (self) {
         self.vertexs=vertexs;
         for  (NSInteger i=0; i<vertexs; i++) {
             NSMutableArray  *neighbourVertex=[[NSMutableArray alloc]initWithCapacity:1];
             [self.adjDataSource addObject:neighbourVertex]; //创建邻接表,将所有链表初始化为空
         }
     }
     return  self;
}
//http://www.cnblogs.com/xiaofeixiang
-( void )addEdges:(NSInteger)startVertex endVertex:(NSInteger)endVertex{
     //将endVertex添加到startVertex的链表中
     [self.adjDataSource[startVertex] insertObject:[NSNumber numberWithInteger:endVertex] atIndex:0];
     //将startVertext添加到endVertex的链表中
     [self.adjDataSource[endVertex] insertObject:[NSNumber numberWithInteger:startVertex] atIndex:0];
     self.edges=self.edges+1;
}
 
#pragma mark getter and setter
-(NSMutableArray *)adjDataSource{
     if  (!_adjDataSource) {
         _adjDataSource=[[NSMutableArray alloc]initWithCapacity:1];
     }
     return  _adjDataSource;
}
 
@end

算法测试

关于无向图的测试比较简单,节点是自己自己手动添加进去的,当然如果有数据源直接测试效果会更好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Graph  *graph=[[Graph alloc]initWithVertex:13];
[graph addEdges:0 endVertex:1];
[graph addEdges:0 endVertex:2];
[graph addEdges:0 endVertex:5];
[graph addEdges:0 endVertex:6];
[graph addEdges:3 endVertex:4];
[graph addEdges:3 endVertex:5];
[graph addEdges:4 endVertex:5];
[graph addEdges:4 endVertex:6];
[graph addEdges:7 endVertex:8];
[graph addEdges:9 endVertex:10];
[graph addEdges:9 endVertex:11];
[graph addEdges:9 endVertex:12];
[graph addEdges:11 endVertex:12];
for  (NSInteger i=0; i<[graph.adjDataSource count]; i++) {
     NSLog( @"节点%ld:相邻的节点:%@" ,i,[graph.adjDataSource[i] componentsJoinedByString: @"--" ]);
}
NSLog( @"技术交流群:%@" , @"228407086" );
NSLog( @"原文地址:http://www.cnblogs.com/xiaofeixiang" );

测试效果:

实际应用中我们可能会需要删除边检查图种是否还有某一条边,实现这些操作我们可以通过顺序链表代替目前的数组结构,不过会稍微麻烦一点,因为图本来就比较麻烦,本来是打算无向图的深度搜索和广度搜索一起写的,考虑放在一个文章里面会显的阅读起来不是很方便,本文算是图的基本入门知识。深度搜素和广度搜索接下来文章会补上。

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4691102.html,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 算法
无向图的算法:Kruskal算法与Prim算法生成最小生成树
无向图的算法:Kruskal算法与Prim算法生成最小生成树
230 0
|
算法
设计算法求无向图的深度优先生成树
设计算法求无向图的深度优先生成树
120 0
|
算法
无向图邻接表(深度优先算法)
无向图邻接表(深度优先算法)
149 0
|
算法 API 设计模式
浅谈算法和数据结构: 十二 无向图相关算法基础
原文:浅谈算法和数据结构: 十二 无向图相关算法基础 从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记。 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图。
1154 0
|
8天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
2天前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
1天前
|
算法 安全 数据安全/隐私保护
基于BBO生物地理优化的三维路径规划算法MATLAB仿真
本程序基于BBO生物地理优化算法,实现三维空间路径规划的MATLAB仿真(测试版本:MATLAB2022A)。通过起点与终点坐标输入,算法可生成避障最优路径,并输出优化收敛曲线。BBO算法将路径视为栖息地,利用迁移和变异操作迭代寻优。适应度函数综合路径长度与障碍物距离,确保路径最短且安全。程序运行结果完整、无水印,适用于科研与教学场景。
|
7天前
|
资源调度 算法 数据可视化
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。

热门文章

最新文章