二叉树应用
信号放大器
定义:
-
DegereeFromParent( i ):节点 i 的父辈到节点i的衰减量
-
DegereeToLeaf( i ): 如果路径上没有信号放大器:节点 i 到它的最年轻后辈的衰减量的累计 如果路径上有信号放大器:max{有放大器路径的DegreeFromParent(j),没放大器路径的DegreeFromParent(j)+DegreeToLeaf(j)}
-
放大器:在某一节点 i 放置放大器后,清空该节点的前边的衰减累计(但是到达 i 节点的衰减累计不变,i 节点信号源是被放大的,即是保真的)
最小放置方法:
-
计算每一个节点的DegreeToLeaf(i)
-
从最底层的节点开始考虑
如果没有超过容忍度的则往上一层走 当到某一层,遇到了 i 节点:DegreeToLeaf(i)>Tolerate 是左孩子(j1)路,还是右孩子(j2)路出问题:DegreeToLeaf(j)+DegreeFromParent(j)>Tolerate 对出问题的路 将该孩子节点处放信号放大器 更新 i 节点的DegreeToLeaf(i)=max{(DegreeToLeaf( j' )+DegreeFromParent( j' ) ),DegreeFromParent( j ) }
为什么在那个地方放信号放大器?
证明:
由于是从最底层开始考虑的,那么在考虑到 i 节点的时候,i节点下面的子树的DegreeToLeaf(j)肯定不超过容忍度,出问题的原因在于DegreeFromParent(j)+DegreeToLeaf(j)的和大了。那么为了解决以i为根的生成树的容忍度问题,只能从j处放信号放大器
原因:显然,在i处或i的父辈放信号放大器没用,因为DegreeToLeaf(i)只和下层有关;在j的孩子放信号放大器也不行,因为底层已经考虑过,是不会超容忍度的。则只能在j放放大器。
怎么在放了放大器之后更新DegreeToLeaf( i )?
答:DegreeToLeaf(i)=max{(DegreeToLeaf( j' )+DegreeFromParent( j' ) ),DegreeFromParent( j ) }
看着很复杂,其实很简单
考虑完某一个孩子路之后,在该孩子处如果放置了信号放大器,则比较(该孩子,父辈)线段衰减量与另一条路的衰减量累计的大小,取较大值
原因:另一条路的大小作为候选值不再解释
放置信号放大器那一条路,现在考虑从i节点的父辈向叶子流,流到信号放大器节点的累积量是才有用的,继续往下的话是已经重新计数了,没有意义。所以考虑的时候只需要计算(该孩子,父辈)的线段衰减量作为候选值。
为什么这样放信号放大器个数是最少的?
首先说明,这种算法放信号放大器是个数最少的,但是并不是说对于这棵树只能通过这种放法来解决,即可能不止有一种最优解,但是这些最优解的放置信号放大器的个数是相等的。下面对该算法进行证明。
假设序列{X}代表本算法放置放大器的集合,序列{W}代表最优解放置放大器的集合
当放置个数为0时,显然是相等的,下面考虑一般情况
令,节点z为本算法第一个放置放大器的节点位置,则按照本算法的放置要求,必然是DegreeToLeaf(z)+DegreeFromParent(z)超过了容忍度。那么在最优解中,这条路径上也必然要放信号放大器,并且有且仅有一个设为u节点(因为本算法已经是只放了1个,已经可以满足题意了)
现在保留节点z,减去以z为根的子树,生成了一个新树T
对于T,本算法放置放大器集合为:{X}-{z}
对于T,最优解算法放置放大器集合为:{W}-{u}
不断重复上述过程,直到生成树中不再需要放放大器。
发现,对于两种算法,结果树是一样的,每一次删除子树,放大器集合的个数都同时减1,则原序列{X}和{Y}的元素个数是相等的
即,本算法可以保证数量放置最少,即为最优解。