最近几天没咋注重做题,自己读题大部分都有障碍,需要借助翻译。把课件上的代码自己亲手敲了一遍,发现其实有很多细节上的问题,不知道换别的题能不能处理好。
切入正题,这次主要总结一下广度优先搜索(BFS)。
1) 算法原理
广度优先搜索即Breadth First Search,也是图遍历算法的一种。用一句话概括就是:“我会分身我怕谁?!”。
BFS的具体算法描述为选择一个起始点v放入一个先进先出的队列中,执行如下操作:
a. 如果队列不为空,弹出一个队列首元素,记为当前结点,执行b;否则算法结束;
b. 将与 当前结点 相邻并且尚未被访问的结点的信息进行更新,并且全部放入队列中,继续执行a;
维护广搜的数据结构是队列和HASH,队列就是官方所说的open-close表,HASH主要是用来标记状态的,比如某个状态并不是一个整数,可能是一个字符串,就需要用字符串映射到一个整数,可以自己写个散列HASH表,不建议用STL的map,效率奇低。
算法实现
广搜一般用队列维护状态,写成伪代码如下:
def BFS(v):
resetArray(visited,false)
visited[v] = true
queue.push(v)
while not queue.empty():
v = queue.getfront_and_pop()
for u in adjcent_list[v]:
if visited[u] is false:
dosomething(u)
queue.push(u)
3)基础算法样式
int bfs()
{
/初始化,初始状态存入队列;
队列首指针 head = 0;
尾指针 tail = 1;/
do
{
/指针 head 后移一位,指向扩展节点;/
for(int i = 1;i<=max;i++)
//max为产生子节点的规则数;
{
if(子节点符合条件)
{
tail指针增1,把新节点存入列尾;
if(新节点与原已产生节点重复)
删去该节点(取消入队,tail减1);
else
if(新节点是目标节点)
输出并退出;
}
}
}while(head<tail);
//队列为空;
}