Wednesday, August 29, 2018

[Algorithm]Implement DFS Iteratively


DFS是我们非常熟悉的算法,并且在图当中 也有很多应用。DFS的递归写法大家都很清楚,非常简单并且简洁。这里我们要讨论的是怎么用循环的方法实现图的DFS遍历。
既然要用循环模拟递归,我们肯定是需要用到stack的。具体的思路是,对于给定的图,选定任意节点为起始节点:

  1. 起始节点入栈并标记
  2. 如果栈不为空:
    1. 访问栈顶节点v
    2. 选择一个v没有被标记过的邻接节点,标记并入栈
    3. 如果v没有未被标记的邻接节点,pop栈顶节点
    4. 重复以上三步直到栈为空
  3. 完毕
具体到每一步的话,以下图为例:

图一


我们选择0为初始节点,入栈并标记
图二,stack = {0}


访问栈顶节点0,其邻接节点2未被标记,2入栈并标记
图三,stack = {0, 2}


访问栈顶节点2,其邻接节点1未被标记,1入栈并标记
图4,stack = {0, 2, 1}

访问栈顶节点1,没有未被标记的邻接节点,pop, stack = {0, 2}
访问栈顶节点2,其邻接节点3未被标记,3入栈并标记
图5,stack = {0, 2, 3}



访问栈顶节点3,没有未被标记的邻接节点,pop, stack = {0, 2}
访问栈顶节点2,没有未被标记的邻接节点,pop, stack = {0}
访问栈顶节点1,没有未被标记的邻接节点,pop, stack = {}
栈为空,算法结束。

时间复杂度O(V + E),空间复杂度O(V)。代码如下:





No comments:

Post a Comment