递归树

递归树和时间复杂度
递归算法的思想是将大问题分解为小问题,小问题再分解为小小问题,一直分解到足够小,不能分解为止。我们把这一层一层的分解过程画成一棵树,这个树就叫递归树。

以递归排序为例,分析一下递归排序的时间复杂度。

在这里插入图片描述
从归并排序递归树我们发现,每一层的归并操作消耗的时间总和是一样的,都是n,那么只需要知道树的高度h,就可以算法时间复杂度O(n*h)。
这个递归树是一个满二叉树,而满二叉树的高度是logn,所以归并排序的时间复杂度是O(nlogn)。

快速排序的时间复杂度
快读排序最好情况下,每次分区都一分为二,根据上面介绍的,时间复杂度是O(nlogn)。但是当不是一分为二时时间复杂度是多少呢?例如,每次分区的比例为1:9。此时利用递归树计算时间复杂度。

在这里插入图片描述
同样每层遍历的数据之

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归树(Recursion Tree)是一种可视化归算法的方式,它通过将归算法转化为树形结构来帮助我们更好地理解归算法的执行过程和时间复杂度。 在归算法中,每次归调用都会产生一个新的子问题,直到达到基本情况,然后逐级返回结果。这样的归过程可以用一棵树来表示,其中每个节点代表一个归调用,子节点代表对应的子问题,叶子节点代表基本情况的返回值。 举个例子,假设我们要求一个数组的所有子集,可以使用如下的归算法: ``` void subsets(vector<int>& nums, int start, vector<int>& subset, vector<vector<int>>& res) { res.push_back(subset); for (int i = start; i < nums.size(); i++) { subset.push_back(nums[i]); subsets(nums, i+1, subset, res); subset.pop_back(); } } vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> subset; subsets(nums, 0, subset, res); return res; } ``` 我们可以将归过程可视化为下面的归树: ``` [] / | \ [1] [2] [3] / \ / \ | [1,2] [1,3] [2,3] [3,4] [1,2,3] / \ | [1,2,3] [1,3,4] [2,3,4] ``` 其中,[]代表一个子集,每个节点代表一次归调用,左子节点代表将当前元素加入子集,右子节点代表不将当前元素加入子集。当归到数组末尾时,就返回一个空子集。 通过归树,我们可以更好地理解归算法的执行过程,并且可以根据归树来分析时间复杂度。在上面的例子中,归树的深度为数组的长度N,每个节点会被访问一次,因此时间复杂度为O(2^N)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值