递归问题的时间复杂度分析

2017-12-30 17:01:18

递归问题的时间复杂度分析广泛存在于分治法和DP中,根据算法导论的记载,可以使用主定理的公式直接计算。另外,这篇文章介绍一下使用迭代手算的过程。

  • 主定理

  • 迭代计算

有一点需要说明:2^k*T(n/2^k) = 2^k*T(1) := 2^k*O(1) = n*O(1) = O(n)

原文地址:https://www.cnblogs.com/TIMHY/p/8150542.html

时间: 2024-10-16 15:55:24

递归问题的时间复杂度分析的相关文章

关于递归的理解及递归表达式复杂度分析(以求解最大公约数为例)

一,递归的四大基本法则: ①基准情形 基准情形是指那些不需要递归(不需要经过函数调用)之后就能退出的情况.它保证了递归的结束. ②不断推进 每一次递归之后,都要向着基准情形靠近,并且在靠近的过程中问题的规模越来越小. ③设计法则 书上说是:假设所有的递归调用都能运行-----“不是特别理解” ④合成效益法则 不要在不同的递归调用中做重复的工作. 二,实例 求解最大公约数--采用欧几里德算法 1 public static int gcd_recursive(int m, int n){ 2 if

递归算法的时间复杂度分析 转载

在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解.实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法: (1)代入法(Substitution Method)        代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理.        (2)迭代法(Iteration Method)        迭代法的基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和

递归算法时间复杂度分析与改善

递归算法大家都不陌生,当需要重复计算相同问题时,一般可以选择递归和循环两种算法.又因为递归实现起来代码比较简洁,所以通常都会使用递归来解决上述问题.比如斐波那契数列,再比如树的前序.中序.后续遍历算法. 递归算法虽然是有代码简洁这个优点,但是其缺点显著.因为递归函数是在执行过程中调用其自身,所以会占用大量的栈上空间,并且压栈和出栈都是有时间消耗的.所以从这一点上来看,递归的效率是不如循环.除了效率之外,递归还有一个相当明显的问题:可能会导致栈溢出.当递归调用的次数过大时,很有可能会出现栈溢出的情

红黑树的插入和遍历时间复杂度分析

红黑树的插入和遍历时间复杂度分析 在平常的工作中,最常用的一种数据结构恐怕是std::map了.因此对其的时间复杂度分析是有必要的,编写程序时做到心中有底. 一.理论分析 在stl中std::map和std::set都采用红黑树的方式实现.我们知道插入一个元素到红黑树的时间为log(N),其中N为当前红黑树的元素个数,因此,采用插入方式构建元素个数为N的红黑树的时间复杂度为: log(1) + log(2) + log(N-1) = log((N-1)!) = Nlog(N) 那么采用迭代器遍历

关于递归程序的时间复杂度

关于递归程序的时间复杂度 主定理 递归中,一个规模为n的问题分成a个规模为n/b的问题,额外计算复杂度为c*n^d,那么 证明 我们画出递归树,则递归树共有logb(n)+1层.对于第j层,有a^j个子问题,每个子问题规模为n/b^j. 则第j层所用时间为 接下来求所有层的和 根据a与b^d的大小讨论,易得主定理中结论 tip 若不为平均分,则设最大的一部分为p*n(0 < p < 1),则树的深度为 又由于 所以深度依旧是log(n)级别 快排复杂度分析 由于快排分割随机,所以我们考虑平均复

C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这个游戏:按这样的规则,剩下一个人,游戏就结束,这个人就为赢家.(读者可以试着表达,不认同,直接忽略) 抽象分析 这个人就是一个数据个体,数据结点,数据元素.上面产生的数据结构为:单方向循环的链.可以用链表实现,也可以用数组来实现. 链表到数组的迁移 人(数据元素. 数据结点.数据个体) 结点关系 (

选择排序的时间复杂度分析

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(最后),直到全部待排序的数据元素排完.选择排序是不稳定的排序方法. 选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了.那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了.比较拗口,举个例子,序列5 8 5

合并排序算法时间复杂度分析

一.合并已排序的两个数组,依次比较两个数组元素大小,并按大小加入到暂存数组B,最后保存到A: Algorithm: MERGE(A, p, q, r) 输入:数组A[p...q]和A[q+1...r],各自按升序排列 输出:将A[p...q]和A[q+1...r]合并后的升序排序的新数组 01. s←p; t←q+1; k←p; {s, t, p 分别指向A[p...q], A[q+1...r]和暂存数组B} 02. while s≤q and t≤r 03. if A[s] ≤A[t] the

算法时间复杂度分析基础

摘要      本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. 前言      通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度.算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上