列子
有这么一张图,A为入口,J为出口,灰色区域为墙,如何从A找到J
1、深度优先算法
不断地沿着顶点的深度方向遍历 **假如查找顺序为上右下左**,那么该算法的顺序:A、B、C、D、E、F、G、H、I、J
理解这个可以用栈来理解,
先进后出
1.A找到了B,把B入栈,B先从右边找到了C,把C入栈,然后C找到了D,D再入栈,D的上右下都没有可走的元素,那么就后退到C,即D出栈,C右边找过了,下面也没有可走的,然后就出栈,然后轮到B
2.B的右边找过了,该找下面了,找到了E,然后E在按上右下左的顺序 找到了F…直到找到J
2、广度优先算法:
1)先访问完当前顶点的所有邻接点。(这也就是“广”的意思)
2)先访问顶点的邻接点先于后访问顶点的邻接点被访问。
假如查找顺序为上右下左,那么该算法的顺序:A、B、C、E、D、F、G、H、I、J
理解这个可以用队列来理解,
先进先出
1.首先A进(此时队列只有A)
2.把队列末尾A出列,找到B,把B加入队列首位(此时队列只有B)
3.把队列末尾的B出列,找到C,E,按顺序加入到队列首位,(此时队列顺序为E,C)
4.把队列末尾的C出列,找到D,加入到队列首位(此时队列顺序为D,E)
5.把队列末尾的E出列,找到F,加入到队列首位(此时队列顺序为F,D)
6…按照这种顺序直到找到出口J
总结:
深度优先算法:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。
优缺点:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。
广度优先算法:层次遍历,从上往下对每一层依次访问,在每一层中,上右下左(也可以从左上右下等顺序)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止,(可以把A看第一层, B看做第二层,C,E看做第三种, D,F看做第四层......)
优缺点:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。