图的搜索分类:

BFS(广度优先搜索) 和 DFS(深度优先搜索)

两个最基本的搜索,一个是按深度进行搜索,另一个是按广度进行搜索...

记忆化搜索(基于深搜)

就是用一个数组,dp[state] 表示state这个状态的结果,如果进行深搜时,发现已经得出dp[state]的结果了,就直接 return dp[state];

双向广搜

从初始结点和目标结点开始分别作两次BFS,每次选择队列中结点少的一边进行扩展,并且检测两边是否出现了状态重合

[cpp] view plaincopy
  1. //双向广搜代码框架
  2. struct State { }; //状态
  3. queue<State>que[2];
  4. bool vis[2];
  5. bool flag;
  6. void bfs(int d) {
  7. int size=que[d].size();
  8. while(size--) {
  9. //普通单广转移新状态v
  10. if(vis[d][v]) continue;
  11. if(vis[d^1][v]) {
  12. flag=true;
  13. return;
  14. }
  15. //新状态入队
  16. }
  17. }
  18. int dbfs() {
  19. //初始化
  20. int cnt=0;
  21. while(true) {
  22. cnt++;
  23. if(que[0].size()<que[1].size()) bfs(0);
  24. else bfs(1);
  25. if(flag) break;
  26. }
  27. return cnt;
  28. }

二分状态搜索

多半应用于背包的搜索,就是给你n<=30个物品,每个物品有一定的价值(Value<=10^9),问你将其分成两堆,使得两堆的总价值和差值最小是多少.

如果我们直接dfs搜索的话,复杂度会达到O(2^n).极限复杂度就是 2^30 !!!

我们可以先记录sum为所有物品的价值总和,然后先将前15个物品的所有组合状态用一个hash[state]记录下来,然后按价值排序.

再对后15个物品枚举组合状态,记其组合的价值为Val,那么我们在hash[]中二分查找一个状态state,使得Val+hash[state]最接近sum/2(就是总价值的一半)...然后最小差值就在 O( (2^15) * log2(2^15) ) + O( (2^15)*log2(2^15) )  [前15个状态排序+后15个状态二分的复杂度] 的时间内完美解决了...

启发式搜索

启发式合并,很好很强大.Nlog(N)的复杂度.

与或树搜索

如果是一个与节点,那么其子状态中如果有一个状态是false,那么与节点的值就是false,也就是说子状态都要是true,它才是true.

对于一个或节点,只要其子状态中有一个状态是true,那么它就是true,也就是说子状态都是false,它才是false.

好比下棋.我想要赢,那么轮到我下的时候,如果我棋子下在某个位置后,可以保证我能赢,那么我就能赢.(我就是或节点)

博弈树搜索(α-β剪枝) (极大极小过程搜索)

例题:给出一个n*n的棋盘(n<=8).

0和1两个玩家轮流操作,0先
                  0玩家在棋盘的空位上放置0,1玩家放置1
                  当棋盘放满时查询两个玩家最大连通块中棋子的个数
                  玩家得分为比对方多的棋子的个数

这就是传说中的 Alpha-Beta剪枝!!

A*搜索

定义一个估计函数 G = g(x) + h(x) . 其中g(x)为你实际已经走过的距离,然后其重点就在 h(x) 的选择,比如迷宫搜索最短路时,可以选择 h(x)为到终点的曼哈顿距离.那么如果用BFS实现,那么用一个优先队列,使得每次增广时选择G小的先增广,这样搜最优解的希望更大一些.如果是DFS的话,假设我们目前已经搜到的最优解为Ans,那么我们再搜另一个状态他的G如果大于Ans,那么就没有必要再搜下去了,剪掉...

A*的关键就在h(x)的选择,一般选择的都是:离目标状态最少还要花费多少步数.(当然这并不是说这样是最好的h(x).只是普遍的选择...).根据不同的需要,你也可以定义一个更强大的h(x)来,让你的搜索快的飞起来~~~

IDA*搜索

就是从小到大(当然你也可以二分枚举)不断限制搜索的深度,然后去做DFS半的A*,当搜到一个解的时候,那就是最优解了(如果是二分的话,还需缩小深度继续搜).因为我们是从小到大枚举的...

h()函数:①曼哈顿距离
              ②魔方旋转类,每次如果会改变c个数字,那么 ( 曼哈顿距离和+(c-1) )/c 作为估计函数.

反正就是当前状态到大最终状态最理想情况下最少需要多少步来当做估计函数h().

哈希方法:

朴素的哈希:将这9个数的排列转化为一个int范围的值,范围过大

散列表哈希:转化为一个int值后对大素数取模,然后线性解决冲突

map哈希: 直接把状态使用map进行hash,太慢了

字符串哈希:将状态转换成字符串,用字符串hash,可能会有冲突

形状哈希: 特殊点的位置及物体的形状进行hash. (例如:贪吃蛇,对其蛇头位置及弯曲形状进行hash.)

[cpp] view plaincopy
  1. const int M=1000007;
  2. unsigned int HASH(char *str)
  3. {
  4. int hash=0,i=0;
  5. while(str[i]) hash=hash*7+(*str++);
  6. return((hash&0x7FFFFFFF)%M);
  7. }

图的搜索分类【夏天的风】相关推荐

  1. 南华大学计算机学院吴取劲,一种基于图深度优先搜索的基本路径集自动生成优化算法-南华大学学报.PDF...

    26 3 ( ) Vol. 26 No. 3 第 卷第 期 南华大学学报 自然科学版 2012 9 Journal of University of South China (Science and ...

  2. 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))

    机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...

  3. R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join)、配对图可视化(根据分类变量的值为散点图上的数据点添加颜色)

    R语言配对图可视化:pivot_longer函数将宽格式的数据重塑为长格式并进行数据全连接和左连接(left join).配对图可视化(根据分类变量的值为散点图上的数据点添加颜色,Add color ...

  4. Py之matplotlibseaborn :高级图可视化之​​​​​​​Q-Q分位数图probplot、​​​​​​​boxplot箱线图、stripplot分类散点图案例应用及代码实现

    Py之matplotlib&seaborn :高级图可视化之Q-Q分位数图probplot.boxplot箱线图.stripplot分类散点图案例应用及代码实现 目录 基于百分位数原理寻找异常 ...

  5. 题目2:隐式图的搜索问题(A*算法解决八数码)

    数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...

  6. 图卷积 节点分类_在节点分类任务上训练图卷积网络

    图卷积 节点分类 This article goes through the implementation of Graph Convolution Networks (GCN) using Spek ...

  7. 数据结构之图:图的搜索,Python代码实现——23

    图的搜索 深度优先搜索(Depth First Search) 定义 从例子出发理解 DFS是一种用于遍历或搜寻树类或图类数据结构的算法,这种算法从根结点出发(如果是图,则任意选择一个顶点作为根结点) ...

  8. 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...

    数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...

  9. 图论 —— 图的搜索

    [概述] 图的搜索问题,是给出一个抽象的字符矩阵代表一张图,根据根据题目要求,对图进行搜索,关于搜索算法:点击这里 根据搜索方法的不同,分为深度优先遍历(DFS).广度优先遍历(BFS),两者时间复杂 ...

最新文章

  1. des加密算法python代码_python des加密算法代码(pydes模块加密)
  2. GitHub 标星 5.7w,如何用 Python 实现所有算法?
  3. [恢]hdu 2074
  4. SqlServer两表之间:根据一个表的字段更新另一个表的字段
  5. xm list源码分析
  6. 软件系统介绍文档模板
  7. jaxen-1.1-beta-6.jar的用处
  8. vue实现简单的日历
  9. 前端web设计师_Web设计师的时尚Web设计主题
  10. 渗透测试-第一步 信息收集 【详细介绍】
  11. 【报错】Verion 9 of Highlight.js has reached EOL
  12. dubbo中bugger集
  13. mysql修改变量立即生效_mysql变量修改及生效
  14. 2021上海建筑施工八大员之安全员模拟题集及答案解析
  15. 【脚本项目源码】Python制作艺术签名生成器,打造专属你的个人艺术签名
  16. 空气开关A型、B型、C型、D型的区别
  17. Excel VBA中的If,Select循环语句
  18. 《甄嬛传》解读--后宫女人的心酸血泪史之腹黑学
  19. Vue预览PDF,使用vue-pdf,基本使用教程
  20. android metal,魅蓝metal评测:金属机身/Flyme5.1系统

热门文章

  1. 出行服务+AI —— 一次模拟的创业
  2. 微盟2018校园招聘面试题学习
  3. 物联网 Internet of things(IoT) M2M
  4. 如何写好论文讨论部分
  5. 物联网碰壁后,这位创业者总结失败五大原因
  6. Unity复刻骑砍中的帝国象棋(一)
  7. 计算机课可以用mac吗,粉笔直播课可不可以用苹果电脑看
  8. (ssl2293)暗黑游戏
  9. 超多制作模板的姓氏头像生成器微信小程序源码
  10. 内网穿透工具zerotier的安装及使用