算法与数据结构
文章平均质量分 70
阿苏
执著于嵌入式相关技术和领域的IT青年,若干年后,必然小有成就!
展开
-
广度优先搜索寻找最优路径、以及双向广度搜索算法
这里是poj1915上的一道在棋盘上搜索自由路径的题目:代码如下(使用BFS):/* * 使用BFS寻找最佳路径*/#include#include#includeusing namespace std;#define MAXSIZE 301#define NOT !int size;int startX,startY,endX,endY;int minStep;typedef struct Node{ //node结构体 int x; int y; int myindex; int原创 2010-07-17 16:25:00 · 4322 阅读 · 0 评论 -
深度优先搜索算法
下面是poj3009的题目。http://acm.pku.edu.cn/JudgeOnline/problem?id=3009使用的是dfs搜索,代码如下,从中可以体会到dfs搜索的常规特点://POJ3009 Curling 2.0//使用深度搜索,这题有两个地方需要注意://1、当球与箱子相邻的时候,球无法滚动,也无法装破箱子。//2、题目有一个限界,当球滚了10次还没有进入目标点,看做不能到达。#include#include#include#define __DEBU原创 2010-09-05 21:22:00 · 4080 阅读 · 0 评论 -
八数码算法研究
<br />下面是八数码问题的一些算法实现:<br /> <br />下面的代码使用的是迭代加深的搜索策略,由于这个算法是dfs搜索策略的改进,所以在dfs递归调用返回时,还是需要进行状态还原的:<br /> <br /> <br />/* * 迭代加深搜索 * */#include<cstdio>#include<queue>#include<stack>#include<ctime>#include<cstring>using namespace std;原创 2010-09-06 21:29:00 · 1089 阅读 · 0 评论 -
搜索算法:IDA*算法
今天学习了IDA*算法,在这里总结一下:IDA*算法是A*算法和迭代加深算法的结合。迭代加深算法是在dfs搜索算法的基础上逐步加深搜索的深度,它避免了广度优先搜索占用搜索空间太大的缺点,也减少了深度优先搜索的盲目性。它主要是在递归搜索函数的开头判断当前搜索的深度是否大于预定义的最大搜索深度,如果大于,就退出这一层的搜索,如果不大于,就继续进行搜索。这样最终获得的解必然是最优解。而在A*算法中,我们通过使用合理的估价函数,然后在获得的子节点中选择fCost最小的节点进行扩展,以此完成搜索最优解的目的。但是A*原创 2010-09-01 22:30:00 · 29063 阅读 · 3 评论 -
POJ1184Clerver_Writer:广度优先搜索
这是一道poj1184的题目,由于求解的是最优解,所以首先想到的就是使用广度优先搜索。原创 2010-08-31 15:38:00 · 1932 阅读 · 0 评论 -
搜索算法:爬山法
爬山法是深度优先搜索的改进算法。在这种方法中,使用某种贪心算法来帮助我们决定在搜索空间中向哪个方向搜索。由于爬山法总是选择往局部最优的方向搜索,所以可能会有“无解”的风险,而且找到的接不一定是最优解。但是他比深度优先搜索的效率要高很多。主要的算法描述如下:原创 2010-08-31 20:07:00 · 6505 阅读 · 0 评论 -
记忆化搜索的研究
记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。 一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。 记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。上传/更换附件动态规划的另一种实现形式——记忆化搜索的应用原创 2010-08-29 14:40:00 · 6903 阅读 · 1 评论 -
POJ1085 The Triangle War: 记忆化搜索
这是一道关于博弈的题目。我从中得到如下的体会:使用动态规划的方法来解答要比使用极大极小搜索算法,在速度上要快得多。因为极大极小搜索策略每次都要对当前的局面进行某个最大深度的搜索,从中选取出最佳的走法。这样其实是非常耗时的。由于这道题目的本身特点,如果使用动态规划的话,根据dp的思想就是保存搜索过程中的所有状态。在dp的搜索过程中,每次都是非常彻底的搜索,而且由于状态已经描述清楚并记录下来,如果产生了相同的状态,就可以直接使用,这样速度是很快的。但是从这道题目可以开出,dp中状态的描述需要进行保持程序设计的简转载 2010-08-28 22:53:00 · 2542 阅读 · 0 评论 -
华容道游戏:广度优先搜索优先搜索
华容道游戏是非常经典的BFS应用的题目。下面是几个我参考过的链接:使用java语言实现,充分体现OOAD和数据结构的应用,讲的非常详细,但是太过于复杂了:http://www.cppblog.com/tx7do/archive/2006/09/18/12691.html简单版本的介绍,非常有用,而且有完整的源代码:http://blog.chinaunix.net/u/19651/showart_395172.html虽然讲的详细,但是代码也成这副样子,值得同情:http://www.fjptsz.com/原创 2010-08-30 21:34:00 · 2903 阅读 · 1 评论 -
机器博弈:tic-tac-toe游戏
<br />下面是我写的一个tic-tac-toe的简单游戏。<br /> <br />我主要的思路是使用极大极小的搜索策略。并且体会到博弈程序的好坏很大程度上取决于局面评估函数的好坏。<br />因为机器方希望在所有下一步可以下子的集合中,选择最优的步法。这是就需要就局面进行评估,需要附加一些知识,而局面的评估值可以是所有这些知识评估的结果之和。<br /> <br />评估函数和程序对局面的搜索速度是成反比的。<br /> <br /> <br />我的程序中评估函数比较弱。<br /> <br />主原创 2010-08-28 20:11:00 · 1262 阅读 · 0 评论 -
POJ1924 The Treasure
问题描述:这道题目类似于RPG游戏,player的目标是在被monster吃掉之前,拿到treasure。在游戏中,monster分为aggressive和non-aggressive两种,有不同的吃人能力。player可以run或walk,时间消耗是一样的。要求:求出最短拿到treasure的时间。主要的思路是这样的:使用A*搜索算法,比普通的广度搜索速度上要快一点,但算法上复杂了一些。 在程序设计中使用面向对象的思想。源代码如下:Player类原创 2010-08-24 21:18:00 · 1638 阅读 · 0 评论 -
算法设计——极大极小搜索
极大极小搜索策略一般都是使用在一些博弈类的游戏之中:这样策略本质上使用的是深度搜索策略,所以一般可以使用递归的方法来实现。在搜索过程中,对本方有利的搜索点上应该取极大值,而对本方不利的搜索点上应该取极小值。极小值和极大值都是相对而言的。在搜索过程中需要合理的控制搜索深度,搜索的深度越深,效率越低,但是一般来说,走法越好。极大极小搜索可以分开写,也可以放在一起写。主要的算法步骤如下:1、根据side确定如何初始化best值。2、如果当前深度为0,则调用局面评估函数,返回评估值。(评估函数是根据具体问题设计的)原创 2010-08-13 22:42:00 · 9612 阅读 · 5 评论 -
碰到的一些值得注意的东西
1、C++中产生随机数需要包含的头文件:#include#include设置随机种子:srand( time(NULL) );unsigned int i= rand();注意:rand()函数产生的随机数的范围在0~RAND_MAX之间,RAND_MAX为 0x7fff(32767)2、当使用sizeof操作符要求数组的大小时,可以直接通过sizeof(数组名)来获得整个数组的大小,这里的数组可以是一维数组,也可以是二维数组。3、在某些搜索问题中需要使用hash进行状态判重的时候,一种方法是可以使用set原创 2010-08-11 21:39:00 · 794 阅读 · 0 评论 -
C++程序设计中的一些效率问题
1、一般使用STL模板会使得程序运行的效率减慢,因为STL模板的一些标准的数据结构都需要分配比较多的内存空间以及上下文切换的开销,有时像vector等容器在程序运行过程中,如果发生容量不足时,它需要重复分配更大的内存,并把原来的内容拷贝过去,这一点是非常耗时的。另外一点,如果使用STL模板尽量使得某个数据结构全局共享,否则的话,每次定义一个局部的数据结构,都要重新分配内存,非常耗时。本质上是这样的概念,尽量在程序运行之前先申请好内存空间,不要在程序运行过程中不断申请,这样系统需要不断地进行上下文切换的开销。原创 2010-08-10 22:07:00 · 1096 阅读 · 0 评论 -
图论相关知识和算法
1、无向图:简单路径(不存在节点到自身的loop)有向图:回路(cycle),没有回路的有向图称为acyclic,有时简称为DAG。无向图:如果任意两个节点之间存在一条路径,就成为连通。有向图:上述性质称为强连通。不能满足上述性质,但有向图对应的底图(去掉方向后的有向图)满足上述性质,称为弱连通。2、图的三种表示方法(1)邻接矩阵:主要适合于dense图(2)邻接表:主要适合于sparse图,具体实现方式也有多种,可以使用vector或list,也可以使用映射(节点为关键字,对应值为adjacency li原创 2010-08-07 15:49:00 · 1901 阅读 · 0 评论 -
散列表
这里我总结一下有关hash表的算法技巧:(《算法导论》)1、最普通的hash技术是:直接寻址表。这种技术主要应用在当关键字的全域U比较小时,直接分配固定的hash表大小。使用方式(insert、search、delete)类似于普通的数组。hash表组织方式主要有:separate-chaining和open-addressing解决冲突碰撞的主要方法有:拉链法(separate-chaining)和线性寻址、二次寻址(open-addressing)2、hash函数设计注意点:(1)好的hash函数需要满原创 2010-08-03 21:08:00 · 876 阅读 · 0 评论 -
C++ STL相关的一些算法
sort()基于快速排序:是不稳定排序使用方法1:sort(v.begin(),v.end())排序方式:从小到大使用方法2:sort(v.begin(),v.end(),greater())排序方式:从大到小复杂度:O(N log(N)) comparisons (both average and worst-case), where N is last - firststable_sort()基于堆排序,是稳定排序使用方法1: stable_sort(v.begin(),v.end())排序方式:从小到原创 2010-08-03 18:04:00 · 1025 阅读 · 0 评论 -
程序设计中的小技巧
1、在程序设计中可以使用宏定义:#define __DEBUG 1来进行调试,把调试语句放在if(__DEBUG)中,这样如果不想打印出调试语句,可以直接将__DEBUG宏定义改为 #define __DEBUG 0即可。2、在程序设计之前,尽量在一开始就选择便于后期处理的数据结构,这样方面后面的编程设计,也可以提高程序设计的效率。3、对于复杂的函数,尽量在整个程序执行前就进行一下单元测试,这样的话,便于找出错误,不会到后面整个程序执行时,无法找到错误的地方。效率提高了。原创 2010-09-05 22:29:00 · 1070 阅读 · 0 评论