搜索算法
文章平均质量分 54
GMFTBY
for all
展开
-
HDU 1010 比较坑人的一道搜索题
本人当初只是想到用搜索做,上手就是BFS结果WA了,后来反应过来只能用DFS来做提交了21次,全TLE,后来在多次努力下找到了大量的陷阱,为还在为此题困扰的人指指路1.奇偶剪枝很简单的一个概念设起点坐标是bx,by;终点坐标是ex,ey;最短路径是abs(bx-ex)+abs(by-ey)但是我们可以很显然的看出来,无论是走,我们的步数肯定比最短路径数多一个偶数所以,简原创 2016-03-16 15:43:14 · 4035 阅读 · 4 评论 -
巧用循环不变式书写正确的二分查找算法(看不懂我撞墙)
1.二分查找介绍在进行开始之前,我们县要来正确的认识一下什么是二分查找算法上过数值分析这门课的同学一定在迭代那一刻里面清楚的了解过一个名词叫做对分法实际上,对分法的本质就是二分查找下面我们来介绍一下二分查找算法Binary-Search是不同于顺序扫描的一种极其高效的查找算法首先我们县要来了解一下二分查找算法相对于朴素的顺序查找算法的优劣对于朴素的顺序查找算法(不局原创 2016-10-10 00:25:27 · 2346 阅读 · 2 评论 -
哈夫曼(最优二叉树)
最优二叉树:定义:路径:数的路径就是从书中的一个节点到树中的另一个节点的分支的个数长度,路径上的分支数目我们称之为长度树的路径长度:从树根到每一个节点的长度之和(完全二叉树是一种树的路径最短的二叉树)节点的带权路径长度:从根节点到该节点的路径的分支数目与节点的权值的乘积树的带权路径的长度:树中的所有的节点的带权路径长度之和,并且,我们将改长度定义为WPL最优二叉树(哈夫曼树原创 2016-09-08 16:15:48 · 4143 阅读 · 0 评论 -
POJ 1753 - 位运算(异或)+BFS / DFS+枚举
1.Question:题目大意:有一个4*4的棋盘,棋盘上有黑白子,我们对棋盘进行如下操作:操作的定义:我们每次可以反转一个棋子,即黑变白,白变黑,之后上下左右四个方向的棋子都会跟着进行翻转操作题目中让我们求可以使得整个棋盘变成纯色的最少的操作次数2.Solution:本题的解法思路有很多,之后的枚举+DFS的思路我会更新补上,这里我们着重讲解位运算+BFS的思路求原创 2016-10-24 09:22:41 · 921 阅读 · 0 评论 -
POJ 2965 - 状态压缩 + BFS
1.Question:和上次的1753是一个思路题意:有一个4*4的表格,+代表关,-代表开,请输出让整个图都是开的状态所需要的最小操作次数定义操作:我们每次可以翻转一个按钮,同时同一行和同一列的元素都会执行相同的反转操作和1753一样,我们同样用位运算压缩状态2.Solution:状态压缩+BFS总共只有2^16个状态需要枚举,所以说本题还是可以做到很原创 2016-10-25 08:58:18 · 301 阅读 · 0 评论 -
POJ 3126 - 筛素数+BFS
1.Question:输入:1.n代表测试用例的个数2.之后的n行,每行有两个数字,都是四位素数,现在让我输出最少的操作次数是的从第一个素数变换成第二个素数操作定义:我们每次允许改变四位数的的一个位的数字,不能不改变,并且改变数字后的新的四位数也必须是素数,这里的前卫上的数字不允许改变成02.Solution:标准的BFS枚举思路,但是这里我们对于素数的判定,可原创 2016-11-07 08:38:49 · 440 阅读 · 0 评论 -
POJ 3083 - 变向DFS + BFS
1.Question:本题是一道非常好的搜索题,号不是好在本题混合了深搜和广搜,而是好在了本题的新的思路首先,题意:有一个迷宫,我们现在要求出在各种限制下的从S走到E的步数首先题目限制了一定有解存在1.我们现在定义初始方向,题目中明确说明了(我没有看到,半天没有理解题意),我们定义S的状态只有这么几种情况S不会出现在地图的中间,S不会出现在地图的四个角落,S只会在地原创 2016-11-08 13:46:23 · 437 阅读 · 0 评论 -
POJ 2109 - double
1.Question:本题的正解是高精度+二分法但是题目的bug导致我们直接一行用double也可作二分+高精度我之后会补上这里的blog相当于是插了个flag吧2.Code:#include"iostream"#include"cstring"#include"cstdio"#include"cmath"using namespace std;原创 2016-10-27 23:12:21 · 252 阅读 · 0 评论 -
POJ 3414 - Easy BFS - 六入口倒水问题
1.Question:题目描述:有两个杯子,a,b,我们现在给定一个数据c现在有这么三种操作:FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;DROP(i) empty the pot i to the drain;POUR(i,j) pour from pot i to pot j; after原创 2016-11-09 12:07:19 · 390 阅读 · 0 评论 -
POJ 3087 - STL(map)+滚动数组
1.Question:目的:通过本题熟悉C++,STL标准模板库中的map强大容器的基本操作题意:Shuffle游戏输入:第一次输入的t代表数据的测试用例个数之后的c代表我们玩的牌的每组牌的牌数(0之后两行代表我们的两座拍的顺序,顺序输入时从底向上的(从左到右)最后一行输入代表我们要活的的最终的状态,现在问我们进过多少次操作可以获得我们的最终状态,如果我们可以获得最原创 2016-11-10 13:24:01 · 376 阅读 · 0 评论 -
POJ 2531 - DFS - 经典
1.Question:题意:有一个无向图,现在,我们需要将无向图进行划分,是的,每两个点之间都有连边,并且两边集合的点之间边有权值,集合内的点之间没有权值,现在求最大的情况是多少2.Solution:真的是一道非常新颖的DFS的思路,我们需要做的就是穷尽所有的可能情况1.我们首先假设,所有的点都在0集合2.我们穷举的情况是,所有的点在0,1之间的分布3.在DFS中,我们原创 2016-11-11 09:28:29 · 407 阅读 · 0 评论 -
POJ 2503 - 字典树再解
1.Question:题意:有不超过10w个字典序列,每个字典序列中都是两个字符串,第一个字符串是英文,第二个字符串是对应的一门不知道什么语言现在要求我们尽可能快速的建立映射,是的我们根据输入的外语可以快速的查找到对应的英语每个单词的长度不超过10,全部都是小写(简化了问题)输入样例和解释:dog ogdaycat atcaypig igpayfroot原创 2016-10-31 12:07:39 · 472 阅读 · 0 评论 -
POJ 2503 - 二分+快排
1.Question:前文有2.Solution:本文采用二分+快排的模式我们都知道字符串在字典序下是有严格的递增的序列的,所以我们利用字符串的字典序作为待查序列,利用二分法来查找PS:二分法的时间复杂度是O(n*logn),但是字典树是接近O(n),但是在测试中,二分比字典树还要快一点,我有些不得其解,可能库函数对排序而做了非常好的的优化我也不知道,也有可能是数据的问原创 2016-11-01 09:33:18 · 490 阅读 · 0 评论 -
POJ 3349 - 数值哈希(这辈子只服数据量)
1.Question:题意描述:输入:n代表有多少片雪花之后的n行,每行6个数字代表雪花的6个枝杈的长度(正序逆序都可以)输出:如果以上的雪花中出现了同构的情况,那么我们认为出现了相同的雪花最后如果我们认为有两种相同的雪花,输出Twin snowflakes found.否则输出No two snowflakes are alike.2.Soluti原创 2016-11-01 21:13:00 · 1309 阅读 · 0 评论 -
快排光芒下被忽视的Partition函数
1.前言:看到这篇标题,没有学过快排的人自然是不知道Partition函数的意思和作用,这里附上学习的连接Lantian的快排总结我们现在都是被快排蒙蔽了双眼,没有意识到快最核心的划分函数Partition,当然Partition函数也就不止于快排这里,本文就从多方面来为展示Partition函数的本质和扩展作用2.快排中的Partition及其优化:在算法导论中我们对Partit原创 2016-11-02 19:33:53 · 3787 阅读 · 0 评论 -
POJ3278-BFS容易出现思维漏洞
Question:本体是标准的三个入口的BFS水题,但是细节问题太多Solution:1.数组没必要太大,一旦RE了,是因为出现了这么几种情况,出现负数,因为题中声明不会有负数的出现,把负数的情况短路掉还有就是我们一不小心越界,这时候,我们和上一种一样,我们需要先预判短路,再进行下标访问2.记录数组是很有必要的,防止TLE3.小心n,k相同点额情况,此时输出原创 2016-09-16 10:37:12 · 916 阅读 · 0 评论 -
POJ1321-DFS八皇后变种
Question:本体是八皇后的变种题目,改为不规则的棋盘,但是还是要求每个妻子不能同行同列求对于对应的棋盘和妻子个数输出所有的和法的摆放的个数Solution:我们这里利用一个小技巧,我们开辟行数组和列数组,用来记录那些行和那些列别占用过剩下的就是标准的DFS了这里我第一次T是因为行数加错了,我们下一次直接从上一次的旗子的下一行开始摆放,这样节省时间Code:#i原创 2016-09-16 09:39:21 · 1279 阅读 · 0 评论 -
HDU 1242 小心搜索的小陷阱
题目中有一个很坑人的陷阱#friends#所以说要是从起点开始进行搜索那么起点是很多个的所以我们可以从终点来开始进行搜索,这是整个题的核心其他的没什么可说的了,简而言之,就是BFS的水题下面附上AC代码#include"iostream"#include"cstdio"#include"cstdlib"#include"cstring"using names原创 2016-03-16 16:37:52 · 337 阅读 · 0 评论 -
HDU 1312 DFS
深搜水题 没什么好说的了 强调一下就好,回溯的时候记录不要删除就行下面附上AC代码#include"iostream"#include"cstdio"#include"cstring"using namespace std;char map[50][50];int n,m;int book[50][50];int num=1;int bx,by;原创 2016-03-16 16:59:50 · 211 阅读 · 0 评论 -
DFS BFS 路径记录的总结
最近还是学了一些东西的关于搜索本身没有什么难以理解的东西,但是这个路径晦朔真的是让我头疼了一整天,感谢峰神提点现在总结如下DFS路径记录首先,DFS一般是用递归实现的,在每次递归前我们在结构体数组中记录一下当前的坐标,然后再进行递归,在找到目标的时候,恰好我们找到了一组坐标点,进而实现了路径的记录以下是简单的代码解析#include"iostream"#incl原创 2016-03-16 22:42:40 · 4859 阅读 · 1 评论 -
DFS深度优先搜索
搜索算法的核心个人学习过程中总结有两个(求不喷):1.有序的扩展2.有效利用记录数组进行标记经典案例:迷宫问题(0可走,1不可走,找最短路径)#include"iostream"#include"cstdio"#define inf 9999999 //对mink进行初始化,便于进行最小的比较using namespace std;原创 2016-03-04 22:51:06 · 396 阅读 · 0 评论 -
BFS广度优先搜索
广度优先搜索,利用队列实现,结束标志是队列为空的时候承接DFS的算法实现的讲例,对于迷宫问题我们也可以采取广度优先搜索实现#include"iostream"#include"cstdio"#include"cstdlib"using namespace std;int map[55][55];int book[55][55];int startx,star原创 2016-03-04 22:51:48 · 282 阅读 · 0 评论 -
栈的回退思想实现深度优先搜索
迷宫问题求解(引用了深度优先搜索的回退的思想,只不过用循环和栈代替递归实现)因此也有深搜的一个缺点,深搜在第一次找到终点的时候会结束,但是难以求解最少步数,因此再求最小步数的时候,我们常用广度优先搜索#include"iostream"#include"cstdio"#include"cstdlib"using namespace std;struct node原创 2016-05-06 10:01:09 · 568 阅读 · 0 评论 -
牛顿迭代法总结
牛顿迭代法公式:X(n+1)=X(n)-f(Xn)*(X(n)-X(n-1))/(f(X(n))-f(X(n-1)))该公式为了配合求导计算采用了差商代导数的方案,尽量保证了公式的完整性 求方程的跟的话我们只需要在邻近的零点附近进行迭代就好了 用牛顿迭代法来求方根的方法思路http://wenku.baidu.com/link?url=FsyQLbnxbMF2_GL6E原创 2016-06-21 20:35:51 · 2160 阅读 · 0 评论 -
编程之美1.14——连连看工程(含全部代码,伪哈希+BFS)
编程之美迄今为止最为详细的讲解,包含连连看游戏的C++所有代码片段伪哈希+BFS+动态规划绝对值得收藏,绝对值得浏览我是不是该开个竖屏的专栏了其余的扩展问题还在思索,会不定期的更新原创 2016-08-16 10:20:57 · 1327 阅读 · 0 评论 -
POJ2488——简单DFS
Question:题目中给出了国际象棋的地图,要求我们将马按照他的走子方式进行移动,能够将整个棋盘走遍则我们将走姿方式按照字典序进行输出,否则输出impossibleSolution:本题主要考察的是方向数组的顺序,首先,我们需要明确一点,如果我们要按照字典序进行输出的话并且还要踩遍整个棋盘,我们那必定会经过A1点,所以说我们的顺序必定是开头是A1的一组字典序顺序按照上图的原创 2016-09-11 14:51:30 · 419 阅读 · 0 评论 -
微软面试百题004——指定BST路径和
微软面试百题0041.题目大意:给出一颗二叉查找树BST定义路径:从根节点出发到叶子节点终止视为一条路径定义路径和:路径上的所有上的节点的权值之和给定一个权值,请求出满足权值路径和的所有的路径2.解题思路:因为我们是要求解出所有的情况,所以很自然而然的我们就会想到深度优先遍历(DFS)我们从根节点开始,每次向下遍历至所有的根节点,满足条件打印一次(存储在余下原创 2016-08-09 16:21:01 · 573 阅读 · 0 评论 -
哈希表全解(简介+构造+冲突处理+查找分析计算+诸多要点)
目前参考了大量的优秀的大牛的博文自己总计的超详细哈希表1.哈希表的简介2.哈希表的哈希函数构造3.冲突处理4.查找分析计算5.C++完整实现代码原创 2016-08-10 22:09:42 · 3852 阅读 · 0 评论 -
全排列生成算法
1.什么是全排列:我们假如有一串式子,排列组合的结果会有很多种,全排列就是按照字典序有序的将所有的排列组合的性质的陈列出来问题可以这么描述:对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)2.求解算法:1.DFS(我们大多数人所谓的递归的方法):我们来这么看这个问题,加入有n个数据要进行全排列,我们可以假想我们原创 2016-08-11 23:06:25 · 1192 阅读 · 0 评论 -
POJ2251-简单三维BFS
Question:不解释三维的地图,S是起点,E是终点,如果可以逃出,输出最短路径如果不能逃出,输出TrappedSolution:因为是要查找最短路径,所以说,这里我们采用BFS作为我们的搜索策略,本体水,没什么难度,记得开一个六个方向的移动数组就OK了Code:32MS#include"iostream"#include"cstdio"#include"cstrin原创 2016-09-16 09:12:29 · 300 阅读 · 0 评论 -
AVL - 自平衡二叉树 - 详解
1.AVL说到AVL,我们就必须先要了解一下BSTLantian的BST总结在了解了有关BST的性质之后,我们现在就明白了因为在我们的插入的节点有序的情况下,我们的BST会出现偏树的情况,这会导致我们的ASL(平均查找长度)大大增加从而降低我们的查找效率因此,我们就需要一种BST的优化版本取克服这种输入造成的弊端(现在证明,在平均情况下,出现偏树的概率大致在45.6%),所以说,我原创 2016-11-23 16:26:18 · 1601 阅读 · 0 评论