- 浏览: 543375 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
参考这篇文章,以下前部分为转载:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx
大牛,谢谢!不是你,我还在用交替节点搜索呢:{ ——应该用交替层次搜索
如果目标也已知的话,用双向BFS能很大提高速度。
单向时,是 b^len的扩展。双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时
至于实现上,网上有些做法是用两个队列,交替节点搜索
×
,如下面的伪代码:
while(!empty()){
扩展正向一个节点
遇到反向已经扩展的return
扩展反向一个节点
遇到正向已经扩展的return
}
但这种做法是有问题的,如下面的图:
求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时
while(1):
S –> 1
T –> 3
while(2):
S -> 5
T -> 4
while(3):
1 -> 5
3 -> 5 返回最短路为4,错误的,事实是3,S-2-4-T
我想,正确做法的是交替逐层搜索
,保证了不会先遇到非最优解就跳出,而是检查完该层所有节点,得到最优值。
也即如果该层搜索遇到了对方已经访问过的,那么已经搜索过的层数就是答案了,可以跳出了,以后不会更优的了。
当某一边队列空时就无解了。
优化:提供速度的关键在于使状态扩展得少一些,所以优先选择队列长度较少的去扩展,保持两边队列长度平衡。这比较适合于两边的扩展情况不同时,一边扩展得快,一边扩展得慢。如果两边扩展情况一样时,加了后效果不大,不过加了也没事。
无向图时,两边扩展情况类似。有向图时,注意反向的扩展是反过来的 x->y(如NOIP2002G2字串变换)
例题:
POJ1915
#include <stdio.h> #include <stdlib.h> #include <queue> #include <iostream> using namespace std; int l; //4<=l<=300 int sx,sy,tx,ty; int a[305][305]; //正向搜索层次 int b[305][305]; //反向搜索层次 struct point{ int x,y; }; struct point dir[]= { {1,2},{1,-2},{-1,2},{-1,-2}, {2,1},{2,-1},{-2,1},{-2,-1} }; bool check(int x,int y){ if(x>=0 && x<l && y>=0 && y<l) return true; else return false; } void dbfs(){ memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); a[sx][sy]=0; b[tx][ty]=0; queue<point> forQ,backQ; point p1,p2; p1.x=sx; p1.y=sy; p2.x=tx; p2.y=ty; forQ.push(p1); backQ.push(p2); //正反向队列至少还有一个可以扩展 while(forQ.empty()==false || backQ.empty()==false){ //优化:优先扩展元素少的队列(如果只有一个队列非空,则扩展非空队列) int forSize=forQ.size(); int backSize=backQ.size(); if(backSize==0 || forSize<backSize){ //扩展正向队列一层 int i; for(i=0;i<forSize;i++){ point cur=forQ.front(); forQ.pop(); if(b[cur.x][cur.y]!=-1){ printf("%d\n",a[cur.x][cur.y]+b[cur.x][cur.y]); return; } int j; for(j=0;j<8;j++){ if(check(cur.x+dir[j].x, cur.y+dir[j].y)){ point next={cur.x+dir[j].x, cur.y+dir[j].y}; //!注意struct的创建方式 if(a[next.x][next.y]!=-1)//以前已经正向扩展过 continue; a[next.x][next.y]=a[cur.x][cur.y]+1; forQ.push(next); } } } }else{ //扩展反向队列一层 int i; for(i=0;i<backSize;i++){ point cur=backQ.front(); backQ.pop(); if(a[cur.x][cur.y]!=-1){ printf("%d\n",a[cur.x][cur.y]+b[cur.x][cur.y]); return; } int j; for(j=0;j<8;j++){ if(check(cur.x+dir[j].x, cur.y+dir[j].y)){ point next={cur.x+dir[j].x, cur.y+dir[j].y}; if(b[next.x][next.y]!=-1) continue; b[next.x][next.y]=b[cur.x][cur.y]+1; backQ.push(next); } } } } }//end while printf("0"); } int main(void){ int time; scanf("%d",&time); while(time-->0){ scanf("%d%d%d%d%d\n",&l,&sx,&sy,&tx,&ty); dbfs(); } return 0; }
poj 1077 :Eight
发表评论
-
快排备忘
2013-10-26 11:27 582http://hi.baidu.com/pluto455988 ... -
LRU简单实现C++
2013-10-17 10:52 4026页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页 ... -
二叉树相关
2013-10-04 17:40 725本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针 ... -
双指针策略(《编程之美》3.5 最短摘要生成)
2013-03-26 15:17 2251本文源自《编程之美》3.5 最短摘要生成一课。 ... -
K-MEDOIDS聚类算法
2012-12-04 21:18 2001k-medoids聚类算法 (wiki上讲得很清楚啊:) ) ... -
搜索(三)——回溯
2012-11-23 15:23 1054一、回溯 和 深度搜索 ... -
哈希Hash
2012-11-21 14:42 1008要点一:哈希表长度 的确定是个两难的问题:太短则容 ... -
状态压缩DP
2012-11-14 20:27 758引例、 例1、 例2、 例3、 ... -
模拟退火
2012-10-28 16:34 1232引用:http://www.cnblogs.com/heaad ... -
计算几何(一)——基础算法
2012-07-12 21:07 1931待续 《计算几何资料》为提纲 1. (1) 有向线段 ... -
计算几何(二)——平面最近点对
2012-07-12 10:54 922参考资料: 为何这个问题采用分治法 http://blog ... -
气泡滚大——剔除线性数据中的杂质
2012-06-18 09:43 971这是一道Java的面试题,但是我总结了除了一种自称为“ ... -
深入理解二分查找(二、二分答案)
2012-04-29 16:24 7217二分答案 如果已知候选答案的范围[min,max ... -
P问题、NP问题和NPC问题
2012-04-25 16:36 1080这篇文章转自这里 ... -
RMQ(Range Minimum/Maximum Query)区间最值查询
2012-04-18 20:47 1578一、RMQ问题描述 和 几种解题思路 RMQ问题 (Rang ... -
后缀数组
2012-04-16 09:49 1538一、后缀数组 及其对应的名次数组 举例:S=&quo ... -
大整数运算(部分转载)
2012-04-12 21:36 1203待补充:“浮点数高精度运算” 参见这里==> ... -
单向链表相关
2012-04-10 16:42 994单向链表是微软笔试常考的,参考这里:http://www.c ... -
关键路径(AOE)
2012-04-10 08:05 1684前面这段话是引用别人的,后面代码是自己写的,有待完善: ... -
搜索(一)——剪枝
2012-03-24 11:46 1568参考文档:《搜索方法 ...
相关推荐
双向BFS是一种改进的BFS策略,它同时从起点和终点开始搜索,当两个搜索队列相遇时,找到了最短路径。在解决某些问题时,双向BFS比单向BFS更快,因为它减少了中间状态的搜索次数。 Jupyter Notebook是一个强大的交互...
3. **图数据结构**:包括邻接矩阵和邻接表,以及与图相关的算法,如深度优先搜索(DFS)和广度优先搜索(BFS)。 4. **排序和查找算法**:快速排序、归并排序、堆排序、冒泡排序、插入排序、二分查找等。这些算法在...
搜索算法分为多种类型,包括穷举法、深度优先搜索(DFS)、广度优先搜索(BFS)、双向搜索、迭代加深搜索(IDDFS)以及随机化搜索等。每种搜索策略都有其独特的优势和适用场景。 #### 穷举法 穷举法是最基础的搜索方法,...
综上所述,此程序巧妙地结合了动态内存管理和广度优先搜索算法,有效地解决了图论中的一个典型问题——寻找从起点到各顶点的路径顺序。通过对程序的分析,我们可以深入理解动态内存分配在实际应用中的重要性以及如何...
"刷题算法提高阶段-搜索6"这个主题聚焦于一个特定的算法类别——搜索算法,特别是双端广度优先搜索(Bidirectional Breadth-First Search, 简称双向BFS)和A*搜索算法。这两种算法都是在解决复杂问题时,如路径寻找...
### 数据结构——图 #### 一、基础知识与概念 **图**是一种常用的数据结构,用于表示对象间的复杂关系。在图中,顶点(Vertex)代表对象,边(Edge)表示对象之间的关系。根据边是否有方向,图可以分为**有向图**和**...
5. 图:图数据结构表示元素之间的复杂关系,包括有向图、无向图、加权图等,常见的算法有深度优先搜索(DFS)和广度优先搜索(BFS)。 6. 排序:快速排序、归并排序、堆排序、冒泡排序和插入排序等是常见的排序算法...
- 图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)。 - 最短路径问题:Dijkstra算法、Floyd-Warshall算法。 6. **第06章:动态规划** - 动态规划的概念:分阶段解决问题,避免重复计算。 - 动态规划应用:...
图的习题可能涉及图的表示(邻接矩阵、邻接表),深度优先搜索(DFS)和广度优先搜索(BFS),最小生成树(Prim算法或Kruskal算法)和最短路径问题(Dijkstra算法或Floyd算法)。 此外,动态规划和贪心策略也是数据...
图遍历算法如深度优先搜索(DFS)和广度优先搜索(BFS)是图处理的基础。 10. **堆(Heap)** 堆是一种特殊的树形数据结构,满足堆属性:对于最大堆,父节点的值总是大于或等于其子节点;对于最小堆,父节点的值...
4. **图算法**:图的表示(邻接矩阵、邻接表),以及DFS(深度优先搜索)、BFS(广度优先搜索)、最小生成树(Prim算法、Kruskal算法)等。 5. **堆与优先队列**:最大堆、最小堆的实现,以及基于堆的优先队列操作...
《算法与数据结构——搜索算法》 搜索算法是计算机科学中的重要组成部分,特别是在解决复杂问题时,如游戏路径规划、网络路由寻找、图形遍历等。本篇主要探讨搜索算法,特别是围绕搜索树展开,包括搜索算法的基本...
图算法处理的是图数据结构,如深度优先搜索(DFS)、广度优先搜索(BFS)等,它们在解决路径寻找、网络流等问题中非常有用。 ### Visual C++6.0编程实践 在Visual C++6.0中,实现数据结构和算法需要熟悉C++语言的语法...
实验中实现了无向图的DFS和BFS,这两种遍历方法与有向图类似,但需要考虑双向连接。 7. **用户交互菜单**:实验通过设计一个简单的命令行菜单,让用户选择执行不同的操作,如创建图、输出邻接表、计算度和入度、...
近年来,针对Graph500的核心算法——广度优先搜索(BFS)的优化遍历研究不断取得进展。例如,Bader等人利用多线程技术隐藏访存延迟,Agarwal等人利用位图数据结构提高访问局部性,Beamer等人提出了混合的Top-down与...
图的遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS),C++中可以使用邻接矩阵或邻接表来表示图。 9. **排序算法**:C++中实现各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等...
课程可能涵盖图的深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim或Kruskal算法)和最短路径(Dijkstra或Floyd算法)等。 7. **散列表**:提供快速查找的数据结构,基于哈希函数将元素映射到数组。...
《数据结构算法实现》是一本经典的教材,由严蔚敏教授编写,主要涵盖了计算机科学中的核心主题——数据结构和算法的实现。这本书的配套代码提供了对书中理论的实践支持,帮助读者深入理解各种数据结构的工作原理及其...
常用算法有深度优先搜索(DFS)和广度优先搜索(BFS)。 6. **散列表(哈希表)**:通过散列函数实现快速查找,常用于实现字典和缓存。 7. **排序算法**:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、...