笔记 | 算法时间复杂度T(n)的计算方法

 👻 基本思想:找出关键语句总执行次数 T 与 输入规模 n 的关系式

     (本博客仅提供一种解题思路与通用方法,具体问题请具体分析)


👻 类型:while循环

🚀 思路

        找出不满足while条件时,关键语句总执行次数(即循环轮数 k)与输入规模 n 之间的关系

🚀 方法

        1、确定代码中的循环变量、限制项、终止项:

               👾 循环变量 i — 代码中进行循环的变量,例如下面的变量 i ;

               👾 循环轮数 k — while循环不满足条件结束时,代码总共循环的次数;

               👾  限制项 — 代码while限制条件的限制项,一般是关于循环变量 i 的函数,如下面代码的 i*i*i ;

               👾  终止项 — 代码while限制条件的终止项,一般是关于输入规模 n 的函数,如下面代码的 n/2 ;

        2、画表格找关系

        3、得出关系式: ,反解k得到关于终止项n的关系式g(n)。

        4、对k的关系式g(n)化简得到时间复杂度T(n)。

🚀 例题

        👾 例题1

// 计算该算法的时间复杂度
void func(int n){int i=1;while(i<=n)i=i*2;
}

        (1)找出循环变量、限制项、终止项

        (2)画表格,填表找关系

                🤖 第1轮:循环变量初始化为1。while判断后,限制项 i = 1,循环变量变为 i = i*2 = 2;

                🤖 第2轮:该轮初始循环变量为上轮的2。while判断后,限制项 i = 2,循环变量变为 i = i*2 = 4;

                🤖 第3轮:该轮初始循环变量为上轮的4。while判断后,限制项 i = 4,循环变量变为 i = i*2 = 8;

                🤖 第k轮:根据循环轮数k与限制项的关系可得此时限制项 i = 2^(k-1)。

        (3)得出关系式:  反解k得 

        (4)化简k的关系式g(n)可得算法时间复杂度T(n) = O(logn)

        👾 例题2

// 计算该算法的时间复杂度
void func(int n){int i=0;            while(i*i*i <= n) i++;
}

        (1)找出循环遍历、限制项、终止项

        (2)画表格,填表找关系

                🤖 第1轮:循环变量初始化为0。while判断后,限制项 i*i*i = 0,循环变量变为 i = i+1 = 1;

                🤖 第2轮:该轮初始循环变量为上轮的1。while判断后,限制项 i*i*i = 1*1*1 = 1,循环变量变为 i = i+1 = 2;

                🤖 第3轮:该轮初始循环变量为上轮的2。while判断后,限制项 i*i*i  = 2*2*2 = 8,循环变量变为 i = i+1 = 3;

                🤖 第k轮:根据循环轮数k与限制项的关系可得此时限制项 i*i*i = (k-1)^3。

        (3)得出关系式:  反解k得 

        (4)化简k的关系式g(n)可得算法时间复杂度T(n) = O(n^(1/3))

        👾 例题3

// 计算该算法的时间复杂度
void func(int n){int x=2;           while(x < n/2)    x = 2*x;
}

        (1)找出循环遍历、限制项、终止项

        (2)画表格,填表找关系

                🤖 第1轮:循环变量初始化为2。while判断后,限制项 x= 2,循环变量 x = 2*x = 4;

                🤖 第2轮:该轮初始循环变量为上轮的4。while判断后,限制项 x= 4,循环变量变为 x = 2*x = 8;

                🤖 第3轮:该轮初始循环变量为上轮的8。while判断后,限制项 x= 8,循环变量 x = 2*x = 16;

                🤖 第k轮:根据循环轮数k与限制项的关系可得此时限制项 x =2^k。

        (3)得出关系式: ,反解k得 

        (4)化简k的关系式g(n)可得算法时间复杂度T(n) = O(logn)

        👾 例题4

// 计算该算法的时间复杂度
void func(int n){int x=0;                 while(n >= (x+1)*(x+1)) x=x+1;
}

        (1)找出循环遍历、限制项、终止项 

         (2)画表格,填表找关系(过程略,直接给出第k轮)

                 🤖 第k轮:根据循环轮数k与限制项的关系可得此时限制项 (x+1)^2 =k^2。

        (3)得出关系式:  反解k得 

        (4)化简k的关系式g(n)可得算法时间复杂度T(n) = O(n^(1/2))

       👾 例题5

// 计算该算法的时间复杂度
void func(int n){int i=0,sum=0;      while(sum < n)      sum+ = ++i;
}

        (1)找出循环遍历、限制项、终止项 

          (2)画表格,填表找关系(过程略,直接给出第k轮)

                 🤖 第k轮:根据循环轮数k与限制项的关系可得此时限制项 sum = [k(k+1)]/2。

        (3)得出关系式:  反解k得 

        (4)化简k的关系式g(n)可得算法时间复杂度T(n) = O(n^(1/2))


👻 类型:for循环

🚀 思路

        在外层循环限制下,找出关键语句总执行次数T与轮数x、输入规模n与轮数x的关系,联立求解。

🚀 方法

        1、确定代码中的循环层数(以两层for循环为例)、内外层终止条件、内外层步长、关键操作语句:

               👾 内外层变量 — 若是嵌套for循环,确定各层循环变量,如下面代码的 i、j ;

               👾 外层终止条件 — 外层for循环终止的条件,如下面代码的 i<=n 条件;

               👾 内层终止条件 — 内层for循环终止的条件,如下面代码的 j<=2*i 条件;  

               👾 外层步长 — 外层for循环的步长,如下面代码的 i++;    

               👾 内层步长 — 内层for循环的步长,如下面代码的 j++;              

               👾 关键操作语句 — 关键操作代码,一般在最内层for循环,如下面代码的 m++ 语句;

        2、画表格找关系

        3、确定轮数x与输入规模n的关系式①,轮数x与关键语句总执行次数T的关系式②;

        4、联立①、②式,得到 总执行次数T 关于 输入规模n 的关系。化简得到时间复杂度T(n)。

附:等差、等比数列求和公式

🚀 例题

        👾 例题1

// 计算该算法的时间复杂度
int m=0;
for(int i=1;i<=n;i++)for(int j=1;j<=2*i;j++)m++;

        (1)确定内外层终止条件,内外层步长

        (2)画表格,填表找关系

                🤖 第1轮:外层变量 i 初始化为1。内层变量 j 从1到 2 (2*i) ,关键语句执行 2 次;

                🤖 第2轮:外层变量 i 为2。内层变量 j 从1到 4 (2*i) ,关键语句执行 4 次;

                🤖 第3轮:外层变量 i 为3。内层变量 j 从1到 6 (2*i) ,关键语句执行 6 次;

                🤖 最后一轮:最后一轮假设为x轮,则外层变量 i 为x。内层变量 j 从1到 2x (2*i) ,关键语句执行 2x 次;

        (3)得出轮数x与输入规模n的关系式①(当i=n时外层循环结束,此时轮数x即为n轮):

        (4)轮数x与关键语句总执行次数T的关系式②(将各轮执行次数累加):

        (4)联立①、②式,得:

        (5)化简得时间复杂度T(n) = O(n^2)

更直观的做法:

 👾 例题2

// 计算该算法的时间复杂度
int count=0;
for(int k=1;k<=n;k*=2)           for(int j=1;j<=n;j++)   count++;

        (1)确定内外层终止条件,内外层步长

        (2)画表格,填表找关系(过程略,直接给出最后一轮)

            🤖 最后一轮:最后一轮假设为x轮,则外层变量 k 为2^(x-1)。内层变量 j 与外层变量无关,从始至终都是从 1 到  n ,关键语句执行 n 次;最终终止条件为 k = n。

        (3)得出轮数x与输入规模n的关系式①(当外层变量 k = 2^(x-1) = n 时外层循环结束):

        (4)轮数x与关键语句总执行次数T的关系式②(将各轮执行次数累加):

        (4)联立①、②式,得:

        (5)化简得时间复杂度T(n) = O(nlogn)

 👾 例题3

// 计算该算法的时间复杂度
int sum = 0;
for(int i=1;i<n;i*=2)          for(int i=0;j<i;j++)       sum++;

        (1)确定内外层终止条件,内外层步长

        (2)画表格,填表找关系(过程略,直接给出最后一轮)

            🤖 最后一轮:最后一轮假设为x轮,则外层变量 i 为2^(x-1)。内层变量 j 从 0 到 i ,关键语句执行 i 次;最终终止条件为 i < n。

        (3)得出轮数x与输入规模n的关系式①(当外层变量 n-1 < i  < n 时循环结束,此时 i = 2^(x-1)):

        (4)轮数x与关键语句总执行次数T的关系式②(将各轮执行次数累加):

        (4)联立①、②式,得:

        (5)化简得时间复杂度T(n) = O(n)

  👾 例题4

// 计算该算法最后一行语句的频度在最坏情况下的时间复杂度(冒泡排序)
for(int i=n-1;i>1;i--)         for(int j=1;j<i;j++)      if(A[j]<A[j+1])swap(A[j],A[j+1]); // 交换A[j]与A[j+1]的值

        (1)确定内外层终止条件,内外层步长

        (2)画表格,填表找关系(过程略,直接给出最后一轮)

              🤖 最后一轮:最后一轮假设为x轮,则外层变量 i 为n-x。内层变量 j 从 0 到 i ,关键语句执行 i - 1 次;最终终止条件为 i < 1 ,即 i = 2。

        (3)得出轮数x与输入规模n的关系式①(当外层变量 i > 1 即 i = n-x = 2 时循环结束):

        (4)轮数x与关键语句总执行次数T的关系式②(将各轮执行次数累加):

        (4)联立①、②式,得:

        (5)化简得时间复杂度T(n) = O(n^2)

更直观的做法:


👻 类型:递归循环

🚀 思路

       找出总执行次数T与输入规模n之间的递推方程进行推导(递推法)

🚀 例题

        👾 例题1

// 计算该算法的时间复杂度
int func(int n){if(n<=1) return 1;         return n*func(n-1);        
}

        (1)算法通过 n*func(n-1) 语句进行递归,递归出口为func(1)。

        (2)每次递归调用func()方法时参数减1,共调用n次结束,即T=n,故时间复杂度为 O(n) 。

       

        👾 例题2

某算法的所需的时间由下面的递归方程表示,计算该算法的时间复杂度的级别。

式中,n是问题的规模,为简单起见,设n为2的整数次幂。

        (1)设 n = 2^k (k >= 0),则根据递归方程得:

                根据规律可得一般递推公式:

        (2)当 i = k 时,有:

                 又由  n = 2^k 得:

                即时间复杂度为O(nlogn)

        👾 例题3

汉诺塔难题源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在任何时候,小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。应该如何操作?

伪码如下:

算法 Hanoi (𝐵,𝐷,n) // n个盘子𝐵到𝐷
if n = 1 then move (𝐵,𝐷) // 1个盘子𝐵到𝐷
else Hanoi (𝐵,𝐶,n − 1)
move (𝐵,𝐷)
Hanoi (𝐶,𝐷,n − 1)

其递归方程如下:

请计算该算法的时间复杂度的级别。

        (1)根据递归方程得:

                根据规律可得一般递推公式:

        (2)当 i = n-1 时,有:

                即时间复杂度为O(2^n)

附:递归类型的时间复杂度计算方法除递推方法外还包括Master定理方法、递归树,具体可以参考该博客:三种方法求递归算法的时间复杂度(递推,master定理,递归树)

 


🌇 日落是免费的,春夏秋冬也是,不要觉得人生那么无望,希望你快乐。我们总是为许多遥不可及的事情奔波,却错过了路边的花开,傍晚落在身上的夕阳。忙着生活的同时记得去感受日常生活中的小细节,生活除了琐碎与平淡,还有可口的美食和无数盛开的花朵。晚风吹人醒,万事藏于心。我没说不公平也没说苦,我说我知道了 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1484049.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

fine BI 怎么制作桑基图

fine BI 怎么制作桑吉图 文章目录 fine BI 怎么制作桑吉图桑基图起源什么是桑基图一、数据二、导入帆软 BI三、组件并完成四、 外国桑基图资源&#xff08;sankeydiagram&#xff09;总结 桑基图起源 桑基图的起源可以追溯到1898年&#xff0c;‌当时Matthew Henry Phineas Ri…

《昇思25天学习打卡营第22天|生成式-Diffusion扩散模型》

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c;执行Python文件时&#xff0c;请…

嵌入式系统中的GPIO控制与应用

GPIO是嵌入式系统中最常见且功能最强大的接口之一。它允许硬件工程师通过编程来配置和控制芯片上的数字引脚&#xff0c;实现输入和输出的功能。在本文中&#xff0c;我们将从理论和实践两个方面探讨GPIO的工作原理&#xff0c;并通过一个简单的示例项目来演示如何利用GPIO控制…

微软全球系统蓝屏根源与警示

本次事件是一次由CrowdStrike软件更新引发的全球性IT问题&#xff0c;主要影响运行Windows操作系统的机器。CrowdStrike是一家知名的美国网络安全公司&#xff0c;其产品Falcon Sensor旨在保护云工作负载和终端安全&#xff0c;防止黑客攻击和系统中断。然而&#xff0c;这次故…

关于springboot的@DS(““)多数据源的注解无法生效的原因

对于com.baomidou.dynamic.datasource.annotation的DS注解&#xff0c;但凡有一个AOP的修改都会影响到多数据源无法生效的问题&#xff0c;本次我是添加了方法上添加了Transactional&#xff0c;例如下图&#xff1a; 在方法上写了这个注解&#xff0c;会影响到DS("db2&qu…

Hyper-V和VMWare使用对比

图片来自互联网 1.起因 最近在学习Linux相关的知识&#xff0c;第一步当然就是装虚拟机了。之前是基于微软Hyper-V平台装的Ubuntu,用起来总是感觉卡卡的。我还一直天真的以为虚拟机都是这个样子的&#xff0c;直到用了VMWare之后…。VMWare我主要装的是VMWare16Pro&#xff0…

Xinstall教你如何利用携带参数下载,精准追踪用户来源!

在移动互联网时代&#xff0c;App的推广和运营成为了各行各业竞相追逐的焦点。然而&#xff0c;随着渠道环境的日益复杂&#xff0c;如何精准追踪用户来源、提升运营效率&#xff0c;成为了摆在推广者面前的一大难题。好在&#xff0c;Xinstall携带参数下载技术的出现&#xff…

Java学习Day7

一 &#xff1a;数组和自定义数据类型的关系 1.1 有什么关系&#xff1f; 数组可以存储自定义数据类型 1.2 数组如何存自定义数据类型&#xff1f; 数组:数据类型[] 数组名 new 数据类型[长度]&#xff1b; 定义数组和初始化 Student[] arr new Student[5]; 自定义数据类…

2、建立模型,截图,参数配置(simulink仿真)

2、建立模型&#xff0c;截图&#xff0c;参数配置&#xff08;simulink仿真&#xff09; 基本技能建模导入Word&#xff08;截图是不要用qq截图&#xff0c;不专业&#xff0c;应使用其自带截图方式&#xff09;配置参数 基本技能 1&#xff0c;参数设置 2&#xff0c;结果保…

矩阵形式的bezier曲线

本文分享一段矩阵形式的bezier代码&#xff1a; clc clear% 控制点 P [25;10;5;13]; %% 获得M矩阵 n length(P) - 1; M zeros(n1,n1); for i 1:n1for j 1:n1if(ij<n3)M(i,j) (-1)^(n -i-j2)*nchoosek(n,n-i1)*nchoosek(n-i1,j-1);elseM(i,j) 0;endend end t_temp l…

Python爬虫(1) --基础知识

爬虫 爬虫是什么&#xff1f; spider 是一种模仿浏览器上网过程的一种程序&#xff0c;可以获取一些网页的数据 基础知识 URL 统一资源定位符 uniform resource locator http: 超文本传输协议 HyperText Transfer Protocol 默认端口 80 https: 安全的超文本传输协议 security…

【洁净室】压缩气体检测参考标准:悬浮粒子、微生物、水油检测

在洁净室&#xff0c;特别是达到ISO 5或更高级别的环境中&#xff0c;维护严格的污染控制是不可或缺的。其中&#xff0c;压缩气体的质量是一个至关重要的潜在污染源。为确保压缩气体不会引入损害洁净室完整性的微粒&#xff0c;适当的气体取样成为了一项核心任务。国际标准ISO…

生活中生智慧

【 圣人多过 小人无过 】 觉得自己做得不够才能做得更好&#xff0c;互相成全&#xff1b;反求诸己是致良知的第一步&#xff1b;有苦难才能超越自己&#xff0c;开胸怀和智慧&#xff1b;不浪费任何一次困苦&#xff0c;危机中寻找智慧&#xff0c;成长自己。 把困苦当作当下…

生成式之Diffusion扩散模型

前言 基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;的扩散模型&#xff0c;该模型已在图像/音频/视频生成领域取得显著成果。目前比较受欢迎的例子包括GLIDE、DALL-E 2、潜在扩散和图像生成。生成模型的扩散概念最早在2015年由Sohl-Dickstein等人…

系统架构师考点--统一建模语言UML

大家好。今天我来总结一下面向对象的第二个考点–统一建模语言UML。 UML(统一建模语言)是一种可视化的建模语言&#xff0c;而非程序设计语言&#xff0c;支持从需求分析开始的软件开发的全过程。UML的结构包括构造块、规则和公共机制三个部分。其中考点主要集中在构造块部分&…

7.15学习游戏体验

突然意识到今天的一天基本已经过去了大半&#xff0c;自己似乎并没有做了什么&#xff0c;但是似乎好像使用了很多次搜索&#xff08;针对百度使用高级搜索&#xff0c;搜索指定的内容和格式&#xff09;&#xff0c;在这个过程中&#xff0c;并不建议使用ai&#xff0c;它的总…

c#中匿名方法的定义和使用

​ namespace _7._16day01 {internal class Program{​static void Main(string[] args){Action<string, int> t2 (x, y) > { Console.WriteLine(xy); };Action t1 () > { Console.WriteLine("lamadab"); };Func<int ,int ,int > Add (x, y) &g…

MSCKF系统学习路程

推荐课程&#xff1a; https://www.youtube.com/watch?vRDkwklFGMfo&listPLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4http://TUM MVP YOUTUBE B站中英字幕 论文&#xff1a; Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 泡泡机器人论文推荐文章

每日OJ_牛客_OR62 倒置字符串

目录 牛客OR62 倒置字符串 题解及代码1 题解及代码2 牛客OR62 倒置字符串 倒置字符串_牛客题霸_牛客网 倒置字符串__牛客网 题解及代码1 #include <iostream> #include <string> #include <vector> using namespace std; int main() {string str;getli…

python--实验15 数据分析与可视化

目录 知识点 1 数据分析概述 1.1流程 1.2定义 1.3数据分析常用工具 2 科学计算 2.1numpy 2.1.1定义 2.1.2创建数组的方式 2.1.3np.random的随机数函数 3 数据可视化 3.1定义 3.2基本思想 3.3Matplotlib库 3.3.1模块 4 数据分析 4.1Pandas 4.2数据结构 4.3基…