分析递归式 Solving Recurrences------GeeksforGeeks 翻译
在上一章中我们讨论了如何分析循环语句。在现实中,有很多算法是递归的,当我们分析这些算法的时候我们要找到他们的的递归关系。例如归并排序,为了排序一个数组,我们把它平均分为两份然后再重复平分的步骤。最后我们合并这些结果。归并排序的时间复杂度可以写作T(n) = 2T(n/2) + cn。当然还有很多其他的类似算法如二分查找,汉诺塔等等。
有三种办法可以分析递归函数。
1.置换法 substitution method: (叫假设法比较合适)
我们可以先假设一下算法的时间复杂度,然后用数学归纳法来验证这个假设是不是正确的。
例如我们有一个这样的递归的函数 T(n) = 2T(n/) + n 我们假设他的答案是 T(n) = O(nLogn). 现在我们用数学归纳法来验证我们的猜想 我们需要证明 存在某个常数C T(n) <= cnLogn.
我们可以假设当某个小于n的值是 这个式子是成立的 T(n) = 2T(n/) + n
<= c (n/2Log(n/)) + n
= cnLogn - cnLog2 + n
= cnLogn - cn + n
<= cnLogn
2.递归树的方法Recurrence Tree Method
我们可以画一个递归树并计算每一层的运行时间,最后我们把所有的时间加到一起。我们从给出的递归时开始一直往下画知道我们可以找到某种pattern。这种pattern一般都是等比数列或者等差数列
For example consider the recurrence relation
T(n) = T(n/) + T(n/) + cn2 cn2
/ \
T(n/) T(n/) If we further break down the expression T(n/) and T(n/),
we get following recursion tree. cn2
/ \
c(n2)/ c(n2)/
/ \ / \
T(n/) T(n/) T(n/) T(n/)
Breaking down further gives us following
cn2
/ \
c(n2)/ c(n2)/
/ \ / \
c(n2)/ c(n2)/ c(n2)/ c(n2)/
/ \ / \ / \ / \ To know the value of T(n), we need to calculate sum of tree
nodes level by level. If we sum the above tree level by level,
we get the following series
T(n) = c(n^ + (n^)/ + (n^)/) + ....
The above series is geometrical progression with ratio /. To get an upper bound, we can sum the infinite series.
We get the sum as (n2)/( - /) which is O(n2)
3.主定理 master method
主定理是一种可以直接得到结果的方法。但是主定理只能用于下面这种形式的递归式
T(n) = aT(n/b) + f(n) where a >= and b >
有三种情况
1. If f(n) = Θ(nc) where c < Logba then T(n) = Θ(nlogba)
2. If f(n) = Θ(nc) where c = Logba then T(n) = Θ(ncLog n)
3.If f(n) = Θ(nc) where c > Logba then T(n) = Θ(f(n))
一些标准算法用主定理来计算时间复杂度的例子:
merge sort 归并排序 : T(n) = 2T(n/2) + Θ(n). 是第二个case c=1 Logba = 1 所以时间复杂度是 Θ(n Logn)
binary search 二分查找: T(n) = T(n/2) + Θ(1).是第二个case c=0 logba = 0 时间复杂度是Θ(Logn)
分析递归式 Solving Recurrences------GeeksforGeeks 翻译的更多相关文章
- 【Python算法】递归与递归式
该树结构显示了从1(根节点)到n(n个叶节点)的整个倍增过程.节点下的标签表示从n减半到1的过程. 当我们处理递归的时候,这些级数代表了问题实例的数量以及对一系列递归调用来说处理的相关工作量. 当我们 ...
- C++扬帆远航——18(项目五2,递归式)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:qiushi.cpp * 作者:常轩 * 微信公众号:World ...
- 算法——快速排序迭代式和递归式的Java实现
快速排序迭代式和递归式的Java实现 快速排序基于分治法的思想,在待排序表中任选一值作为中枢值 pivot,一趟快排将所有大于该值的元素置于一边,小于该值的元素置于另一边,这样一个元素在排序中的最终位 ...
- 平摊分析 Amortized Analysis ------geeksforgeeks翻译
当偶尔一切操作很花的时间很慢,而大多数操作的时间都很快的时候,平摊分析的方法就很很好用了.在平摊分析中,我们分析一串操作并且可以得到最坏情况下的平均时间复杂度.例如hash table, disjoi ...
- 算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译
最坏,平均和最佳运行时间(Worst, Average and Best Cases) 在上一篇文章中,我们讨论到了渐进分析可以解决分析算法的问题,那么在这一篇中,我们用线性搜索来举例说明一下如何用渐 ...
- Makefile内置变量,递归式变量,直接展开式变量,条件赋值,追加赋值
将shell命令的输出赋值给变量: VALUE = $(shell 命令) Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) ...
- C# 递归式快速排序算法
static void Main(string[] args) { Console.WriteLine("************快速排序*****************"); ...
- 空间复杂度是什么?What does ‘Space Complexity’ mean? ------geeksforgeeks 翻译
这一章比较短! 空间复杂度(space complexity)和辅助空间(auxiliary space)经常混用,下面是正确的辅助空间和空间复杂度的定义 辅助空间:算法需要用到的额外或者暂时的存储空 ...
- Windows C++ 非递归式(stack)深度优先遍历目录
#include <Windows.h> #include <cstdio> #include <cstring> #include <string> ...
随机推荐
- wget进行整站下载
wget加上参数之后,即可成为相当强大的下载工具. wget -r -p -np -k http://xxx.com/abc/ -r, --recursive(递归) specif ...
- 树状数组--K.Bro Sorting
题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110064#problem/D Description Matt’s frie ...
- [moka同学摘录]Yii2.0开发初学者必看
想要了解更多YII,PHP方面内容,请关注本博客. 基础总结 1.修改默认控制器/方法 yii默认是site控制器,可以在web.php中设置$config中的'defaultRoute'='xxxx ...
- 常用SQL语句优化技巧
除了建立索引之外,保持良好的SQL语句编写习惯将会降低SQL性能问题发生. ①通过变量的方式来设置参数 好:stringsql = "select * from people p where ...
- andriod 图片选择器
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...
- 转:使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
http://www.cnblogs.com/WayneLiu/p/5060277.html 前言:重装系统前我使用的是vs2015(有点装*),由于使用2015实在在班上太另类了, 导致我想在其他同 ...
- Android DiskLruCache 硬盘缓存
概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技 ...
- Hibernate学习0.Hibernate入门
Hibernate是什么 面向java环境的对象/关系数据库映射工具. 1.开源的持久层框架. 2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据 ...
- iOS设计模式之迭代器模式
迭代器模式 基本理解 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示. 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应 ...
- 【原】iOSCoreAnimation动画系列教程(二):CAKeyFrameAnimation【包会】
在上一篇专题文章[原]iOSCoreAnimation动画系列教程(一):CABasicAnimation[包会]中我们学习了iOS核心动画CoreAnimation中CABasicAnimation ...