广度优先搜索,即是从最原始的节点开始,依次扩展起始节点的后继(跟当前节点挨着的下面的所有节点)。
A点为起始节点,也即当前节点: 按照广度优先策略,即扩展当前节点A的所有后继,那么接下来应扩展 B 节点: 此时,当前节点依然是A点,扩展完B点后,应继续扩展A的其他后继节点,即C点: 此时,当前节点A的所有后继均扩展,接下来当前节点变为B节点,继续按照扩展所有后继节点的策略扩展节点D: 同理,讲按顺序扩展 E,F,G节点,那么总的扩展顺序为: A → \rightarrow → B → \rightarrow → C → \rightarrow → D → \rightarrow → E → \rightarrow → F → \rightarrow → G
广度优先搜索的性能表:
完成情况时间复杂度空间复杂度评价可完成(如果横向节点数b有限)O(bd)O(bd)空间复杂度是个问题,可以轻易的达到10MB/s的节点产生速度该算法只扩展对于当前节点来说,代价(成本)最小的节点。
以上图为例,Sibiu为起点,Bucharest为终点。Sibiu的后继为Rimnicu和Fagaras,代价分别为80和99,那么算法选择扩展代价更小的Rimnicu,若是继续扩展Rimnicu的后继Ritesti,则Sibiu到Pitesti的总代价为 80 + 97 = 177。
此时,总代价只有99的Fagaras为最小代价节点,然后扩展Fagaras的后继Bucharest,该路线的总代价为 99 + 211 = 310. 虽然已经到达了终点Bucharest,但是算法还在继续。
此时,Sibiu到Pitesti的总代价最小,开始扩展Pitesti的后继Buchrest, 这个路径的总代价为 80 + 97 + 101 = 278 < 310
那么最终路线为: Sibiu → \rightarrow → Rimnicu → \rightarrow → Pitesti → \rightarrow → Bucharest
总的扩展顺序为:Sibiu → \rightarrow → Rimnicu → \rightarrow → Fagaras → \rightarrow → Petesti → \rightarrow → Bucharest
一致代价搜索的性能表:
完成情况时间复杂度空间复杂度评价可完成(具有最优性)O(b[1+ C*/ε])O(b[1+ C*/ε])具有最优解扩展最深的为扩展的节点
由于节点过多,就不一一贴图了。
从上图看,扩展顺序为 A → \rightarrow → B → \rightarrow → D → \rightarrow → H → \rightarrow → I → \rightarrow → E → \rightarrow → J → \rightarrow → K → \rightarrow → C → \rightarrow → F → \rightarrow → L → \rightarrow → M → \rightarrow → G → \rightarrow → N → \rightarrow → O
另外,遍历后不是结果的部分将被从内存删除,如下图的黑色部分:
深度优先搜索的性能表:
完成情况时间复杂度空间复杂度评价当没有最深节点时不能完成O(bm)O(bm)没有最优解,但删除无用节点会降低空间复杂度注:m代表任一节点的最大深度。
深度优先搜索算法的缺点是,如果深度无限,该算法就废了,或者深度特别深,而目标相对来说没有那么深,那么该算法性能也不好。深度受限搜索在一定程度上解决了这个问题,即设定一个深度的限制,每次在限制深度内采用深度优先搜索。
如上图,限制 limit = 2,在限制深度内采用深度优先搜索。
深度受限搜索的性能表:
完成情况时间复杂度空间复杂度评价当 l < d 时不能完成O(bl)O(bl)当 l > d 时没有最优解注:l代表限制深度。
深度限制搜索的性能很大程度上依赖 限制深度 l,所以,为了解决 l 的不确定性,采用迭代深度搜索,每次递增 l,知道搜索到目标节点
如上图,每次递增 l,知道找到目标。
迭代深度搜索的性能表:
完成情况时间复杂度空间复杂度评价可以找到目标节点O(bd)O(bd)可以找到最优解d = 10, d = 5时,迭代深度搜索 IDS 和 广度搜索 BFS 生成节点数目: N(IDS) = 50+400+3000+20000+100000 = 123450
这里,理解为 第一层10个节点重复生成了5次,第二层 10*10个节点被生成了4次,以此类推。
N(BFS) = 10+100+1000+10000+100000 = 111110
这里理解为 第一层生成10个节点,第二层 10*10,以此类推。
可以看出迭代深度算法的性能并不比广度优先搜索差太多。
如果同时从正向和反向搜索,最后两个方向的算法遍历的节点能遇见。
但反向搜索难以实现,甚至在一些问题中无法实现。
若能实现,则空间和时间复杂度均为 O(bd/2),能否找到解和最优解,就取决于选择的搜索策略。