首页 > 其他分享 >搜索

搜索

时间:2024-02-21 15:01:53浏览次数:19  
标签:优先 DFS BFS 枚举 搜索 回溯

搜索

发现上一篇写的有点简略,于是重发一遍吧;
(BFS)待更新(to be continue);

概述:

主要分为DFS与BFS;

本质上为暴力枚举,但是要充分发挥人类智慧

当F为栈时,则算法为DFS(先进后出,即回溯的过程);

当F为队列时,则算法为BFS(先进先出,先处理的为相近的节点);

结束条件:点集F为空时;

具体处理看题目操作;

DFS与BFS不同:

DFS: 操作步骤字典序最小的解

BFS:操作步骤最小的解

DFS(深度优先搜索)

顾名思义,深度优先搜索,即搜索的一种;

在搜索时,优先向下一深度搜索,可以被用作实现回溯算法。

主要实现方法一种是依靠递归函数,另一种为栈;

(回溯算法):

在枚举时,枚举所有可能的选项,然后判断是否合法。合法则填写下一个选项,后继续。

否则就没有继续的必要了,不用再往下枚举了,而是尝试更换上一个选项的填空(即回溯)

继续枚举;

这种算法称作回溯算法,常用深度优先搜索来实现;

流程框架:

删除部分与蓝字部分为递归DFS与一般搜索不同之处;

虽然在结果上应该没有问题,但具体的代码方面两者可能大有不同

遍历经历:

若使用DFS的搜索方法;

在下图树各点中的遍历方法为:

0 - > 1 - > 3 - > 5 - >3 - > 6 - > 3 - > 1 - > 4 - > 7 - > 9 - > 7 - > 4 - > 1 - > 0 - > 2 - > 8 - >9;

可以看到遍历方法优先增加深度(即 层数)

即能向下一层移动,就先向下一层移动,若没有,则回溯到上一层

形象点说是 《长驱直入》,也可以说是一条路走到黑(再回头);

典型的递归(不是吗)

DFS模版

int dfs(int k)             //k为递归层数,或要填第几个空
{
    if(满足输出条件,或空全被填完)     //即递归出口
    {
        输出解;             //若有特殊输出格式,用自定义的 void print 函数
    }
    else
    {
        for(int i=1;i<=尝试方法数;i++)
            if(满足进一步搜索条件(合法))
            {
                为进一步搜索所需要的状态打上标记(保存现场);
                dfs(k+1);
                恢复到打标记前的状态(恢复现场);         //也就是说的{回溯一步}
            }
    }
}

此上为DFS的模版(一般的)可以看出主要依靠不断回溯来找到问题的解;

注意事项:

  1. 第一个if是符合输出解的条件,第二个if是符合进一步搜索的条件;

  2. 下一步搜索时,不是使用return dfs(k+1)而是直接dfs(k+1)

    (可能会注意不到这个关键的地方,以至于每次写完不知道为什么只得到一个答案就返回主程序了)

  3. for 循环之后的 if 可以是多个;

  4. for 循环边界

例题

一种为说排列型:
题意:

按照字典序输出自然数 1 到 n 所有不重复的排列

可以看出输出解的条件为当前已选的数的个数为n时,打印解(用print函数);

否则继续搜索;

代码如下:
另一种为组合型
题意:

从\(n\)个元素中选\(r\)个,共有多少种组合

思路:

由于是组合,所以与排列不同,组合不考虑元素的顺序

顺序:依次枚举每个位置放哪个数

具体代码:

后记

不过这种方法也有不足之处

也用此图解释,若解为 \(2\) 时(或解答树比较稀疏时),这时遍历全部的树节点是完全没有必要的;

当然我们也有解决的办法(即广度优先搜索(BFS))

这也就显现出了DFS与BFS的不同和各自的适用范围

to be continue

标签:优先,DFS,BFS,枚举,搜索,回溯
From: https://www.cnblogs.com/adsd45666/p/18025218

相关文章

  • 2024年十大磁力搜索引擎排名下载教程-JAVA
    磁力技术相对比较顶尖的几大磁力厂商推荐使用磁力导航  www.okeyl.com随着互联网的发展,搜索引擎已经成为人们日常生活中必不可少的工具之一。每当我们想查找信息时,我们都会去使用搜索引擎。然而,在众多的搜索引擎中,哪些才是真正有用的呢?下面我们就来探讨一下搜索引擎前十排名。......
  • 代码随想录算法训练营第二十三天|669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉
    669.修剪二叉搜索树 题目链接:669.修剪二叉搜索树-力扣(LeetCode)思路:本题原来想沿用上一次最后一道题的思路,用删除二叉搜索树特定值节点的方法来解决,但是会报错,找不出问题所在(在评论区也是一堆套用450代码报错的)。只能参考官网答案了。官网的方法没有用delete,但是思想是一直......
  • 百度搜索exgraph图执行引擎设计与实践
    导读百度搜索exgraph图执行引擎设计重点分成三个部分:图描述语言、图执行引擎、对接扩展。图描述语言是一种基于文本可读的图描述语言,用于描述任务中的算子以及算子之间的依赖关系,即让人可以理解,也可以被计算机理解并执行。图执行引擎是exgraph的核心,负责根据图描述语言生成的......
  • bs4搜索文档树
    数据准备:#导入模块frombs4importBeautifulSoup#查询数据文本html_doc="""<html><head><title>TheDormouse'sstory</title></head><body><pclass="title"id='id_xx'xx='zz'&......
  • 代码随想录算法训练营第二十三天 | 538.把二叉搜索树转换为累加树, 108.将有序数组转
     669.修剪二叉搜索树 已解答中等 相关标签相关企业 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low,high]中。修剪树 不应该 改变保留在树中的元素的相对结构(即,如果......
  • (20/60)二叉搜索树的最小绝对差、二叉搜索树中的众数、二叉树的最近公共祖先
    过外婆八十寿宴,补卡二叉搜索树的最小绝对差leetcode:530.二叉搜索树的最小绝对差双指针中序遍历法思路搜索树的最小绝对差一定出现在中序遍历的相邻两个元素之间。设置前后两个指针,每次对比“历史最小”与当前node->val-pre->val的值哪个更小,进行相应更新。复杂度分析......
  • Google搜索操作符:让你秒变搜索专家
    搜索引擎对互联网的重要性不言而喻,不过,随着ChatGPT及其类似AI工具的推出,对搜索引擎带来了前所未有的挑战。因为ChatGPT具有自然语言处理能力,能够更好地理解用户的搜索意图,提供更准确、更相关的搜索结果。同时,还可以根据用户的搜索历史和行为数据,为用户提供更加个性化的搜索体验,推......
  • 代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树
    二叉搜索树的最近公共祖先 题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)思路:只要利用二叉搜索树特性,只要当前节点的值位于要求的两个节点之间,就必定是我们要找的节点。最简单的一集。classSolution{public:TreeNode*lowestCommonAncestor(TreeNode*root,......
  • Spring Boot整合Postgres实现轻量级全文搜索
    有这样一个带有搜索功能的用户界面需求:搜索流程如下所示:这个需求涉及两个实体:“评分(Rating)、用户名(Username)”数据与User实体相关“创建日期(createdate)、观看次数(numberofviews)、标题(title)、正文(body)”与Story实体相关需要支持的功能对User实体中的评分(Rating)的频繁修......
  • [win_os] chrome浏览器 -- 添加自定义搜索引擎并将其设置为默认搜索引擎(转载裁切
    [win_os]  chrome浏览器 -- 添加自定义搜索引擎并将其设置为默认搜索引擎(转载裁切)    一、必要说明  1、添加搜索引擎【bing】:https://global.bing.com/search?q=%s  2、重点说明【红色部分一点都不能错】:https://global.bing.com/sea......