算法导论复习(九)| 图树周游,回溯法,分支限界,最大流

文章目录

  • 图树周游
  • 回溯法
  • 分支限界
  • 最大流

图树周游

在二元树的周游中,以D、L、R分别代表访问结点的信息段、访问左子树、访问右子树。则可能的顺序有:
LDR:中根次序周游(中根遍历)
LRD:后根次序周游(后根遍历)
DLR:先根次序周游(先根遍历)
RDL:逆中根次序周游
RLD:逆后根次序周游
DRL:逆先根次序周游

一棵二元树可由中根遍历序列+先根遍历序列、或中根遍历序列+后根遍历序列唯一确定。但不能由先根遍历序列+后根遍历序列唯一确定


D_Search:使用保存未被检测的结点,结点按照宽度优先的次序被访问并被依次压入栈中,然后以相反的次序出栈进行新的检测。新的检测结点是最新被访问但未被检测的结点。

BFS:使用队列保存未被检测的结点。结点按照宽度优先的次序被访问和进、出队列。

简记
Dsearch每次将后继节点放入栈,遍历下一层时排最后的后继节点出栈
BFS每次遍历时先进先出。
算法导论复习(九)| 图树周游,回溯法,分支限界,最大流_第1张图片



回溯法

回溯法思想:
第一步:为问题定义一个状态空间(state space),这个空间必须至少包含问题的一个解
第二步:组织状态空间以便它能被容易地搜索。典型的组织方法是图或树
第三步:按深度优先的方法从开始节点进行搜索

  • 开始节点是一个活节点(也是 E-节点:expansion node)
  • 如果能从当前的E-节点移动到一个新节点,那么这个新节点将变成一个活节点和新的E*-*节点,旧的E-节点仍是一个活节点。
  • 如果不能移到一个新节点,当前的E-节点就“死”了(即不再是一个活节点),那么便只能返回到最近被考察的活节点(回溯),这个活节点变成了新的E-节点。
  • 当我们已经找到了答案或者回溯尽了所有的活节点时,搜索过程结束。

状态空间树

活结点:自己已经生成而其所有的儿子结点还没有全部生成的结点。
E-结点(正在扩展的结点):当前正在生成其儿子结点的活结点。
死结点:不再进一步扩展或者其儿子结点已全部生成的生成结点。

构建方法:

回溯法:
当前E-结点R,生成一个新的儿子C,则C就变成一个新的E-结点,对子树C完全检测后,R结点再次成为E-结点
分枝-限界方法:
一个E-结点一直保持到变成死结点为止


限界函数
“剪枝”
回溯法与分支限界法中,使用限界函数杀死还没有全部生成其儿子结点的那些活结点。


子集和数问题

描述:给一个n元集合(w1, w2, …, wn)和数M,均为正数。要求找出wi的和数等于M的所有子集。

识别状态空间树:
算法导论复习(九)| 图树周游,回溯法,分支限界,最大流_第2张图片
图中,框中第一个数为目前的总数,第二个数为遍历到第几个数(递归深度),第三个数为剩余数的和


回溯法伪代码
算法导论复习(九)| 图树周游,回溯法,分支限界,最大流_第3张图片
算法导论复习(九)| 图树周游,回溯法,分支限界,最大流_第4张图片


分支限界

  • FIFO检索:活结点表采用队
  • LIFO检索:活结点表采用栈

限界的目的
减少算法的盲目性,减小搜索空间,从而降低计算量
下界
l使用使得c^(X) <= c(X)的成本估计函数c^(·)给出可由任一结点X得出的解的下界
上界
l利用上界U,使具有c^(X)>U的所有活结点X可以被杀死


LC检索
基本思想:选取成本估计函数值最小的那个作为E-结点。

最大流

反平行边
处理:加一个结点,入边边权=出边边权。


残存网络
入边改为容量减流量,出边改为流量(即反悔)。算法导论复习(九)| 图树周游,回溯法,分支限界,最大流_第5张图片


求解最大流:Ford-Fulkerson方法(不重要)
方法:(1)从流值为0的初始流开始
​ (2)通过某种方法,对流值进行增加
​ (3)确认无法增加流值,即得到最大流
算法导论复习(九)| 图树周游,回溯法,分支限界,最大流_第6张图片


增广路径

一般找图中最上面的边记得找后修改原图中的边权。


切割

最大流值等于最小切割的容量。
定理 :设f为流网络G=(V,E)中的一个流,该流网络的源结点为s,汇点为t,则下面的条件是等价的:
(1)f是G的一个最大流
(2)残存网络 不包括任何增广路径
(3)|f|=c(S,T) ,其中(S,T)是流网络G的某个切割


Edmonds-Karp算法

仍然是基于Ford-Fulkerson方法,使用广度优先搜索寻找源结点到汇点的最短路径作为增广路径,得到不依赖于最大流值的运行时间上界。


马上就要考试了QAQ

你可能感兴趣的:(算法,算法)