搜索总结)(深搜和广搜)
一.个人理解
(以下只是个人理解,觉的有问题就忽略他)搜索本质就是对图的遍历,也就是考虑全部的情况后找出需要的结果。这和动态规划思想基本一样,不一样的在于优化的方向不同。搜索优化在于剪枝,也就是把不需要的情况减去从而优化(还有对结果预测如A*算法,现在还不大会以后会了在总结吧)。而动态规划则是利用空间记录重复过程的值,从而减少重复遍历而达到优化(有点像递推,从小往大推,保存小的推大时候不用再求小的)。所以动态规划本质也就是优雅的暴力(以空间换时间)。(暴力出奇迹0.0)
二. 基础知识
一.遍历
首先搜索虽然是对图的搜索,但是大部分图节点都是只遍历一次,这样的话图遍历也就可以看做树遍历。而树的遍历分层次遍历,先序遍历,中序遍历,后序遍历4种。而层次遍历一般借助队列完成。先中后则借助递归完成(输出节点顺序不同,遍历过程一样)。这也就是广度优先搜索和深度优先搜索了。
二.图的存储
图的存储分有两种:基于二维数组邻接矩阵和链表邻接表。在c++ STL提供头插法的邻接表vector,而值得一提是自己身模拟尾插邻接表的效率会大于STL提供的vector。不理解的看下图:(有几张自己画丑了点将就看吧)
邻接矩阵:
头插法邻接表:
尾插法邻接表:
三.广度优先搜索
广度优先搜索的搜索顺序就是每个父亲节点的子节点遍历完才遍历新的节点。以上图为例,起点为v0,那么他的遍历顺序就是:v0->v1->v3->v2->v4;先遍历v0子节点v1,v3。遍历完后遍历v1的子节点v2,v4.然后发现全部节点遍历完了(如果遍历v0子节点时先遍历v3那么v0结束后先遍历v3的子节点。这和存储的结构顺序有关)。
对于算法的实现,不难看出哪个节点先出现先遍历哪个节点,能实现先进先出的结构当然是队列了。所以广度优先借用队列实现。STL提供queue(队列),当然你也可以直接模拟。
代码:
void BFS(Graph G){ ///G图,G.num节点数for (int v=0;v<G.num;v++) ///先将其所有顶点都设为未访问状态visited[v]=false;queue<int> Q;for(int v=0;v<G.num;v++) {if(visited[v]==false){ ///若该点没有访问Q.push(v); ///将其加入到队列中visited[v]=true;while (!Q.empty()){ ///只要队列不空,遍历就没有结束int t =Q.front(); ///取出对头元素Q.pop(); printf(" %d ",t+1); ///打印节点for(int j=0;j<G.num;j++) ///将其未访问过的邻接点加进入队列if(G.arcs[t][j]==1&&visited[j]== false) {Q.push(j);visited[j]=true; ///在这里要设置true为了防止重复加入!}///if}//while}///if }///for
}///BFS
四.深度优先搜索
深度优先搜索的搜索顺序就是每次选父节点中的一个子节点进行搜索不断下移,直到子树为空后回溯。以上图为例,起点为v0,那么他的遍历顺序就是:v0->v1->v2->v3->v4;先遍历v0子节点v1。然后遍历v1的子节点v2.接着遍历v2子节点v3,发现v3子节点都遍历过了(也就相当子节点为空)所以返回v2节点,再遍历v2子节点v4。最后一层层返回(节点都遍历了)。(有灭九族的味道,从爷爷开始杀,杀了大伯,杀大伯儿子,杀完大伯杀二伯一家,最后一个不留)。
其思想就是递归,递归至最深层,开始一层返回。而递归控制好三点就基本没问题:1.递归出口,也就是结束条件。2.递归的条件,类似递推公式找到共通部分。3.传的参数,递归不断进行参数在不断改变。
代码:
void DFS(Graph G,int v)
{visited[v]= true; ///从V开始访问,flag它printf("%d",v); ///打印出节点。for(int j=0;j<G.num;j++) if(G.arcs[v][j]==1&&visited[j]== false) ///这里可以获得V未访问过的邻接点DFS(G,j); ///递归调用,如果所有节点都被访问过,就回溯,而不再调用这里的DFS
}
for (int v = 0; v < G.num; v++)visited[v] = false; ///刚开始都没有被访问过for (int v = 0; v < G.num; ++v)if (visited[v] == false) ///从没有访问过的第一个元素来遍历图DFS(G, v);
搜索总结)(深搜和广搜)相关推荐
- 专题一:简单搜索、深搜、广搜
挑战程序设计竞赛(课后题难题汇总) 1. AOJ 0033 Ball(贪心) #include<cstdio> #include<algorithm> using namesp ...
- Go 分布式学习利器(15) -- Go 实现 深搜和广搜
强化语法,回顾算法. 通过Go语言实现 深度优先搜索 和 广度优先搜索,来查找社交网络中的三度好友关系(三度指的是一个节点到 其相邻节点 到 其相邻节点的节点 ,图递增三层好友关系). 涉及到的Go语 ...
- 深搜和广搜的原理及优缺点
深搜原理 深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇 ...
- 深搜和广搜(初学者)
搜索入门 最近对搜索有了一点浅显的了解,想跟大家分享分享. 说起来我也是初学者,恰巧有些自己的理解,想起来自己开始学习搜索的情况,真是一把鼻子一把泪啊.所以想把我领悟的过程,看到的一些基础的我觉得好的 ...
- 深搜、广搜、搜索剪枝
搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...
- 算法之路——深搜、广搜(简单搜索)
搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...
- 深搜DFS\广搜BFS 图初步入门
首先,不管是BFS还是DFS,由于时间和空间的局限性,它们只能解决数据量比较小的问题. 深搜,顾名思义,它从某个状态开始,不断的转移状态,直到无法转移,然后退回到上一步的状态,继续转移到其他状态,不断 ...
- 搜索算法-深搜与广搜
1.深搜与回溯法 *本文主要是供自己复习,或者做笔记总结使用,专业性有待考量,如果遇到不对的地方还请指出来. 什么是回溯法?枚举每一个填空的选项,然后判断这个选项是否合法.如果合法则继续填写下一个选项 ...
- 深搜+回溯+广搜小结
深搜 按照一定的顺序和规则,一直往深处走,直到走不通再返回,换一种路径重复上述步骤. 深搜一般可以找到问题的所有答案,但问题规模较大时,解集树的深度就会比较大并且比较宽,时间复杂度就会较高.与广搜相比 ...
- 深搜及广搜的实际应用
这一周通过对搜索题目的大量练习,对于搜索也是有了一定的理解,首先对于深搜来说,有几种题型: 一.有一部分题目指示的很明确,也是基本的深搜类型,比如连通块类型,是显式的深搜 P1596 [USACO10 ...
最新文章
- installshield 2009实现安装包自动编译
- 流浪:从南海到北海,面朝大海,春暖花开。
- java数组之binarySearch查找
- clover引导macos big sur_安装MAC OS系统看完后能让你马上用上最新苹果系统
- pcb地线应该不应该做成环路_PCB制板的基础知识,你都学会了吗?(中)
- Firefox终于返回到了Debian stable
- 开源会议系统openmeetings安装
- 笔记《javascript高级程序设计》 第12章 DOM2和DOM3
- 终于把公司的底裤扒了!
- Python标准库random用法精要
- 手工释放linux内存——/proc/sys/vm/drop_caches
- 中国塑料加工机械市场趋势报告、技术动态创新及市场预测
- Go基础编程:复合类型—切片slice
- 《MySQL数据库》关联查询
- 物联网毕设----智能鱼缸
- 分享一下支付宝的支付(soEasy)
- 使用Python爬取招聘数据、数据处理与可视化
- 国家信息安全水平考试NISP考试经验分享
- linux12企业实战 -- 37zabbix企业微信通知配置
- 4G IoT设备开发,一板搞定
热门文章
- [Python] openpyxl读存大数据 Exception: String longer than 32767 characters
- 将element-plus分页组件由默认英文,改为中文
- 吴恩达机器学习ex2-logistic regression python版
- 最新Navicat Premium 16下载与安装
- Windows 8.1中添加美式键盘
- 以问题为导向剖析一些矩阵等价类的本质(合同篇)
- 京东三级列表页持续架构优化
- 从贝叶斯滤波理论到容积卡尔曼滤波算法(CKF)详细推导及编程实现常转弯率模型估计。(matlab)
- 数据绑定控件收藏 DropDownList ListBox GridView DataList Repeater FormView DetailsView
- 作为程序员你是如何学习的?