图的深度优先搜索

来源:互联网 发布:php时区设置 编辑:程序博客网 时间:2024/05/04 04:52

图的数据结构:

要表示一个图G(V,E)有两种常见的表示方法,邻接矩阵和邻接表。这两种方法可用于有向图和无向图。对于稀疏图,常用邻接表表示,
它占用的空间|E|要小于|V|*|V|。
邻接表:
图G(V,E)的邻接表表示由一个包含V列表的数组Adj组成,其中的每个列表对应于V中的一个顶点,对于v中的任意一个点u,邻接表Adj[u]
包含所有满足条件(u,v)属于E的点v,也就是Adj[u]中包含所有和u相邻的点。

邻接矩阵:
用一个矩阵表示,矩阵的横向和纵向分别为图中的点的有序排列,如果两个点之间有边相连对应的矩阵中的元素就是1,反之就是0.


         深度优先搜索,一句话总结,就是一直沿着当前路径搜索,直到没有路之后,重新回溯到一条新的路径上进行搜索。深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

        这种搜索策略比较盲目,算是一种穷举的策略,在数据复杂度较大时,很有花费大量的时间,甚至找不到解(面对NP问题只是理论上能找到解)。我们可以通过合理的剪枝来简化问题的难度,这样才有可能在大数据的情况下快速准确的找出一个解。

        同时,深度优先搜索配合一定的启发函数,能够避免盲目搜索,提高算法的效率。关于启发函数,我们应该对现有的问题进行抽象,构造合理的估值函数。

        另外,深度搜索还应该设立搜索的下界,避免陷入长时间无用解的搜索。

        关于回溯的思路,在回溯的时候应该直接回到上一个出口不唯一的父节点,回溯时要记住各种搜索状态的复位。

具体的算法描述可以看这个博客:

http://www.cnblogs.com/yanlingyin/archive/2011/12/26/Depth-firstsearch.html


0 0
原创粉丝点击