【算法】从x的n次方看递归时间复杂度计算

文章探讨了不同方法计算x的n次方的时间复杂度,从最初的循环O(N)到递归算法的优化。通过递归2和递归3的比较,展示了如何利用二叉树模型将时间复杂度降低到O(logN),并强调了递归调用的次数和每次操作的负载度在计算时间复杂度中的重要性。
摘要由CSDN通过智能技术生成

从x的n次方看递归时间复杂度计算

1.循环

这个问题,最简单的办法是用循环

int pow1(int x,int n)
{
	int result = 1;
    for(int i=0;i<n;i++)
    {
        result*=x;
    }
    return result;
}

如上算法的时间复杂度为O(N),但还是不够理想。这时尝试使用递归算法

2.递归1

int pow2(int x,int n)
{
	if(n==0)// x^0 = 1
        return 1;
    return pow2(x,n-1)*x;
}

使用如上递归函数时间复杂度计算办法,该函数递归调用次数是从n一直减到0,即n次。每次递归中,需要进行一次相乘的计算,即O(1)

最终得到的时间复杂度 O(n*1) = O(n),这和我们用循环写出来的代码没两样

3.递归2,二叉树

int pow3(int x,int n)
{
	if(n==0)// x^0 = 1
        return 1;
    if(n==1)// 减少一次递归
        return x;
    if(n%2==1)// 奇数
    	return pow3(x,n/2)*pow3(x,n/2)*x;
    // 偶数方
    return pow3(x,n/2)*pow3(x,n/2);
}

最终求次方操作被抽象成了一个二叉树

image-20230419102447146

总递归次数,即二叉树中的节点个数。我们能算出来这颗满二叉树的节点个数为 2^4-1 = 15

所以一共递归了15次,每次的操作还是一个相乘,O(1)

所以最终的时间复杂度就是

递归次数 = 满二叉树节点个数 = 2^m -1
m = 二叉树层数(从1开始)= log(n)

带入可以计算出来,最终的二叉树总节点数是n-1个,时间复杂度还是O(N)。这说明我们的算法还不够好

二叉树相关知识点 https://blog.musnow.top/posts/4161984418/

4.递归3

如果观察第三个函数可以发现,不管是奇数还是偶数的奇怪,都进行了2次递归调用,但这两个递归调用都是完全相同的

pow3(x,n/2)*pow3(x,n/2);

也就是说,我们可以先递归调用1次,存结果再计算!

int pow4(int x,int n)
{
	if(n==0)// x^0 = 1
        return 1;
    if(n==1)// 减少一次递归
        return x;
    int tmp = pow3(x,n/2);
    if(n%2==1)// 奇数
    	return tmp*tmp*x;
    // 偶数方
    return tmp*tmp;
}

此时函数中只调用了1次递归,每次递归之后,数据都除2,所以总共是log2(n)次

每次递归,还是一个乘法操作,时间复杂度O(1)
O ( 1 ∗ l o g 2 n ) O(1*log_2n) O(1log2n)
最终得到的时间复杂度就是O(logN)

The end

这才是我们需要的时间复杂度较低的算法,同时也复习了递归调用的时间复杂度计算办法

递归时间复杂度 = 递归次数 * 每次操作的负载度
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值