广度优先算法
本文主要以介绍算法思想为主这里并没有进行源码实现,但是给出推荐使用的数据结构和主要思想。
首先介绍一下广度优先算法,假设要查找AB两点之间的最短距离,以A为起点B为终点。可以先遍历A的相邻节点,这些节点称之为一度关系,当一度关系里没有时,就遍历一度关系的相邻节点,遍历到的这些节点可以称之为二度关系,以此类推直到遍历到B点则该遍历路径就为最短路径。
广度优先算法实现:
广度优先算法需要用到队列先进先出的特性,首先将首节点放入队列中,然后进入循环体1234循环:
1.每次从队列中弹出最先放入的节点
2.判断该节点是否被遍历过,以及判断路线长度是否最优,是否是目的地节点是跳出循环
3.遍历该节点的下一节点并将符合条件的节点放入队列中
4.记录当前节点和当前节点下一个节点关系。
以上图为准下面描述一下广度优先算法的具体实现步骤和思路:
实现广度优先算法上文介绍到了使用队列先进先出的特性,所以先声明一个queue,queue的元素是一个节点下标,声明一个map,key为当前节点的下标,value为一个结构体(包含前一节点下标和与起始点距离)。
准备工作做完之后需要初始化queue和map,queue入队0节点,map的key为0,前一节点可以设为-1(任意无效值都可以,因为首节点的前一节点没有任何意义),距离设置为0(首节点距离自己的距离当然为0)。
初始化后的queue和map
这种思想是每次遍历都是从队列出队遍历相邻节点符合要求后相邻节点入队
将遍历到的节点信息存储在map中通过下标(key)就可以看到节点的信息(value)
下面进入主要循环遍历。
第一次循环:
出队0节点,探索相邻节点1,2,探索到的入队,登记map
第二次循环:
出队1节点,探索相邻节点2,3探索到的入队,登记map,由于2节点已被发现过(通过key=2到map中可以找到)判断长度0->2=12,0->1->2=10,更新map,2的前节点为1,与0点距离为10
第三次循环:
出队2节点,探索相邻节点4探索到的入队,登记map
第四次循环:
出队3节点,探索相邻节点2,4,5探索到的入队,登记map。由于2节点4节点都被探索过所以比较长度0->1->2=10;0->1->3->2=8更新map,2节点更新通过2节点的节点4需要更新0->1->3->2->4=13;0-1->3->4=17更新map。
第五次循环:
出队4节点,探索相邻节点5探索到的入队,登记map。
第六次循环:
出队5节点为终点终止循环探索结束。
总结
由上面第三次循环可以看出广度优先算法在节点距离不相等时(需要判断节点距离),需要修改所有经过被修改的节点(如循环三中2节点)的节点(如循环三中4节点),这样操作十分繁琐。其实这种节点间的关系更适合用Dijkstra算法来计算。
以上文章作者通过上网查找资料自己思考总结而来,如有不足不吝赐教,谢谢。