Uninformed search

1.Depth-First Search(DFS)深度优先
比较经典的算法,下面简单介绍:

(1)把根节点入栈

(2)Pop栈顶并访问该节点,然后把它的子节点依次Push进入栈

(3)重复(2)过程,直到找到目标节点或栈为空(没有找到)。

visited数组保存已经浏览过的节点。

Time:O(b^m)
DFS算法效率很低。若要找目标,DFS就得把整个图都遍历了一遍。

2.Depth-Limited Search(DLS)

DLS是DFS的一种变种,它在DFS的基础上限制住了访问的深度,在DFS算法的第(2)步中,如果深度超过limit就不在进行入栈操作,即它只能访问到limit层。

DLS不一定可以找到目标节点。

3.Iterative Deepening Search(IDS)

IDS是DFS和DFS的合体,它通过增量方式来进行深度访问,增量以depth表示,最好设置增量的初值和每次增长的步幅。

之后进行limit=depth的DLS迭代。

显然当目标节点很深的情况下,IDS算法的效率肯定不如直接DFS的。但当深度很大,而且标节点处于中间位置或较浅位置时,或者深度未知的情况下,就能体现出IDS算法的价值了。

4.Breadth-First Search(BFS)广度优先

广度有先搜索,内存维护一个队列。

(1)把根节点入队。

(2)poll队头元素,并访问该节点,然后把它的子节点依次offer进队尾

(3)重复(2)过程,直到找到目标节点或栈为空(没有找到)。

visited数组保存已经浏览过的节点。

5.Uniform-Cost Search(UCS)

算是BFS的一种变种,此算法适合于带权图树结构中,可以找出最短路径。

与BFS不同的是内存中维护的不再是队列而是堆(优先队列,不懂得去看数据结构)里面存放根节点和当前到达该节点总共的Cost,按Cost调整堆,让其为最小堆(即按照Cost的值排序的堆)。

(1)根节点入堆

(2)出堆并访问该节点,把它所有的子节点依次入堆,调整为最小堆(按cost排序)

(3)重复(2),直到出堆的节点即为目标节点,或堆为空了(没有找到)。

猜你喜欢

转载自blog.csdn.net/h9f3d3/article/details/78867103