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

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


主定理

递归中,一个规模为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)级别


快排复杂度分析

由于快排分割随机,所以我们考虑平均复杂度。

所以有

两边同乘以n

又有

[1] - [2] 得

两边同除n*(n+1)得

累加求和,得

//γ为欧拉常数

所以

原文地址:https://www.cnblogs.com/chy-2003/p/9639494.html

时间: 2024-10-03 01:42:06

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

【译】 AWK教程指南 11递归程序

awk 中除了函数的参数列表(Argument List)上的参数(Arguments)外,所有变量不管于何处出现,全被视为全局变量.其生命持续至程序结束--该变量不论在function外或 function内皆可使用,只要变量名称相同所使用的就是同一个变量,直到程序结束.因递归函数内部的变量,会因它调用子函数(本身)而重复使用,故编写该类函数时应特别留心. 例如:执行 awk ' BEGIN { x = 35 y = 45 test_variable( x ) printf("Return t

怎样写出一个递归程序

作为小白,我看到递归程序只是能看懂,但是自己写不出来,我知道要有一个临界条件(这个并不难找),但我不知道怎么演进,这让我十分头疼,因此找到了一篇个人认为写的不错的文章如下,根据我对递归的理解和疑问对原文做了一些标注,欢迎各位大佬,写下自己对递归的理解,本小白感激不尽. 如何写一个递归程序 总是听到大大们说递归递归的,自己写程序的时候却用不到递归.其中的原因,一个是害怕写递归,另一个就是不知道什么时候用递归.这篇文章就浅析一下,希望看完之后不再害怕递归,这就是本文最大的目的. 递归到底有什么意义?

PHP 中巧用数组降低程序的时间复杂度

PHP 中巧用数组降低程序的时间复杂度 通常开发人员在写程序的时候,往往是把已经设计好或者构思好的运算逻辑,直接用编程语言翻译出来.程序能顺利编译通过,那是很令人高兴的事情.如果此时程序的运行时间还能接受,就会沉浸在写代码的成就感当中,常常在这个过程中忽略代码的优化.只有当程序运行速度受到影响时,才回过头去考虑优化的事情. 本文主要是介绍在 PHP 的编程中,如何巧用数组来降低因多层循环而引起的时间复杂度的问题.特别是当程序需要多次与数据库交互时,用此方法来优化你的代码,将会带给意想不到的效果.

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

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

开始学习C语言递归程序,汉诺(hanoi)塔问题尝试

汉诺问题:3个座A, B,C, 在A座有64个大小不等的盘,现在要把64个盘转移到另一个座,每次只能移动一个盘,且大盘不能放在小盘上面. 思考过程. 1)移动1个盘到另一个座需要搬1次,记 a(1) = 1 2)移动2个盘:在已经移动1个盘的基础上(用a1次),将第2个盘放到另一个空座(1次),然后再将第1个盘移动到第2个盘上,需要a1次,记 a(2) = 2 * a(1) + 1 3)移动3个盘:在已经移动2个盘的基础上(用a2次),将第3个盘放到另一个空座(1次),然后再将前2个盘移动到第3

C# 递归程序 获取某个节点下的全部子节点

/// <summary> /// 获取组织结构树 /// </summary> /// <param name="list"></param> /// <param name="id"></param> /// <param name="treeNodes"></param> /// <returns></returns> s

简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。

解答: 1)递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象. 2)递归算法一般用于解决三类问题: a.数据的定义是按递归定义的.(Fibonacci(斐波那契)函数) b.问题解法按递归算法实现.(回溯) c.数据的结构形式是按递归定义的.(树的遍历,图的搜索) 3).这是一个排列的例子,它所做的工作是将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc" 则程序会输出: abc acb bac bc

一些递归程序

代码一: #include<iostream> using namespace std; void ten_to_two(int num); int main() { int num=10; ten_to_two(num); return 0; } void ten_to_two(int num) { if(num!=0){ int m=num%2; num=num/2; ten_to_two(num); cout<<m; } } 代码二:(二进制的递归算法) #include &

c递归程序

递归 long recursin(int); void main() { int n; long result; printf("input a integer number: \n"); scanf("%d", &n); result = recursin(n); printf("%d! = %ld\n", n, result); } long recursin(int n) { long temp_result; if(n<0)