树形结构计数问题:记忆化搜索

一.问题描述:

  • 给定树形结构T,求解其每一个顶点 n i ∈ N n_i \in N niN或者每一条边 e i ∈ E e_i\in E eiE的某一种数值特征的问题,称之为树形结构计数问题.

二.记忆化搜索:

  一般来说,对于这样的树形结构上的计数问题,假如仅仅考虑某一个顶点或者某一条边,很容易就能够通过dfs或者bfs搜索得到答案.
 然而对于|N|个顶点,|N-1|条边进行独立的搜索,会产生很多不必要的时间/空间浪费(也就是重叠子问题导致的重复求解).
 在这样的背景下,拥有重叠子问题,而且还满足最优子结构的问题当然可以使用dp(动态规划)来自顶向下解决.
 也可以使用dp的思想,将独立搜索算法进行优化,称为记忆化搜索算法(也就是在搜索过程中存储-利用重叠子问题的解).这样的算法,和普通的O(|N|)次独立搜索算法没有很大区别,但是时间复杂度会大大降低.

三.案例:

问题1:树中距离和

  • 来源:
    leetcode
    在这里插入图片描述
  • 分析:
     这里要求的是全部节点的距离和,可以定义子问题为:某一个节点去掉它的某一条边而形成的子树中,该节点的距离和以及该子树的节点数.只需要知道全部节点的该信息,对每个节点就可以通过其临界节点的该信息得到这个节点的距离和.总的时间代价是 O ( 2 ∗ ∣ N − 1 ∣ ) O(2*|N-1|) O(2N1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值