数据结构 ——— 常见的时间复杂度计算例题(最终篇)

news/2024/9/23 9:20:12 标签: 数据结构, c语言, 算法

目录

前言

例题1:

例题2(例题1的延申):

例题3:


前言

在前两章分析了不少常见的时间复杂度计算例题,有固定执行N次的,也有要分情况看待的

数据结构 ——— 常见的时间复杂度计算例题(上篇)-CSDN博客

数据结构 ——— 常见的时间复杂度计算例题(中篇)-CSDN博客

接下来要分析的是递归算法的时间复杂度例题


例题1:

代码演示:

long long Fac(size_t N)
{
	if (N == 0)
		return 1;

	return Fac(N - 1) * N;
}

问:计算阶乘递归 Fac 函数的时间复杂度?

代码解析:

第一次进入 Fac 函数,先进行 if 判断,判断为假,就会再次执行 Fac 函数,知道 N 为 0 就递归返回,那么也就是:

Fac(N) -> Fac(N-1) -> Fac(N-2) -> …… -> Fac(2) -> Fac(1) -> Fac(0)

执行了 N 次,且每次执行是一个 if 判断,也就是每次执行常数次,也就是 N*1 = N,得出时间复杂度函数式:

时间复杂度函数式:F(N) = N

那么直接通过时间复杂度函数式得出大O的渐进表示法:

大O渐进表示法:O(N)


例题2(例题1的延申):

代码演示:

long long FFac(size_t N)
{
	if (N == 0)
		return 1;

	// 循环1
	for (size_t i = 0; i < N; i++)
	{
		//……
	}

	return Fac(N - 1) * N;
}

问:计算阶乘递归 FFac 函数的时间复杂度?

代码解析:

和 例题1 基本类似,唯一的区别在于 例题1 的每次递归中只执行 if 语句,也就是每次递归只执行了常数次,而 例题2 的每次递归除了执行了 if 语句,还执行了 for 循环,也就是 例题2 每次递归了 1+N 次,且递归了 N 次,所以得出时间复杂度函数式:

时间复杂度函数式:F(N) = N(1+N) = N^2 + N

由时间复杂度函数式和大O的渐进表示法规则得出:只保留最高项(去掉 F(N) 中的 N )得出大O的渐进表示法:

大O渐进表示法:O(N^2)


例题3:

代码演示:

long long Fib(size_t N)
{
	if (N < 3)
		return 1;

	return Fib(N - 1) + Fib(N - 2);
}

问:计算斐波那契递归 Fib 函数的时间复杂度?

代码解析:

最开始进入 Fib(N) 函数,先进行 if 判断,判断为假的话,就会执行 Fib(N-1) 和 Fib(N-2) ,而 Fib(N-1) 又会执行 Fib(N-2) 和 Fib(N-3) ,且 Fib(N-2) 就会执行 Fib(N-3) 和 Fib(N-4)……,以此类推,得出以下类似直角三角形的表达式:

2^0   ——   Fib(N)

2^1   ——   Fib(N-1)                 Fib(N-2)

2^2   ——   Fib(N-2) Fib(N-3)   Fib(N-3) Fib(N-4)

………………………………………………………………

2^(N-4)   ——   Fib(4) ……………………………

2^(N-3)   ——   Fib(3) Fib(2) …………

2^(N-2)   ——   Fib(2) Fib(1) 

由以上的表达式得出时间复杂度函数式:

时间复杂度函数式:F(N) = 2^0 + 2^1 + 2^2 + …… + 2^(N-4) + 2^(N-3) + 2^(N-2) 

化简时间复杂度函数式(错位相减法):

等式两边同乘2:

2*F(N) = 2^1 + 2^2 + 2^3 + …… + 2^(N-3) + 2^(N-2) + 2^(N-1)

错位相减:

2*F(N) =           2^1 + 2^2 + 2^3 + ……...... + 2^(N-3) + 2^(N-2) + 2^(N-1)

   F(N) = 2^0 + 2^1 + 2^2 + …… + 2^(N-4) + 2^(N-3) + 2^(N-2)

得:

F(N) = -1 + 2^(N-1) = 2^(N-1) -1

再根据时间复杂度函数式和大O的渐进表示法的规则推导出大O的渐进表示法:只保留最高阶项(除去 F(N) 中的 1 ) ;如果最高阶项存在且不是1,则去除与这个项目相乘的常数(除去 F(N) 中的1 ),得出大O的渐进表示法:

大O渐进表示法:O(2^N) 


结论

计算代码的时间复杂度时,不论代码是固定执行的次数,还是要分情况看待,还是递归执行,都要先推导出时间复杂度的函数式,再根据时间复杂度函数式和大O的渐进表示法的规则推导出大O的渐进表示法。


http://www.niftyadmin.cn/n/5671713.html

相关文章

物联网通信技术及应用 | 第三章 ZigBee技术概述

ZigBee技术概述 ZigBee技术的特点 数据传输率低&#xff0c;大约在20~250kbps&#xff1b;网络容量大&#xff0c;一个主节点最多可以管理254个子节点&#xff0c;子节点还可以由上一层网络节点管理&#xff0c;可以组成拥有65000个节点的大网&#xff1b;成本低、功耗低&…

基于51单片机的手环设计仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用ADC0832模拟分别检测心率、血氧、加速度&#xff0c;通过LED灯表达状态 矩阵按键设置阈值&#xff0c;通过DS18B20检测温度&#xff0c;具有灯光报警模块 二、硬件资…

Docker使用工作流程详解

Docker使用工作流程详解 1. 编写Dockerfile2. 构建镜像3. (可选)推送镜像4. 拉取镜像5. 运行容器6. 进入容器💖The Begin💖点点关注,收藏不迷路💖 Docker简化了应用的部署和运行。以下是Docker使用的基本流程: 1. 编写Dockerfile Dockerfile是构建Docker镜像的“配…

笔记本的快捷键分享

今天来跟大家分享一下常见的笔记本的快捷键 1联想 FnF1&#xff1a;让计算机进入睡眠模式 FnF2&#xff1a;关闭/开启LED屏幕背光 FnF3&#xff1a;显示器切换 FnF4&#xff1a;在宽屏幕和一般模式之间切换 FnF5&#xff1a;接通/断开无线网卡信号 FnF6&#xff1a;关闭…

句子成分——每日一划(十)

目录 一、原句 二、主要句子成分 三、 分词短语部分 四、定语从句部分 五、结构总结 六、句子改良 一、原句 Z-Library has always been a part of my study, providing many books that would otherwise require a lot of time or money to find. 来源&#xff1a;写作…

【VLM小白指北 (1) 】An Introduction to Vision-Language Modeling

开一个新坑Vision-Language Modeling (VLM) &#xff0c;原文76页&#xff0c;慢慢更&#xff0c;for beginners&#xff0c;但也不能之前啥都不会啊。 原文链接&#xff1a;An Introduction to Vision-Language Modeling Introduction 存在的问题&#xff1a;将语言与视觉相…

记一次Meilisearch轻量级搜索引擎使用

以前使用的是mysql的全文索引、最开始还行。后续觉得就不好用了&#xff0c;但是服务器资源有限&#xff0c;没法上ES&#xff0c;只好找一个轻量级的搜索引擎、找了半天&#xff0c;决定使用这一个&#xff0c;目前效果还不错的。 参考网址 官网&#xff1a;https://www.meil…

2024人工智能结课作业-DFS/BFS/Astar解决数码问题

1 深度优先遍历搜索(DFS) 1.1算法介绍 深度优先搜索算法&#xff08;Depth-First-Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所在边都己被探寻过&#xff0c;搜索将回溯到发…