算法学习 7.图论.pdf
《算法学习 7.图论.pdf》由会员分享,可在线阅读,更多相关《算法学习 7.图论.pdf(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图论七月算法邹博2015年4月28日2/图的表述与搜索 图的表示 邻接矩阵 n*n的矩阵,有边是1,无边是0 邻接表 为每个点建立一个链表(数组)存放与之连接的点 搜索 BFS(Breadth-First-Search)广(宽)度优先 DFS(Depth-First-Search)深度优先3/主要内容树的遍历和搜索(隐式)图的搜索(连通性)重点8皇后最短路径单源图(Dijkstra)任意两点(floyd)有负边(bellman-ford)最小生成树(MST)PrimKrusal拓扑排序(topsort)4/广度优先搜索:Breadth First Search,BFS 最简单、直接的图搜索算法
2、 从起点开始层层扩展 第一层是离起点距离为1的 第二层是离起点距离为2的.本质就是按层(距离)扩展,无回退5/BFS分析 给定某起点a,将a放入缓冲区,开始搜索;过程:假定某时刻缓冲区内结点为abc,则访问结点a的邻接点a1a2ax,同时,缓冲区变成bc a1a2ax,为下一次访问做准备;辅助数据结构:队列 先进先出 从队尾入队,从队首出队 只有队首元素可见146253103020452555405015356/BFS分析的两个要点 结点判重如果在扩展中发现某结点在前期已经访问过,则本次不再访问该结点;显然,第一次访问到该结点时,是访问次数最少的:最少、最短;路径记录一个结点可能扩展出多个结点
3、:多后继a a1a2ax,但是任意一个结点最多只可能有1个前驱(起始结点没有前驱):单前驱用和结点数目等长的数组pre0N-1:prei=j:第i个结点的前一个结点是j注:再次用到“存索引,不存数据本身”的思路。146253103020452555405015357/BFS算法框架 辅助数据结构队列q;结点是第几次被访问到的d0N-1:简称步数;结点的前驱pre0N-1;算法描述:起点start入队q记录步数dstart=0;记录start的前驱prestart=-1;如果队列q非空,则队首结点x出队,尝试扩展x找到x的邻接点集合y|(x,y)E 对每个新扩展结点y判重,如果y是新结点,则入队
4、q;同时,记录步数dy=dx+1;前驱prey=x;1462531030204525 55405015358/BFS算法思考 对BFS的改进双向BFS 从起点和终点分别走,直到相遇;将树形搜索结构变成纺锤形;为什么这样更“快”?经典BFS中,树形搜索结构若树的高度非常高时,叶子非常多(树的宽度大)把一棵高度为h的树,用两个近似为h/2的树代替。宽度相对较小。9/单词变换问题Word ladder 给定字典和一个起点单词、一个终点单词,每次只能变换一个字母,问从起点单词是否可以到达终点单词?最短多少步?如:start=hit end=cog dict=hot,dot,dog,lot,log hi
5、t-hot-dot-dog-cog10/单词变换问题使用临界表,建立单词间的联系单词为图的结点,若能够变换,则两个单词存在无向边;若单词A和B只有1个字母不同,则(A-B)存在边;建图:预处理:对字典中的所有单词建立map、hash或者trie结构,利于后续的查找对于某单词w,单词中的第i位记为,则将替换为+1,Z,查找新的串nw是否在字典中。如果在,将(w-nw)添加到邻接表项w和nw中(无向边)循环处理第二步若使用map,串在字典中的查找认为是O(logN)的,那么,整体时间复杂度为O(N*len*13*logN),即O(N*logN)。若使用hash或者trie,整体复杂度为O(N)从起
6、始单词开始,广度优先搜索,看能否到达终点单词。若可以到达,则这条路径上的变化是最快的。11/思考 有趣的是:虽然从起点单词开始到终点单词的路径内的单词,必须在词典内,但起点和终点本身是无要求的。是否需要事先计算图本身?体会路径记录问题。12/Code13/Code(split)14/周围区域问题 给定二维平面,格点处要么是X,要么是O。求出所有由X围成的区域。找到这样的(多个)区域后,将所有的O翻转成X即可。15/分析 反向思索最简单:哪些O是应该保留的?从上下左右四个边界往里走,凡是能碰到的O,都是跟边界接壤的,应该保留。思路:对于每一个边界上的O作为起点,做若干次广度优先搜索,对于碰到的O
7、,标记为其他某字符Y;最后遍历一遍整个地图,把所有的Y恢复成O,把所有现有的O都改成X。16/Code17/Code(split)18/思考与拓展 如果目标区域是三维的呢?19/深度优先搜索DFS 理念:不断深入,“走到头”回退。(回溯思想)一般所谓“暴力枚举”搜索都是指DFS 回忆数组章节中“N-Sum问题”的解法 实现 一般使用堆栈,或者递归 用途:DFS的过程中,能够获得的信息“时间戳”、“颜色”、父子关系、高度20/DFS 优点 不妨回忆一下Tarjan算法求解LCA问题 由于只保存了一条路径,空间重复利用 缺点 找到的解不一定是“最少”步数的 无论BFS,DFS找到解都和解的“位置”
8、有关21/回文划分问题 给定一个字符串s,将s划分成若干子串,使得每一个子串都是回文串。计算s的所有可能的划分。如:s=“aab”,返回“aa”,“b”;“a”,“a”,“b”。22/问题分析 在每一步都可以判断中间结果是否为合法结果:回溯法如果某一次发现划分不合法,立刻对该分支限界。一个长度为n的字符串,有n-1个位置可以截断,每个位置可断可不断,因此时间复杂度为O(2n-1)。23/Code24/思考 与之类似的:给定仅包含数字的字符串,返回所有可能的有效IP地址组合。如:“25525511135”,返回“255.255.11.135”,“255.255.111.35”。该问题只插入3个分
9、割位置。只有添加了第3个分割符后,才能判断当前划分是否合法。如:2.5.5.25511135,才能判断出是非法的。25/八皇后问题 在88格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种解法。26/思路分析 分析:显然任意一行有且仅有1个皇后,使用数组queen07表示第i行的皇后位于哪一列。对于“12345678”这个字符串,调用全排列问题的代码,并且加入分支限界的条件判断是否相互攻击即可;此外,也可以使用深度优先的想法,将第i个皇后放置在第j列上,如果当前位置与其他皇后相互攻击,则剪枝掉该结点。上述分析完全可以扩展到N皇后问题。2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法学习 7.图论 算法 学习 图论
限制150内