搜索分析(DFS、BFS、递归、记忆化搜索)

1、线性查找

在数组a[]={0,1,2,3,4,5,6,7,8,9,10}中查找1这个元素。

(1)普通搜索方法,一个循环从0到10搜索,这里略。

(2)递归(从中间向两边)

 //递归一定要写成记忆化递归
#include <bits/stdc++.h>
using namespace std;
bool vis[];
int count1=; void search(int n){
count1++;
if(n>||n<||vis[n]){
//cout<<"back"<<endl;
}
else if(n==){
vis[n]=true;
cout<<"find"<<endl;
}
else {
vis[n]=true;
search(n-);
search(n+); }
} int main(){
int a[]={,,,,,,,,,,};
search();
cout<<count1<<endl;
return ; }

递归(从中间到两边)

这种方法一定要加标记数组,不然会出现死循环。

其中一个死循环:

search(9)->search(8)->search(9)

而这样的死循环太多了。

其实分析的时候直接把递归的树形图画出来就好了,直观而且方便。

这样带有标记数组的递归,本质上就是记忆化递归。

所以这种环形的递归都可以写成记忆化递归。

(3)递归(从后面向前面)

 #include <bits/stdc++.h>
using namespace std; int count1=; void search(int n){
count1++;
if(n>||n<){
}
else if(n==){
cout<<"find"<<endl;
}
else {
search(n-);
}
} int main(){
int a[]={,,,,,,,,,,};
search();
cout<<count1<<endl;
return ; }

递归(从后面向前面)

这种方法是不需要标记数组的,因为递归是线性的,而不是环形的,递归之间没有交叉,不会造成重复访问。

这种和求阶乘的是一样的。

(4)BFS(从中间向两边)

 #include <bits/stdc++.h>
using namespace std;
bool vis[];
int count1=;
queue<int> que; void searchBFS(int n){
que.push(n);
while(!que.empty()){
count1++;
cout<<"count1:"<<count1<<endl; int tmp=que.front();
que.pop();
vis[tmp]=true;
cout<<"tmp:"<<tmp<<endl;
if(tmp==) {
cout<<"find"<<endl;
return ;
}
else{
if(tmp->=&&!vis[tmp-]) que.push(tmp-);
if(tmp+<=&&!vis[tmp+]) que.push(tmp+);
}
}
} int main(){
int a[]={,,,,,,,,,,};
searchBFS();
cout<<count1<<endl;
return ; }

BFS(从中间向两边)

这种BFS也是一定要带标记数组的,所以也可以写成记忆化。

这种BFS如果不带标记数组的话,也是可以得到正确答案的,不过会重复算很多算过的东西。

例如:9 8 10 7 9 9 6 8 8 10 8 10 .........

比如说上面的9就访问了很多次,而由于队列FIFO的特性,所以虽然重复算很多次,还是会得到正确答案。

因为7、6那一支会逐渐到1的。

当然,BFS也可以直接写成线性的,这样也是不需要标记数组的。

其实还是那样,把情况的树形图画出来就很舒服了,直观方便。

二、阶乘

(1)普通求阶乘方法:略。

(2)阶乘的递归实现DFS

阶乘的递归实现

 #include <bits/stdc++.h>
using namespace std;
int jiechen(int n){
if(n==) return ;
else{
return n*jiechen(n-);
}
}
int main(){
cout<<jiechen()<<endl;
return ;
}

DFS

从尾直接算到头,不需要标记数组

(2)阶乘的栈实现

 /*
伪码:
我们求f(n),f(n)入栈
在栈不空的情况下(下面循环)
出栈
f(n)=f(n-1)*n
如果f(n-1)没有被求出来,直接入栈
*/ //对数组而言,我们操作的肯定是下标,而一定不是数组元素的值
#include <bits/stdc++.h>
using namespace std;
stack<int> sta;
int a[]; int jiechen(int n){
a[]=;
sta.push(n);
while(!sta.empty()){
int tmp=sta.top();
sta.pop();
//如果a[tmp-1]被计算了
if(a[tmp-]!=){
a[tmp]=a[tmp-]*tmp;
cout<<tmp<<" "<<a[tmp]<<endl;
}
else{
sta.push(tmp);
sta.push(tmp-);
}
}
return a[];
} int main(){
cout<<jiechen()<<endl;
return ;
}

阶乘的栈实现

对数组而言,我们操作(存储进栈或者队列或者其它操作)的肯定是下标,而一定不是数组元素的值 

其实栈实现和递归实现是一样的,因为递归在计算机内部就是用栈实现的。

搜索分析(DFS、BFS、递归、记忆化搜索)的更多相关文章

  1. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  2. 洛谷 P1141【BFS】+记忆化搜索+染色

    题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...

  3. hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  4. DFS——>记忆化搜索——>动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  5. hdu 1428(很好的一道题,最短路+记忆化搜索)

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. HDU 4628 Pieces(状态压缩+记忆化搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索  ...

  7. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

    链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...

  9. 路径方案数_mod_SPFA_记忆化搜索_C++

    本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...

  10. POJ1088滑雪(记忆化搜索)

    就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度. 因为可能会超时,DP的话每次就是记录,然后就不用回溯了. 很简单的DFS里面的记忆化搜索. #include <stdio ...

随机推荐

  1. Hibernate多表映射(三)

    一对多|多对一 一个分类对应多个商品,一个商品只属于一个分类 创建分类表 products用set装,set特点值不能够重复 package com.hibernate.domain; import ...

  2. Django学习案例一(blog):二. 连接数据库

    本例使用了django默认的sqlite3数据库,配置文件不需要作调整: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite ...

  3. WEB笔记-2 剖析CSS规则

    2.1 剖析CSS规则   规则即指令,其声明了需要修改的元素及要应用给元素的样式.     2.2 为文档添加样式的三种方法   行内样式:直接写在HTML文档标签中的style属性当中,行内元素只 ...

  4. java就业前景发展方向分析

    随着信息化的发展,IT培训受倒了越来越多人的追捧.在开发领域,JAVA培训成为了许多人的首选!java拥有强大的开发者的数量已超过了之前的900万,将近97%的企业电脑也在运行着java,其下载量每年 ...

  5. dispatch_sync:As an optimization, this function invokes the block on the current thread when possible

    两件事情: 1.是否是一个线程: 2.queue task 的目标线程是否有未完成的task. 模型:一个线程处理当前的task还有通过gc d派发来的待执行task. 猜测: 如果目标thread上 ...

  6. We wanted {"required":["value"]} and you sent ["text","value","id","sessionId"]

    重装python pycharm后再次执行以前执行没有问题的Appium脚本报错 We wanted {"required":["value"]} and yo ...

  7. apicloud图片上传

    app中的图片上传,例如:个人信息页面,上传头像 使用: UIMediaScanner 地址: https://docs.apicloud.com/Client-API/UI-Layout/UIMed ...

  8. PAT_A1145#Hashing - Average Search Time

    Source: PAT A1145 Hashing - Average Search Time (25 分) Description: The task of this problem is simp ...

  9. 数据结构与算法(2)- vector概念介绍

    声明:虽然本系列博客与具体的编程语言无关.但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差.举例也大多是和这两门语言相关. Vector的出现主要是为了解决数组的静态空间的问 ...

  10. 【密码学】RSA加密 kotlin实现方法(支持任意字节长度)

    这个编辑器不支持kotlin,尴尬了···· 算了,就用Java来弄吧 val 定义常量 var 定义变量 具体kotlin的开发手册详见:http://www.runoob.com/kotlin/k ...