首页 > 其他分享 >递归时间复杂度

递归时间复杂度

时间:2023-09-12 14:33:54浏览次数:28  
标签:递归 int 复杂度 mid fib 时间 排序

时间复杂度

递归求斐波那契数列时间复杂度:O(2^n)

递归树分析

节点单一子问题代价:函数执行过程中,除去递归调用以外的代价

比如:

int fib(int n){
	if(n==1 || n==2){//前2项直接返回
		return 1;
	}
	return fib(n-1)+fib(n-2);//第3项=前两项之和
}

1 n=1 或 n=1时,return 1 时间复杂度为O(1)

2 n>2时 执行: fib(n-1)+fib(n-2) 除去递归,只有加法运算 时间复杂度为O(1)

3 需要计算整个过程多少个O(1)

4 如果是完美二叉树,即:所有都填满的情况下为O(2^n)

因此时间复杂度粗略计算为O(2^n)

实际再(sqrt(2))^n ~2^n之间,粗略计算 O(2^n)

精确计算其时间复杂度为:((1+sqrt(5))/2)^n

 

归并排序

分析

使用归并排序,

1 从中间把数列分成左右两部分

2 把分成的左右2部分中每部分再分成左右2部分

3 一直分下去,直到分拆成1个数

4 再按刚才拆的顺序合并

参考程序

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int n,a[N],tmp[N];

void merge(int L,int R,int mid){
	int i=L,j=mid+1,k=L;
	while(i<=mid && j<=R){
		if(a[i]<a[j]){
			tmp[k++]=a[i++]; 
		}else{
			tmp[k++]=a[j++];
		}
	}
	while(i<=mid) tmp[k++]=a[i++];
	while(j<=R)   tmp[k++]=a[j++];
	for(int i=L;i<=R;i++){
		a[i]=tmp[i];
	}
}

void mergeSort(int L,int R){
	if(L>=R) return;
	int mid=L+(R-L)/2;
	mergeSort(L,mid);//左半部分排序
	mergeSort(mid+1,R);//右半部分排序
	merge(L,R,mid);//合并
}

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	
	mergeSort(0,n-1);
	
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}

时间复杂度

归并排序时间复杂度为:O(n*logn)

节点单一子问题代价:函数执行过程中,除去递归调用以外的代价

归并排序被拆分了 logn层,每层合并代价为n,所以总代价为n*logn

标签:递归,int,复杂度,mid,fib,时间,排序
From: https://www.cnblogs.com/end/p/17696099.html

相关文章

  • java stream 取list时间较大的元素list
    packagecom.qianfan123.sail.cre.sync.dmp.plugin.service.impl;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Comparator;importjava.util.Date;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publi......
  • Padavan配置白名单模式及上网时间控制
    登录Padavan管理后台,高级设置--->防火墙--->mac访问控制--->mac访问控制模式【允许模式---仅列表中的设备可获取网络;拒绝模式---列表中的设备拒绝访问网络】,禁止访问路由器主机这项一定打开,不然试了下没效果,开了就是未在列表中的设备不能访问路由器,初次连接的设备也无法获取ip地......
  • Java获取时间戳的三种方式
    Java获取时间戳的三种方式System类中的currentTimeMillis()方法是三种方式中效率最好的,运行时间最短newDate()其实就是调用了System.currentTimeMillis(),再传入自己的有参构造函数Canlendar是区分时区的System.out.println(System.currentTimeMillis());//推荐使用Syste......
  • datetime:Python日期与时间值管理计算
    前言datetime库也用于时间日期的处理,主要用于完成日期和时间的解析,格式化和算术运算。本篇,将完整的介绍datetime库的应用知识。datetime.date与time库一样,datetime库也有获取当前日期的类,日历日期值用datetime.date表示。比如datetime.date.today()。具体代码如下:importdate......
  • 『具体数学』第1章 递归问题
      一切的开始。典例选讲hanoi塔  问题不加赘述。  想要解决问题,书中便借此问题引出一些解决问题的通法:先研究小的情形命名并求解  经过这两步与一些基础的构造,不难把hanoi塔问题变为一组递推式:\[\begin{array}{ll}&T_0=0;\\&T_n\leq2T_{n-1}+1,n>0.\end......
  • 43、linux环境下搭建时间服务器
    1、打开VMware打开虚拟机查看ip地址和网络是否正常 也可以通过ssh连接查询是否安装ntp模块执行:rpm-qa|grepntp查看etc下ntp配置文件 2、vi修改配置文件 增加两条信息,让ntpServer与自身同步,内置的时间服务器不可用时,使用local时间作为ntp服务提供给客户端。......
  • 存储过程跑太长时间,可能是这个原因!
     我这两天被一个问题缠住了,是关于四表连接的问题。我写了一个存储过程,本来就四张表,我用上了存储过程,一定有我(老板)觉得应该用存储过程的原因。    这里的业务是这样的:四张表分表为ABCD,其中B为A的复制表,D为C的复制表,复制表与原始表的差别只是多加了一个字段。而我做的业......
  • P3201 [HNOI2009] 梦幻布丁 启发式合并,时间复杂度
    [HNOI2009]梦幻布丁一种很暴力,很容易想到,但时间复杂度不对的做法:既然每一次修改是以颜色作为单位的,那就用set或者链表(vector)维护每一个颜色出现的位置。将颜色\(x\)改为\(y\)的时候,遍历\(list_x\)的每一个点,判断其左右是否为\(y\),更新ans(不同颜色块数量)时间复杂度最大为......
  • 视频直播点播平台EasyDSS流媒体服务器按时间调用录像,提示数据查询错误是什么原因?
    EasyDSS能实现视频流媒体的上传、转码、存储、录像、推拉流、直播、点播等功能,具备超低延迟、超高画质、超大并发访问量等特点,可应用在多样化的场景中,如:在线课堂、教育直播、校园活动直播、企业培训、游戏直播等。为了便于用户二次开发、调用与集成,我们也提供了丰富的API接口供用......
  • 搭建NTP时间服务器
    NTP:NetworkTimeProtocol,网络时间协议。利用ntp协议可以实现网络中的计算机时间同步。1、ntpdate存在时间服务器,可以使用ntpdate来立即同步本地时间。特点:执行一次命令就立即同步一次时间。不用修改配置文件,可以直接用例如:ntpdatentp.aliyun.com2、ntpntp是客户端......