算法学习 8.图论(下).pdf
《算法学习 8.图论(下).pdf》由会员分享,可在线阅读,更多相关《算法学习 8.图论(下).pdf(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图论(下)七月算法邹博2015年4月30日2/主要内容 继续关于深度优先搜索的讨论以某例题来观察DFS和动态规划的关系 最短路径单源点最短路径任意两点间的最短路径边存在负权 最小生成树Prim算法Kruskal算法 拓扑排序深化“拓扑”的概念3/深度优先搜索DFS 理念:不断深入,“走到头”回退。(回溯思想)一般所谓“暴力枚举”搜索都是指DFS 回忆数组章节中“N-Sum问题”的解法 实现 一般使用堆栈,或者递归 用途:DFS的过程中,能够获得的信息“时间戳”、“颜色”、父子关系、高度4/回文划分问题Palindrome Partitioning 给定一个字符串str,将str划分成若干子串,
2、使得每一个子串都是回文串。计算str的所有可能的划分。单个字符构成的字符串,显然是回文串;所以,这个的划分一定是存在的。如:s=“aab”,返回“aa”,“b”;“a”,“a”,“b”。5/回文划分问题Palindrome Partitioning 分析:在每一步都可以判断中间结果是否为合法结果:回溯法如果某一次发现划分不合法,立刻对该分支限界。事实上,一个长度为n的字符串,有n-1个位置可以截断,每个位置有两种选择,因此时间复杂度为O(2n-1)=O(2n)。6/Code7/Palindrome Partitioning思考 与之类似的:给定仅包含数字的字符串,返回所有可能的有效IP地址组合
3、。如:“25525511135”,返回“255.255.11.135”,“255.255.111.35”。该问题只插入3个分割位置。只有添加了第3个分割符后,才能判断当前划分是否合法。如:2.5.5.25511135,才能判断出是非法的。当然,它可以通过“25511135”大于“255.255”等其他限界条件“事先”判断。8/Palindrome Partitioning思考:动态规划如果已知:stri+1,i+2n-1的所有回文划分(i+1),注:是个集合,存储了所有可能的回文划分,下同stri+2,i+3n-1的所有回文划分(i+2),stri+3,i+4n-1的所有回文划分(i+3),s
4、trn-1的所有回文划分(n-1),如何求stri,i+1n-1的所有划分呢?分析:如果已知以stri为起点的子串中stri,i+1j是回文串,那么,该子串添加到(j)中,即为一种可能的划分方案。算法:将集合(i)置空;遍历j(ijn-1),若stri,i+1j是回文串,则将stri,i+1j,(j)添加到(i)中;i从n-1到0,依次调用上面两步,最终返回(0)即为所求。9/动态规划解回文划分的Trick 在计算stri,i+1j是否是回文串这一子问题中,暴力也是无可厚非的。线性探索:j从i到n-1遍历即可。事实上,可以事先缓存所有的stri,i+1.j是回文串的那些记录:用二维布尔数组pn
5、n就够了:pij的true/false表示了stri,i+1.j是否是回文串;它本身是个小的动态规划:如果已知stri+1.j-1是回文串,那么,判断stri,i+1.j是否是回文串,只需要判断stri=strj就可以。10/Code11/回文子串问题的DFS与DP深刻认识 DFS的过程,是计算完成了str0i的切分,然后递归调用,继续计算stri+1,i+2n-1的过程;而DP中,故意使用了从后向前的方法:假定得到了stri+1,i+2n-1的所有可能切分方案,如何扩展得到stri,i+1n-1的切分;当然可以先计算str0i的所有可能切分,然后考察str0i+1的所有切分。从本质上说,二者
6、是等价的:最终都搜索了一颗隐式树。当然,如果题目要求“切分成最少数目的回文子串”,动态规划就有优势了事实上是快速删减了不可能的子树分支。12/附:Palindrome Partitioning II 给定一个字符串str,将str划分成若干子串,使得每一个子串都是回文串。在所有可能的划分中,子串数目最少是多少?如:s=“aab”,最少子串数目为2“aa”,“b”注:原leetcode题目是返回切分的数目“aab”返回1:切1刀。设di为字符0i划分的最小回文串的个数,则di=mindj+1|sj+1i是回文串。13/Palindrome Partitioning II 假设当前已经计算完成前缀
7、串str0i-1的最少划分数目d0i-1,其中dj表示前缀串str0j的最少划分数目;则:要划分前缀串str0i,假定划分方案的最后一个子串为strj+1i,显然,根据题意strj+1i为回文串,并且str0j一定是最少划分,即:di=mindj+1|sj+1i是回文串,i-1j0 注意:strji是否为回文串,本身是个小的动态规划 若已知strj+1i-1 是回文串,则只需判断strj=stri;上述整个过程从后向前分析仍然可以得到类似的结论;14/Code15/再谈LCA:Tarjan算法 Tarjan算法是由Robert Tarjan在1979年发现的一种高效的离线算法,也就是说,它要首
8、先读入所有的询问(求一次LCA叫做一次询问),然后并不一定按照原来的顺序处理这些询问,该算法的时间复杂度O(N*(N)+Q),其中,(x)不大于4,N表示问题规模,Q表示询问次数。16/Tarjan概览Tarjan算法基于深度优先搜索,对于新搜索到的一个结点u,首先创建由这个结点u构成的集合setU,再对当前结点u的每一个子树subTree进行搜索,每搜索完一棵子树sub,则可确定子树sub内的LCA询问都已解决。其他的LCA询问的结果必然在这个子树sub之外,这时把子树sub所形成的集合setSub与当前结点的集合setU合并成set,并将当前结点u设为这个集合set的祖先Ua。之后继续搜索
9、下一棵子树subNext,直到当前结点u的所有子树搜索完。这时把当前结点u设为checked,同时可以处理有关当前结点u的LCA询问,如果有一个从当前结点u到结点v的询问,且v已被检查过,则由于进行的是深度优先搜索,当前结点u与v的最近公共祖先LCA一定是未checked,而这个最近公共祖先LCA包含v的子树subV一定已经搜索过了,那么LCA一定是v所在集合的祖先Va。17/Tarjan算法:深度优先 关键:计算当前正要被回溯的节点10和其他结点的LCA(2,10)(10,7)(9,10)(10,8)18/Tarjan Code19/Tarjan算法的思考:如何存储候选查询 遍历P中的查询(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法学习 8.图论下 算法 学习 图论
限制150内