首页 > 其他分享 >数据结构 ——— 常见的时间复杂度计算例题(最终篇)

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

时间:2024-09-23 15:54:52浏览次数:3  
标签:表示法 数据结构 函数 复杂度 Fib Fac 例题

目录

前言

例题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的渐进表示法。

标签:表示法,数据结构,函数,复杂度,Fib,Fac,例题
From: https://blog.csdn.net/weixin_55341642/article/details/142426868

相关文章

  • 数据结构与算法——Java实现 12.习题——合并有序链表
    目录21.合并两个有序链表方法1递归思路方法2迭代思路 完整代码结点类方法 人各有所感,角度不同又怎能感同身受                                                ——24.9.2321.合并两个有序链表将两个......
  • 数据结构 - 概述及其术语
    经过上一章节《数据结构与算法之间有何关系?》的阐述,相信大家对数据结构多少有了点了解,今天我们将进入数据结构的正式学习中。在计算机科学中,数据结构是一种数据管理、组织和存储的格式。它是相互之间存在一种或多种特定关系的数据元素的集合。在计算机中一个静态数据是没有灵魂......
  • 树上数据结构问题
    天天爱跑步假设现在又一棵树如果一个人要从\(3\)跑到\(5\),那么如果在\(2\)点的观察员要满足\(w[2]=dep[2]-dep[3]\),如果在点\(4\)的观察员要满足\(w[4]=dep[fa[lca]]-dep[3]+dep[lca]-dep[4]\),简单来说就是如果处于\(i\)点的观察员可以观察到,那么要......
  • 链表-栈例题
    MT2135调整队伍马蹄集:链表小码哥迎来了他大学的第一次军训,军训的第一个项目就是列队,每个同学在队伍中都有属于自己的编号。但在练习过程中,教官怎么看这支队伍怎么不顺眼,于是决定调整一下队伍的顺序。为了顺便考验同学们的反应力,教官与学生们约定了一个口令,每当他说xy0,x号同学......
  • 数据结构--第三章 栈和队列
    注:根据严蔚敏等人的数据结构(C语言版)(第二版)记录,用于自己的复习记录。栈栈是限定仅在表尾进行插入和删除的线性表。表尾端称为栈顶,表头端称为栈底。不含元素的空表称为空栈。栈是后进先出的线性表。一、顺序栈的表示和实现顺序栈指的是利用顺序存储结构实现的栈,即利用一组连......
  • 数据结构--第二章 线性表
    注:根据严蔚敏等人的数据结构(C语言版)(第二版)记录,用于自己的复习记录。线性结构特点:除第一个元素无直接前驱,最后一个元素无直接后继外,其他每个数据元素都有一个前驱和一个后继。线性表的定义和特点线性表是最基本且最常用的一种线性结构。线性表:由()个数据特性相同的元素构成......
  • 数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点
    328.奇偶链表题目描述328.奇偶链表给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输......
  • 数据结构之线性表——LeetCode:80. 删除有序数组中的重复项 II,88. 合并两个有序数组,4.
    80.删除有序数组中的重复项II题目描述80.删除有序数组中的重复项II给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用O(1)额外......
  • 数据结构之线性表——LeetCode:82. 删除排序链表中的重复元素 II,21. 合并两个有序链
    82.删除排序链表中的重复元素II题目描述82.删除排序链表中的重复元素II给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。运行代码classSolution{public:ListNode*deleteDuplicates(ListNode......
  • 数据结构上机题第二周
    这题就套公式即可6-1结构体查找简单的遍历,但是注意字符串的存放,要在末尾处添加'\0',否则就会过不了intfind(RECORDa[],intn,RECORDb[]){intp=0,sum=0;intswj=0;for(inti=0;i<n;i++){if(a[i].score>=60&&a[i].score<=79){......