搜索分析(DFS、BFS、递归、记忆化搜索)
搜索分析(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、递归、记忆化搜索)的更多相关文章
- HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...
- 洛谷 P1141【BFS】+记忆化搜索+染色
题目链接:https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字 0 与 1 组成的n×n 格迷宫.若你位于一格0上,那么你可以移动到相邻 4 ...
- hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
- DFS——>记忆化搜索——>动态规划
以洛谷P1802 5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...
- hdu 1428(很好的一道题,最短路+记忆化搜索)
漫步校园 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 4628 Pieces(状态压缩+记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索 ...
- 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索
问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...
- ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)
链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...
- 路径方案数_mod_SPFA_记忆化搜索_C++
本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...
- POJ1088滑雪(记忆化搜索)
就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度. 因为可能会超时,DP的话每次就是记录,然后就不用回溯了. 很简单的DFS里面的记忆化搜索. #include <stdio ...
随机推荐
- Hibernate多表映射(三)
一对多|多对一 一个分类对应多个商品,一个商品只属于一个分类 创建分类表 products用set装,set特点值不能够重复 package com.hibernate.domain; import ...
- Django学习案例一(blog):二. 连接数据库
本例使用了django默认的sqlite3数据库,配置文件不需要作调整: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite ...
- WEB笔记-2 剖析CSS规则
2.1 剖析CSS规则 规则即指令,其声明了需要修改的元素及要应用给元素的样式. 2.2 为文档添加样式的三种方法 行内样式:直接写在HTML文档标签中的style属性当中,行内元素只 ...
- java就业前景发展方向分析
随着信息化的发展,IT培训受倒了越来越多人的追捧.在开发领域,JAVA培训成为了许多人的首选!java拥有强大的开发者的数量已超过了之前的900万,将近97%的企业电脑也在运行着java,其下载量每年 ...
- 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上 ...
- We wanted {"required":["value"]} and you sent ["text","value","id","sessionId"]
重装python pycharm后再次执行以前执行没有问题的Appium脚本报错 We wanted {"required":["value"]} and yo ...
- apicloud图片上传
app中的图片上传,例如:个人信息页面,上传头像 使用: UIMediaScanner 地址: https://docs.apicloud.com/Client-API/UI-Layout/UIMed ...
- PAT_A1145#Hashing - Average Search Time
Source: PAT A1145 Hashing - Average Search Time (25 分) Description: The task of this problem is simp ...
- 数据结构与算法(2)- vector概念介绍
声明:虽然本系列博客与具体的编程语言无关.但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差.举例也大多是和这两门语言相关. Vector的出现主要是为了解决数组的静态空间的问 ...
- 【密码学】RSA加密 kotlin实现方法(支持任意字节长度)
这个编辑器不支持kotlin,尴尬了···· 算了,就用Java来弄吧 val 定义常量 var 定义变量 具体kotlin的开发手册详见:http://www.runoob.com/kotlin/k ...