实用搜索算法基础.ppt

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因此,搜索表可以区分为静态搜索表(表的结构不发生改变)和动 态搜索表两种情况。
常见的适用于静态搜索表的搜索算法有顺序搜索、折半搜 索、Fibonacci搜索等。适用于动态搜索表的搜索算法有二 叉搜索算法、平衡二叉搜索算法等。
6.1 树的搜索
当搜索表的数据很大时,如果一次无法将整个搜 索对象都读入内存时,通常只将数据对象的关键 字(用于表示搜索条件的数据对象的属性)和它 的存放位置信息存放到内存
如果 k 大于根结点的关键值,则正好相反,只需在右子 树中搜索即可。如果 k 等于根结点的关键值,则搜索成 功,搜索操作终止。
6.1.1 二叉搜索树搜索
(2)插入操作
对于动态搜索表,在搜索不成功的情况下,需要插入关 键字等于给定值的记录。
从搜索的过程容易得出插入的操作过程为:若二叉搜索 树为空树,则新插入的结点为根结点;否则,新插入的 结点必为一个新的叶子结点,其插入位置由搜索过程中 得到。
深度优先类似于二叉树的前序遍历 广度优先类似于二叉树的按层遍历
6.2.1 深度优先搜索
深度优先搜索(Depth Fisrst Search,简称DFS)类似于树 的先根遍历,是树的先根遍历的推广。该搜索方法常用于 游戏软件开发中。
深度优先搜索的核心思想是在搜索到尽头时,用栈记住下 一步的走向。
假设初始状态是图中所有顶点未曾被访问,则深度优先搜 索可从图中某个顶点v出发,访问此顶点,然后依次从 v 的 未被访问的邻接点出发深度优先遍历图,直至图中所有和v 有路径相通的顶点都被访问到;若此时图中尚有顶点未被 访问,则另选图中一个未曾被访问的顶点作起始点,重复 上述过程,直至图中所有顶点都被访问到为止。
V0V1V2V3V5V4
显然这是一个递归的过程。为了在遍历过程中便于区分顶点是否被访问, 需附设访问标志数组visitedFlag,初始值都为false。 深度优先搜索结果不唯一
6.2.1 深度优先搜索
在遍历图时,对图中每个顶点至多调用一次深度优先搜索 方法,遍历图的过程实质上是对每个顶点查找其邻接点的 过程,其耗费的时间取决于所采用的数据结构。
这样就可以在内存中实施对大量的数据对象的搜 索操作。
存储数据对象的关键字和它的存放位置信息的结 构称为索引。基于索引的搜索在数据库管理系统 中应用非常广泛。
6.1.1 二叉搜索树搜索
二叉搜索树(Binary Search Tree)是一棵空树,或 具有如下4个特征的一棵非空的二叉树:
① 每个元素有一个关键值,并且没有任意两个元素具有 相同的关键值。因此,所有的关键值都是惟一的。
③ 被删除的结点只有右子树。只需将该结点的右子结点代替它的位 置,再释放该结点即可。
④ 被删除的结点既有左子树,也有右子树。只需将该元素替换为它 的左子树中的最大元素或右子树中的最小元素。
6.2 图的搜索
在图中实现的最基本的操作就是搜索从一个指定顶点可以到达哪些顶点。 确切地讲,图的搜索是指从图中的任一顶点出发Baidu Nhomakorabea对图中的所有顶点访 问一次且只访问一次。
6.1.1 二叉搜索树搜索
(3)删除操作
和插入相反,删除需要在搜索成功之后才能进行,并且要求在删除二 叉搜索树上某个结点之后,仍然保持二叉搜索树的特性。删除操作可 分如下4种情况:
① 被删除的结点是叶子结点,只需直接删除其双亲结点指向它的指 针,然后释放该结点即可。
② 被删除的结点只有左子树。只需将该结点的左子结点代替它的位 置,再释放该结点即可。
② 根结点左子树的关键值(如果有的话)小于根结点的 关键值。
③ 根结点右子树的关键值(如果有的话)大于根结点的 关键值。
④ 根结点的左右子树也都是二叉搜索树。
6.1.1 二叉搜索树搜索
(1)搜索操作
首先从根结点开始,如果根结点为空,那么搜索树不包 含任何元素,搜索失败。
否则,将待搜索值k与根结点的关键值相比较,如果 k 小于根结点的关键值,那么就不必搜索右子树中的元素, 只要在左子树中搜索即可。
图的搜索操作是图的一种基本操作,图的许多复杂操作
例如:求解图的连通性问题、拓扑排序、关键路径等都是建立在遍历操作的基 础之上的。
常用的搜索图的的方法有深度优先搜索和广度优先搜索两种方法。它们 对无向图和有向图都适用。在以后的讨论中,除非特别说明,都假设图 是连通的,即可以从一个顶点出发找到其它所有顶点。
广度优先搜索
广度优先搜索(Breadth First Search,简称BFS)类似于树 的按层次遍历的过程。它广泛应用于求解问题的最短路径、 最少步骤、最优方法等方面。 广度优先搜索遍历图的过程中以 v 为起始点,由近至远,依 次访问和 v 有路径相通且路径长度为 1、2、…的顶点。 遍历图的过程实质上是通过边查找邻接点的过程,因此广度 优先遍历的时间复杂度与深度优先遍历相同,不同之处仅仅 在于顶点的访问顺序不同。
6.2.1 深度优先搜索
无 一 为 曾向 个 V访1网 邻 问的图 接 ,第顶则从一点访顶个V问点邻1VV接。02点因开并始V从为0VV进已12行未 开经深曾 始访度访 出问优问 发,先, 进则搜则 行查索访 搜找。问 索其在。下V1访以一并问此个从顶类邻它点接推出V点,发0继之V进2续后行,搜,搜发索选索现访择。V2问第因未 V3,V5,V4。由此,得到顶点访问序列:
当用邻接矩阵存储图时,查找一个顶点的邻接点所需时间 为O(n) (n表示图中顶点数目),则总的时间复杂度为 T(n)=O(n2)。当采用邻接表存储图时,查找顶点V0的邻接 点所需时间为O(d(V0))(d(V0)表示顶点V0的度),则总的时 间复杂度为:
n1
T (n) O( d (Vi )) i0
第6章 实用搜索算法基础
石志国
大纲
◎ 二叉搜索树; ◎ 图的深度优先搜索、广度优先搜索;
6.1 树的搜索
搜索是进行数据处理最常见的一种运算。
所谓“搜索”:是指在数据集合中寻找满足某种特定条件 的数据对象。
由于搜索对象是一个数据的集合(称为搜索表),除了执 行搜索外,还可能执行其它操作,例如添加新元素,这样 就可能会改变搜索表的结构。
相关文档
最新文档