首页 > 其他分享 >关于递归问题的复杂度计算

关于递归问题的复杂度计算

时间:2024-10-20 16:32:22浏览次数:6  
标签:计算 递归 复杂度 时间 func 递推 log

背景:前段时间在背八股,手撕快速排序,算法时间复杂度为\(O(nlogn)\),没想太多,记个结论就pass,和当初上算法课的时候一样;然后做小红书笔试题的时候,有一道题是这样:

void func(n){
    if(n==1){
       printf("good\n");
    }
    func(n-1);
    func(n-1);
}

    也是问时间复杂度,当时没多想就选了\(O(n)\)还是什么。今天脑子里忽然就闪过这样一个想法:递归的时间复杂度本质上就是关于递推式的求通项问题

    先来看最简单的一种递归形式,计算n!的递归代码:

int func(n){
    if(n==1){
         return 1;
    }
    return n*func(n-1);
}

    上面的代码对应的递推式为: \(f(n)=f(n-1)+O(1)\),我们简写为:\(f(n)=f(n-1)+1,f(1)=1\)。这个递推式求通项比较简单:\(f(n)=n\)。func的时间复杂度即\(O(n)\)。

    再说一下小红书那道笔试题,它对应的递推式为:\(f(n)=2f(n-1)+1,f(1)=1\)。这个用高中的那啥凑项技巧就是:\(f(n)+1=2(f(n-1)+1)\) => \(f(n)=2^n-1\)。故func的时间复杂度为\(O(2^n)\)。

    上面的例子都是第n项和第n-1项的递推式,然而我们在写代码的时候很容易碰到第n项和第x项(x!=n-1)的递推式,比如快速排序:

void quicksort(int l,int r){
    if(l<=r){
          return;
    }
    ...  //选取哨兵进行左右两边进行交换的过程,时间复杂度为O(n)

    quicksort(l,index-1);
    quicksort(index+1,r);
}

    在上述代码中,index可能是l~r的任意一个位置。理想情况下index会处于l和r中间,那么有:\(f(n)=2f(n/2)+n\)。

    一看,感觉能求,但是有点麻烦,这时候就该介绍一下主定理了。

    主定理,是分析递归算法时间复杂度的一种重要工具,尤其适用于具有分治结构的递归算法。它适用的递推式如下:

\[T(n)=a*T(n/b)+O(n^d) \]

    主定理本身就是递归的形式,是递归方法时间复杂度的一种表示法。T(n) 代表递归方法处理规模为n的数据量的时间复杂度,T(n/b) 代表调用子递归方法的总体时间复杂度,\(O(n^d)\) 代表调用子递归方法这行代码外其他代码(下面简称递归外代码)的时间复杂度。

    当一个递归问题可以表示成上述的递推式的时候,我们有:

    1. 当 \(d < \log_b(a)\) 时,递归时间复杂度为:O(\(n^{\log_b(a)}\))

    2. 当\(d = \log_b(a)\) 时,递归时间复杂度为:O(\(n^d \log n\))

    3. 当\(d > \log_b(a)\) 时,递归时间复杂度为:O(\(n^d\))

    证明思路大家自己去找吧,个人感觉记得结论就行。

    有了主定理后,我们来看理想下的快速排序:\(T(n)=2T(n/2)+O(n)\)。可以得到:a=2,b=2,d=1,有\(d = \log_b(a)\),对应第2种情况,故时间复杂度为:\(O(n \log n)\)。

    当然,这只是理想的情况,实际上快速排序的时间复杂度应该是index(哨兵位置)取不同值时得到的期望,更加麻烦,最后也是\(O(n \log n)\)。

    这篇博客只是自己的一些想法,写的比较简单,写的过程也有参考一些大佬的博客,比如https://www.cnblogs.com/wind-wound/p/18206958,这一篇就写的比较详细,水平高我太多。

标签:计算,递归,复杂度,时间,func,递推,log
From: https://www.cnblogs.com/nomore007/p/18472411

相关文章

  • # 2024-2025-1 20241408陈烨南 《计算机基础与程序设计》第4周学习总结
    2024-2025-120241408陈烨南《计算机基础与程序设计》第4周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标门电路,组合电......
  • 2024-2025-1 20241301 《计算机基础与程序设计》第四周学习总结
    |这个作业属于哪个课程|<2024-2025-1-计算机基础与程序设计>||这个作业要求在哪里|<2024-2025-1计算机基础与程序设计第一周作业>||这个作业的目标|<巩固知识,夯实基础>||作业正文|https://www.cnblogs.com/HonJo/p/18487439|教材学习内容总结1.pep9的体系结构PEP9是一个教......
  • 计算机网络 第一章 1.1.1 计算机网络的概念
    计算机网络第一章笑死,人生影响力最大的时候是,写错代码,影响了几百万玩家_信息化世界计算机网络定义分散,自治的计算机系统,连接起来0.0一个简单的计算机网络路由器家用路由器世界范围内的互联网(Internet)总结......
  • 基于node.js+vue花火在线投稿平台的设计与实现(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于在线投稿平台的研究,现有研究多集中于大型综合学术期刊或商业出版集团的投稿系统,如一些国际知名学术数据库的投稿流程优化、商业文学平台的稿件管理......
  • 基于node.js+vue基于Android宠物饲养管理APP的设计与实现(开题+程序+论文)计算机毕业设
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于宠物饲养管理的研究,现有研究主要以传统的线下管理方式以及简单的网页端管理为主。专门针对基于Android平台开发宠物饲养管理APP的研究较少。在国内......
  • 基于node.js+vue红十字会物资管理系统(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于红十字会物资管理系统的研究,现有研究主要集中在红十字会的整体运营管理、救援流程等方面,专门针对红十字会物资管理系统细致功能构建及优化的研究较......
  • 基于node.js+vue基于Android的“编程猿”学习App设计与实现(开题+程序+论文)计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于基于Android的学习类App的研究,现有研究主要以通用型学习App为主,如语言学习类、考证辅导类等。专门针对编程学习领域的Android应用研究较少。因此本......
  • 计算机组成原理位扩展与字扩展
    (1)位扩展用2片1K×4位存储芯片组成1K×8位的存储器。(注意:1K=,即10根地址线;4K即12根地址线,因为4=,12=10+2;8位即8根数据线,看到位就要想到数据线)。位扩展时,数据线分组相连(8根分两组、),第一个芯片连高位,第二个芯片连低位;地址线芯片的左面连高位右面连低位;  分别与芯片相连......
  • 2024-2025-1(20241321)《计算机基础与程序设计》第四周学习总结
    这个作业属于哪个课程<班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标<了解并学习AI功能,回顾一周课程心得>作业正文...本博客链接https://www.cnblogs.com/guchua......
  • 学期2024-2025-1 学号20241317 《计算机基础与程序设计》第四周学习总结
    学期2024-2025-1学号20241317《计算机基础与程序设计》第四周学习总结作业信息https://www.cnblogs.com/manurios/p/18487427这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程......