递归式的三种求解方式

求解递归式对于分冶算法的重要性不言而喻

以下介绍了三种求解递归式的方法

1,代换法:

缺点:代换法主要的缺点在于,对于任何递归式,我们先得去猜其解,对于猜错了同学,如果不幸猜出的结果和正确结果相差太大,虽然可以推导,但是意义不大;

优点:代换法相较于递归树法更为严谨,相较于主定理应用范围更广,主定理只能求解类似于T(n) = aT(n/b)+n/c这种形式的递归式;

下面给出一个递归表达式T(n) = 2T(n/2)+n,求其解;

首先猜一下其解为O(nlgn);那么我们只需要证明T(n)<cnlgn即可

先假设T(n)<cnlgn对于n/2也成立,那么T(n/2)<=c(n/2)lg(n/2)也成立

那么必然的T(n)<=2(c(n/2)(lgn/2))+n-=cnlgn-cnlg2+n<=cnlgn-cn+n

以上表达式,在c>=1时永远成立,得证递归式T(n) = 2T(n/2)+n的解为O(n)

其他递归式的求解方式和上面的大体相似;

2,递归树法

递归树方法利用了将递归式分解为一棵递归树的形式来更加直观的求解递归式;

缺点:递归树方法求解递归式因为丢弃了很多低阶项,所以不够严谨;

优点:递归树方法求解递归式从视觉上更为直观,简单。一般可以先运用递归树求解,然后利用代换法更加严谨得证明用递归树求解的解的数学上的正确性;

下面求T(n) = 2T(n/2)+n的解

首先将上述递归表达式用递归树表达出来,

不会画图,比较丑。

以上递归式的深度为lgn,每层的代价为n,自然推导出T(n) = T(n/2)的解为O(nlgn)

以上递归式的求解比较简单更为复杂的求解参考算法导论;

3,主定理

主定理是最为简单求解递归式的解的方法,也是我最为喜欢的一种分析方法

主定理给出如下的如下形式的通用的递归式:T(n) = aT(n/b)+f(n)

主定理套公式分为以下三种情况

符号打得心累直接截图:

以上为三种递归式的求解方法。

原文地址:https://www.cnblogs.com/itqczzz/p/9388214.html

时间: 2024-08-29 18:55:56

递归式的三种求解方式的相关文章

二叉树的三种遍历方式的循环和递归的实现方式

///////////////////头文件:BST.h//////////////////////// #ifndef BST_H #define BST_H #include "StdAfx.h" #include<iostream> #include<stack> template<typename DataType> class BST { public: class Node { public: Node(int data=0):m_dat

垃圾回收(GC)的三种基本方式

垃圾(Garbage)就是程序需要回收的对象,如果一个对象不在被直接或间接地引用,那么这个对象就成为了「垃圾」,它占用的内存需要及时地释放,否则就会引起「内存泄露」.有些语言需要程序员来手动释放内存(回收垃圾),有些语言有垃圾回收机制(GC).本文就来讨论GC实现的三种基本方式. 其实这三种方式也可以大体归为两类:跟踪回收,引用计数.美国IBM的沃森研究中心David F.Bacon等人发布的「垃圾回收统一理论」一文阐述了一个理论:任何垃圾回收的思路,无非以上两种的组合,其中一种的改善和进步,必

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点 用 数组下标表示法 表示一个节点 二叉树的主要方法 二叉树的创建 二叉树的添加元素 二叉树的删除元素 二叉树的清空 获得二叉树的高度 获得二叉树的节点数 获得某个节点的父亲节点 二叉树的遍历 先序遍历 中序遍历 后序遍历 遍历小结 总结 树的分类有很多种,但基本都是 二叉树 的衍生,今天来学习下二

树的高度,深度,层数和三种遍历方式

树的高度: 当只有一个根节点的时候,高度就是0. //计算树的高度int depth(Node node){ if(node == NULL) return -1; int l = depth(node->left); int r = depth(node->right); return (l < r)?(r+1):(l+1);//当只有一个根节点的时候,高度就是-1+1=0} 层数: 树的高度最底下的为第1层(有的书定义为第0层),依次向上累加 树的深度: 完全二叉树是指这样的二叉树:

java代码中init method和destroy method的三种使用方式

在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. 周末对这两个方法进行了一点学习和整理,倒也不是专门为了这两个方法,而是在巩固spring相关知识的时候提到了,然后感觉自己并不是很熟悉这个,便好好的了解一下. 根据特意的去了解后,发现实际上可以有三种方式来实现init method和destroy method. 要用这两个方法,自然先要知道这两

jenkins介绍部署及三种构建方式配置

[隐藏] 1前言 1.1jenkins介绍 1.2jenkins好处 1.3我的jenkins实践 1.4jenkins使用前提 2jenkins部署 2.1下面内容介绍 2.2环境介绍 2.3jenkins安装 3插件安装 3.1手动下载jenkins插件 4Jenkins密钥配置 5jenkins触发式构建 6jenkins参数化构建 7jenkins定时构建 8Jenkins用户权限设置 8.1新创建一个用户 8.2用户权限设置 1.前言 1.1.jenkins介绍 jenkins是基于j

php 递归函数的三种实现方式

递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解.递归函数也是解决无限级分类的一个很好地技巧.如果对无限级分类感兴趣,请参照php利用递归函数实现无限级分类.我习惯套用通俗的话解释复杂的道理,您确实不明白请参见手册. 利用引用做参数 先不管引用做不做参数,必须先明白引用到底是

试比较三种交换方式

参考链接:http://blog.chinaunix.net/uid-21411227-id-1826932.html三种交换技术及其比较2010-09-22 17:17:57 分类: 系统运维 一.电路交换: “电路交换”(Circuit Switching)又称为“线路交换”,是一种面向连接的服务.两台计算机通过通信子网进行数据电路交换之前,首先要在通信子网中建立一个实际的物理线路连接.最普通的电路交换例子是电话系统.电路交换是根据交换机结构原理实现数据交换的.其主要任务是把要求通信的输入端

Linq to Sql : 三种事务处理方式

原文:Linq to Sql : 三种事务处理方式 Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).MSDN中描述得相对比较粗狂,下面就结合实例来对此进行阐述. 0. 测试环境 OS Windows Server 2008 Enterprise + sp1 IDE Visual Studio 2008, .net framework 3.5 + SP1 DB SQL Server 2000 + sp