pascal 深搜

如题..深搜是什么算法?最好带流程图。 说懂追150,谢了
额..虽然全都看不懂..但还是很感谢几位的回答..

深度搜索是数据结构中 树形结构的一种遍历方法 所谓遍历 就是一个一个查找 搜索就是遍历所有结点并且检查关键字是否匹配 树的深度搜索和广度搜索区别就是 深度搜索是按照深度优先原则 先笔直往下找子结点 找到那个结点后 又找这个结点的子结点。

与深搜对应的就是广度搜索,是按照以层为优先进行搜索 树都是一层一层的 找到一个结点后 又找这个结点的兄弟结点。

追问

树型数据结构是什么?在什么数据处理时会用到?

追答

要详细解析树形数据结构,那内容可以写一本书了。
数据结构本来就是一个学科。

简单的说,数据结构是用一种合理的的方法组织数据,目的是让写数据和读数据的时候更加便捷和高效率。

举个例子,如果你要向一棵没有叶子的树上挂上树叶,那树叶的数量可能以万为单位的,每片树叶都有一个独一无二的编号。挂上去后,当你要从树上找指定编号的树叶时,如果挂的时候没有很好的组织和编排树叶的位置,那找的时候就是一场噩梦。良好的数据结构,可以大大的缩短查找树叶的时间。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-25
深度搜索与广度搜索的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。由于其保留了所有的前继节点,所以在产生后继节点时可以去掉一部分重复的节点,从而提高了搜索效率。这两种算法每次都扩展一个节点的所有子节点,而不同的是,深度搜索下一次扩展的是本次扩展出来的子节点中的一个,而广度搜索扩展的则是本次扩展的节点的兄弟节点。在具体实现上为了提高效率,所以采用了不同的数据结构.

[深度搜索]
<Var>
Open:Array[1..Max] of Node;(待扩展节点表)
Close:Array[1..Max] of Node;(已扩展节点表)
openL,closeL:Integer;(表的长度)
New-S:Tsituation;(新状态)
<Init>
Open<-0; Close<-0;
OpenL<-1;CloseL<-0;
Open[1].Situation<- 初始状态;
Open[1].Level<-1;
Open[1].Last<-0;
<Main Program>
While (openL>0) and (closeL<Max) and (openL<Max) do
Begin
closeL:=closeL+1;
Close[closeL]:=Open[openL];
openL:=openL-1;
For I:=1 to TotalExpendMethod do(扩展一层子节点)
Begin
New-S:=ExpendNode(Close[closeL].Situation,I);
If Not (New-S in List) then
(扩展出的节点从未出现过)
Begin
openL:=openL+1;
Open[openL].Situation:=New-S;
Open[openL].Level:=Close[closeL].Level+1;
Open[openL].Last:=closeL;
End-If
End-For;
End;
范例:迷宫问题,求解最短路径和可通路径。
评价:深度搜索多用于只要求解,并且解答树中的重复节点较多并且重复较难判断时使用,但往往可以用分支定界或回溯算法代替。

希望这个回答对你有帮助!~追问

树型数据结构是什么?在什么数据处理时会用到?

第2个回答  2011-02-26
一、深度优先搜索的过程

深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。在深度优先搜索中,对于最新发现的节点,如果它还有以此为起点而未搜索的边,就沿此边继续搜索下去。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v有那条边的始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被发现为止。

这种在搜索过程中,深度大的结点先进行扩展的算法,我们就称它为深度优先搜索法。英语称之为Depth-First-Search,简称为DFS法。

二、深度优先搜索法有两个显著特点

(1)对已产生的结点按深度排序存储,深度大的先得到扩展,即先产生它的子结点;

(2)深度大的结点是后产生的,但先得到扩展,即“后产生先扩展”。因此该算法应该用堆栈作为的主要数据结构存储产生的结点:先把产生的数入栈,然后产生栈顶(即深度最大的结点)的子结点。子结点产生完后,出栈(pop)再产生栈顶的子结点。

三、深度优先搜索算法描述

程序实现有两种方式--递归与非递归。

递归
递归过程为:
Procedure DEF-GO(step)
for i:=1 to max do
if 子结点符合条件 then
产生新的子结点入栈;
if 子结点是目标结点 then 输出
else DEF-GO(step+1);
栈顶结点出栈;
endif;
enddo;
主程序为:
Program DFS;
初始状态入栈;
DEF-GO(1);

非递归
Program DEF(step);
step:=0;
repeat
step:=step+1;
j:=0;p:=false
repeat
j:=j+1;
if 结点符合条件 then
产生子结点入栈;
if 子结点是目标结点 then 输出
else p:=true;
else
if j>=max then 回溯 p:=false;
endif;
until p=true;
until step=0;
回溯过程如下:
Procedure BACK;
step:=step-1;
if step>0 then 栈顶结点出栈
else p:=true;

两种方式本质上是等价,但两者也时有区别的。

1. 递归方式实现简单,非递归方式较之比较复杂;

2. 递归方式需要利用栈空间,如果搜索量过大的话,可能造成栈溢出,所以在栈空间无法满足的情况下,选用非递归实现方式较好。追问

树型数据结构是什么?在什么数据处理时会用到?

追答

树型结构是一类重要的非线形数据结构。其中以树和二叉树最为常用,直观看来,树是以分支关系定义层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织结构都可以用树来形象表示。如下图的家谱结构。

图6.1一个家族的结构

树在计算机科学的许多领域中有着广泛的应用。人们用树进行电路分析;用树表示数学公式的结构;在数据库系统中,用树组织信息;在编译过程中,用树表示源程序的句法结构。本章重点讨论树的一些基本概念,二叉树的存储结构及各种操作,并研究树和森林与二叉树的转换关系。

第3个回答  2011-02-26

深搜就是深度优先搜索,从名字上可以看出,深度——由浅入深,为标准进行的搜索,就像是你从你爷爷辈开始点人头,每次都要数到辈数最小,数到后又像上辈数,如果一个上辈有下辈的话,就又数到辈数最小的。

追问

树型数据结构是什么?在什么数据处理时会用到?

第4个回答  2011-02-25
至于深搜 额....
就是 用递归调用加回溯
基本格式大概是这样的
procedure dfs(x:longint);
begin
if 这里写跳出这个递归的条件 满足就是搜到了要找的
if 这里写你的程序的应满足条件
then ...
dfs(); 从这里开始继续向下搜索
上个if里 你对某些变量做了修改 但他不一定正确 所以你应在这里写一个回溯
即把then里的东西弄回去 可以理解成返回上一种情况(dfs最重要的部分)
end;
不大好解释..
但说白了就是有点特殊的枚举 枚举方向与别的枚举不大一样
建议楼主去翻翻竞赛书 上网上找个ppt看看追问

树型数据结构是什么?在什么数据处理时会用到?

参考资料:自己写的