数据结构-时间复杂度练习题集(含解析)

news/2024/4/19 11:28:22/文章来源:https://blog.csdn.net/m0_56494923/article/details/129540683

目录

  • 1 求时间复杂度
  • 2 求递归式时间复杂度

前言
  本文用于练习时间复杂度求解,共20+题,难度适中,题目来源为考研教辅书以及网上搜集,如有错误请指出,会第一时间进行修改。




1 求时间复杂度

1、求下列程序时间复杂度

void function(int n)
{if (n==1)return;for (int i=1; i<=n; i++){for (int j=1; j<=n; j++){cout << "*";break;}cout << endl;}
}

解析
别把内层的break看漏了



答案
O(n)O(n)O(n)



2、求下列程序时间复杂度

void function(int n)
{int count = 0;for (int i=n/2; i<=n; i++)for (int j=1; j<=n; j = 2 * j)for (int k=1; k<=n; k = k * 2)count++;
}

解析

void function(int n)
{int count = 0;// 执行 n/2 次for (int i=n/2; i<=n; i++)// 执行 n/2 次for (int j=1; j+n/2<=n; j = j++)// 执行 logn 次for (int k=1; k<=n; k = k * 2)count++;
}

因此结果就是三个层的时间复杂度相乘。



答案
O(n2logn)O(n^2logn)O(n2logn)



3、求下列程序时间复杂度

void function(int n)
{int count = 0;for (int i=0; i<n; i++)for (int j=i; j< i*i; j++)if (j%i == 0){for (int k=0; k<j; k++)printf("*");}
}

解析

void function(int n)
{int count = 0;// 执行 n 次for (int i=0; i<n; i++)// 执行 O(n*n) 次for (int j=i; j< i*i; j++)if (j%i == 0){// 执行 j 次 = O(n*n) 次for (int k=0; k<j; k++)printf("*");}
}

把每层执行次数乘起来,即可粗略得出时间复杂度。



答案
O(n5)O(n^5)O(n5)



4、求下列程序时间复杂度

count = 0
for (int i = N; i > 0; i /= 2)
for (int j = 0; j < i; j++)count++;

解析
这是道易错题。有些人会认为最外层循环执行了logNlogNlogN次,最内层NNN次,所以总时间复杂度为O(NlogN)O(NlogN)O(NlogN)次。这就是经典的错误~


正解:

考虑下count++会运行多少次:
当i=N时,它将运行N次。
当i=N/2时,它将运行N/2次。
当i=N/4时,它将运行N/4次。
以此类推···

因此,count++总共会运行N+N/2+N/4+...+1=2*N次。因此时间复杂度为O(N)O(N)O(N)



答案
O(N)O(N)O(N)



5、其中n为正整数,则最后一行的语句频度在最坏的情况下为:

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]);

解析
冒泡排序,最坏情况下相当于两个for循环跑满,故为O(n2)O(n^2)O(n2)



答案
O(n2)O(n^2)O(n2)



6、(2019·华中科技大学) 什么是时间复杂度?
解析略


7、求下列程序时间复杂度

int a = 0;
for (i = 0; i < N; i++) {for (j = N; j > i; j--) {a = a + i + j;}
}

解析
外层共执行N-1次,内层每次执行N - i次。因此可以列出式子:
∑i=0N−1(N−i)=∑i=0N−1N−∑i=0N−1i=N2−N(0+N−1)2=12N2+12N≈O(N2)\sum\limits^{N-1}_{i=0}(N-i)=\sum\limits^{N-1}_{i=0}N-\sum\limits^{N-1}_{i=0}i=N^2-\frac{N(0+N-1)}{2}=\frac{1}{2}N^2+\frac{1}{2}N \approx O(N^2)i=0N1(Ni)=i=0N1Ni=0N1i=N22N(0+N1)=21N2+21NO(N2)



答案
O(N2)O(N^2)O(N2)



8、求下列程序时间复杂度

void fun(int n){int i = 0;while(i * i * i <= n)i++;
}

解析
i++是基本运算,整体上不会改变循环的时间复杂度,故忽略不计;由t*t*t≤n,得到结果是O(n3\sqrt[3]{n}3n)



答案
O(n3\sqrt[3]{n}3n)



9、求 “m++” 执行次数

int m = 0, i, j;
for(i = 1; i <= n; i++)for(j = 1; j <= 2 * i; j++)m++;

解析
可以列出式子:
∑i=1n∑j=12i1=∑i=1n2i=2∑i=1ni=2n(n+1)2=n(n+1)\sum\limits^n_{i=1}\sum\limits^{2i}_ {j=1}1=\sum\limits^{n}_{i=1}2i=2\sum\limits^{n}_{i=1}i=2\frac{n(n+1)}{2}=n(n+1)i=1nj=12i1=i=1n2i=2i=1ni=22n(n+1)=n(n+1)



答案
n(n+1)



10、求下列程序时间复杂度

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

解析
递归算法的时间复杂度: 递归次数 * 每次递归中的操作次数
这里每次调用递归参数减1,故一共执行了n次递归调用。



答案
O(n)O(n)O(n)



11、求下列程序时间复杂度

int func(int n){int i = 0, sum = 0;while(sum < n) sum += ++i;return i;
}

解析
列举一些算式来找规律:
sum += ++i,得sum = sum + ++i
接着设t为循环执行的次数,则:

t=1时, sum = 0 + ++i = 0 + 1;
t=2时, sum = 0 + 1 + ++i = 0 + 1 + 2;
t=3时, sum = 0 + 1 + 2 + ++i = 0 + 1 + 2 + 3;

于是可以推出sum值计算式为:
t=k时, sum = 0 + 1 + 2 + ··· + ++(k-1) = 0 + 1 + 2 + ··· + k=k(1+k)/2
因为sum < n是终止循环的条件,所以我们令k(1+k)/2 < n,即
k(1+k)2<n\frac{k(1+k)}{2} < n2k(1+k)<n
计算过程此处不赘述,结果忽略掉常数项,保留n那一项就行。
解得 k = n12n^{\frac{1}{2}}n21
故时间复杂度为O(n12n^{\frac{1}{2}}n21)



答案
O(n12n^{\frac{1}{2}}n21)



12、求下列程序时间复杂度

for(int i = 1; i <= n; i++)for(int j = 1; j <= i; j++)for(int k = 1; k <= j; k++)x++;

解析
计算过程中用到了等差数列求和公式以及平方和公式
O(∑i=1n∑j=1i∑k=1j1)=∑i=1n∑j=1ij=∑i=1ni(1+i)2=12∑i=1n(i+i2)=12((1+n)n2+n(n+1)(2n+1)6)=6n2−2n3+n+112≈O(16n3)≈O(n3)O(\sum\limits^{n}_{i=1}\sum\limits^{i}_{j=1}\sum\limits_{k=1}^{j}1)=\sum\limits^{n}_{i=1}\sum\limits^{i}_{j=1}j=\sum\limits^{n}_{i=1}\frac{i(1+i)}{2}=\frac{1}{2}\sum\limits^{n}_{i=1}(i+i^2) =\frac{1}{2}(\frac{(1+n)n}{2}+\frac{n(n+1)(2n+1)}{6}) =\frac{6n^2-2n^3+n+1}{12} \approx O(\frac{1}{6}n^3) \approx O(n^3)O(i=1nj=1ik=1j1)=i=1nj=1ij=i=1n2i(1+i)=21i=1n(i+i2)=21(2(1+n)n+6n(n+1)(2n+1))=126n22n3+n+1O(61n3)O(n3)



答案
O(n3)O(n^3)O(n3)


2 求递归式时间复杂度

1、一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别(下式中,n是问题的规模,n为2的整数次幂)

T(n) = {1,n=12T(n/2)+n,n>1\begin{cases}1, n=1 \\2T(n/2)+n, n>1 \end{cases}{1,n=12T(n/2)+n,n>1

解析
对于递归程序求时间复杂度,有许多方法进行求解,如master定理、递归树、递推法等。
这里使用递推法来解题:
首先根据题意,得到①式:
T(n)=2T(n2)+n⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅①T(n)=2T(\frac{n}{2})+n ··············①T(n)=2T(2n)+n⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
接着用扩展递归技术将递推式进行扩展,即令n=n/2得到②式:
=2T(n22)+n2⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅②=2T(\frac{\frac{n}{2}}{2})+\frac{n}{2}·············②=2T(22n)+2n⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
再将②式代入①式,得到③式:
T(n)=2(2T(n22)+n2)+n⋅⋅⋅⋅⋅⋅⋅③T(n)=2(2T(\frac{\frac{n}{2}}{2})+\frac{n}{2})+n·······③T(n)=2(2T(22n)+2n)+n⋅⋅⋅⋅⋅⋅⋅
接着重复②③式的计算步骤:
=T(n)=2T(n/2)+n=T(n)=2T(n/2)+n =T(n)=2T(n/2)+n
=22T(n22)+2n=2^2T(\frac{n}{2^2})+2^n=22T(22n)+2n
.........
k=log2nk=log_2nk=log2n时,递归结束,此时即为最终的递推式:
T(n)=2log2nT(1)+nlog2nT(n)=2^{log_{2}n}T(1)+nlog_2nT(n)=2log2nT(1)+nlog2n
=n(log2n+1)=n(log_2n+1)=n(log2n+1)
=O(nlog2n)=O(nlog_2n)=O(nlog2n)



答案
O(nlog2n)O(nlog_2n)O(nlog2n)

补充

扩展递归技术是一种求解递推关系式的方法。它的作用是将递推关系式中等式右边的项根据递推式替换,这称为扩展,扩展后的项被再此扩展,依次下去,就会得到一个求和表达式。这样可以方便地计算出递归算法的时间复杂度。



2、一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别

T(n) = {1,0≤n≤12T(n−1)+1,n>1\begin{cases}1, 0≤n≤1 \\2T(n-1)+1, n>1 \end{cases}{1,0n12T(n1)+1,n>1

解析
递推法:
T(n)=2T(n-1)+1,于是推出
T(1)=2T(0)+1=20+20−1T(1)=2T(0)+1=2^0+2^0-1T(1)=2T(0)+1=20+201
T(2)=2T(1)+1=21+21−1T(2)=2T(1)+1=2^1+2^1-1T(2)=2T(1)+1=21+211
T(3)=2T(2)+1=22+22−1T(3)=2T(2)+1=2^2+2^2-1T(3)=2T(2)+1=22+221
.........
T(n)=2T(n−1)+1=2n−1+2n−1−1=2n−1T(n)=2T(n-1)+1=2^{n-1}+2^{n-1}-1=2^n-1T(n)=2T(n1)+1=2n1+2n11=2n1
保留最高次项,最终得:T(n)=2n−1=O(2n)T(n)=2^n-1=O(2^n)T(n)=2n1=O(2n)



答案
O(2n)O(2^n)O(2n)



3、分析递归与非递归算法下,斐波那契数列的时间复杂度

F(n) = {0,n=01,n=1F(n−1)+F(n−2),n>1\begin{cases}0, n=0 \\1, n=1 \\F(n-1)+F(n-2), n>1 \end{cases}0,n=01,n=1F(n1)+F(n2),n>1

递归算法

int Fib1(long long num){ if ((num == 1) || (num == 0)){ return num; } return Fib1(num-1)+Fib1(num-2); 
} 

解析
搞清楚了再回来填坑 (´ο`)

答案


非递归算法:

int Fib(int n) {if (n == 0) return 0;if (n == 1) return 1;int a = 0, b = 1;for (int i = 2; i <= n; i++) {int temp = a + b;a = b;b = temp;}return b;
}

解析
非递归算法只需用到一个循环。用两个变量来存储前两项的值,用一个循环来更新它们。



答案
O(n)O(n)O(n)



4、如下函数 mergesort() 执行的时间复杂度为多少?
假设函数调用被写为mergesort(1,n),函数 merge() 的时间复杂度为O(n)O(n)O(n)

void mergesort(int i, int j){int m;if(i != j){m = (i + j) / 2;mergesort(i, m);mergesort(i + 1, j);merge(i, j, m);  //这一句函数复杂度为O(n)}
}

解析
在这里插入图片描述

答案
O(nlog2n)O(nlog_2n)O(nlog2n) or O(nlogn)O(nlogn)O(nlogn)
两种写法是等价的,均为正确





5、一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别

T(n) = {3T(n−1),n>01,otherwise\begin{cases}3T(n-1), n>0 \\1, otherwise \end{cases}{3T(n1),n>01,otherwise

解析
根据递归式展开:
T(n)=3T(n−1)T(n)=3T(n-1)T(n)=3T(n1)
=3(3T(n−2))= 3(3T(n-2)) =3(3T(n2))
=32T(n−2)= 3^2T(n-2)=32T(n2)
=33T(n−3)= 3^3T(n-3)=33T(n3)
……
=3nT(n−n)= 3^nT(n-n)=3nT(nn)
=3nT(0)=3n= 3^nT(0) = 3^n=3nT(0)=3n



答案
O(3n)O(3^n)O(3n)



6、一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别

T(n) = {2T(n−1)–1,n>0,1,otherwise\begin{cases}2T(n-1) – 1, n>0, \\1, otherwise \end{cases}{2T(n1)–1,n>0,1,otherwise

解析
  展开递归式,计算前几项的值,你会发现每个式子结果都等于1:
T(n)=2T(n−1)–1=1T(n) = 2T(n-1) – 1=1T(n)=2T(n1)–1=1
=22(T(n−2))–2–1=1= 2^2(T(n-2)) – 2 – 1=1=22(T(n2))–2–1=1
=23(T(n−3))–22–21–20=1= 2^3(T(n-3)) – 2^2 – 2^1 – 2^0=1=23(T(n3))222120=1
……
因此时间复杂度就是O(1)O(1)O(1)
  注意,虽然本题一眼看上去递归关系是指数的,但通过展开递归关系式,得到了完全不同的结果。因此在处理这类问题的时候,最好能把递归式展开再确定时间复杂度。



答案
O(1)O(1)O(1)





附送一张壁纸ヽ(^ー^)人(^ー^)ノ
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 网络编程学习笔记——二、IP 协议详解

一、IP 服务的特点 IP 协议为上层协议提供无状态、无连接、不可靠的服务&#xff1a; 无状态&#xff08;stateless&#xff09;&#xff1a;指 IP 通信双方不同步传输数据的状态信息&#xff0c;因此所有 IP 数据报的发送、传输和接收都是相互独立的、没有上下文关系。 缺点…

Redis五种核心数据结构的基本使用与应用场景

文章目录五种核心数据结构StringHashListSetZset五种核心数据结构 String 常用操作 # 存入字符串键值对 SET key value# 批量存储字符串键值对 MSET key value [key value ...] # 存入一个不存在的字符串键值对 SETNX key value# 获取一个字符串键值 GET key# 批量获…

外贸网站排名优化,掌握这些技巧让你事半功倍!

作为一名外贸网站站长&#xff0c;我们都希望自己的网站能够排名靠前&#xff0c;从而吸引更多的潜在客户&#xff0c;提高网站的流量和转化率。 但是&#xff0c;想要在谷歌搜索引擎中取得好的排名并不是一件容易的事情。 在这篇文章中&#xff0c;我将分享一些我个人的经验…

JMM解析(java内存模型)

1.JMM 主要定义了对于一个共享变量&#xff0c;另一个线程对这个共享变量执行写操作后&#xff0c;这个线程对这个共享变量的可见性。 2.JMM和JVM的区别&#xff1a; JMM是用于高并发的&#xff0c;抽象了线程和主存之间的关系&#xff0c;比如线程之间共享的变量必须存储在…

代码随想录算法训练营第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

LeetCode 198 打家劫舍题目链接&#xff1a;https://leetcode.cn/problems/house-robber/思路&#xff1a;dp数组的含义dp[i]表示前i个房间&#xff08;包括第i个房间&#xff09;所能偷到的最大金额递推公式有两种情况&#xff1a;1、偷了第i个房间那么此时第i-1个房间肯定是不…

Python基础之操作mysql数据库

Python 标准数据库接口为 Python DB-API&#xff0c;Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库&#xff0c;你可以选择适合你项目的数据库&#xff1a;GadFlymSQLMySQLPostgreSQLMicrosoft SQL Server 2000InformixInterbaseOrac…

一、简单了解ElasticSearch

目录一、ElasticSearch简介1.ES与关系型数据库对比2.什么是全文检索3.分词原理&#xff08;基于倒排索引&#xff09;二、核心概念1.索引index2.映射mapping3.字段filed4.字段类型type5.文档document6.集群cluster7.节点node8.分片9.副本三、搭建es单机版、集群版1.搭建es2.集成…

项目质量管理工作 不得不重视的4大关键点

1、三大视角确保项目质量 我们需要从客户视角、SOW视角和组织视角三大视角&#xff0c;确保项目的质量。 从客户视角方面出发&#xff0c;满足客户的要求&#xff0c;如项目交付的准时性、项目质量的保证等。我们需要全力保障客户对项目质量的要求。 从SOW视角确保项目质量&…

ffpmeg笔记:(2)学习一个开源小demo:qt+sdl+ffmpeg,计算时间戳

文章目录前言1.源码和编译方法1.1编译方法&#xff1a;2.源码简单介绍2.1 播放线程类 PlayThread2.1.1 计算当前播放进度时间2.2 主界面类 MainWindow2.2.1 在Qt widget中显示视频2.2.2 控制区域的自动隐藏和再现前言 这个小demo实现了下面的功能&#xff1a; 1.打开文件。 2.…

操作系统(2.4.5)--管程机制

1.管程的定义 利用共享数据结构抽象地表示系统中的共享资源&#xff0c;而把对该共享数据结构实施的操作定义为一组过程进程对共享资源的申请、释放和其它操作&#xff0c;都是通过这组过程对共享数据结构的操作来实现的&#xff0c;这组过程还可以根据资源的情况&#xff0c;或…

跟着本文走,告诉你五类walmart最爱产品

在我们跨境圈一直流传着一句话&#xff0c;选品选的好啊&#xff0c;红利吃饱饱。选品的重要性相信不用龙哥多说&#xff0c;选品基本上就是决定了店铺的未来。好的选品不用愁流量、也不用担心走不长久。今天龙哥就来聊聊在walmart上&#xff0c;哪些选品是值得发展的。walmart…

synchronized 加锁 this 和 class 的区别

synchronized 是 Java 语言中处理并发问题的一种常用手段&#xff0c;它也被我们亲切的称之为“Java 内置锁”&#xff0c;由此可见其地位之高。然而 synchronized 却有着多种用法&#xff0c;当它修饰不同对象时&#xff0c;其意义也是不同的&#xff0c;下面我们一起来看。 ​…

实在智能RPA受邀出席2023年东莞市数字赋能峰会,聚力数智制造

3月17日&#xff0c;“数字东莞 科创强市2023年东莞市数字赋能峰会”在松山湖光大We谷圆满举行。本次大会以创新性、专业性、平台化、战略性等为特色&#xff0c;涵盖当今前沿技术、行业痛点、商业模式。会上中国信通院的专家分享了《东莞市数字经济发展报告&#xff08;2022年…

刷题day40:从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树

一、从中序与后序遍历序列构造二叉树 题意描述&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 需要利用后续遍历&#xff08;左右中…

java校园报修管理系统ssm

用户的主要功能有&#xff1a; 1.用户注册和登陆登陆系统 2.用户查看报修类型&#xff0c;在线申请报修信息 3.用户对报修信息进行评价 4.用户查看资讯公告信息 5.用户查看个人信息&#xff0c;修改个人信息&#xff0c;修改密码 6.用户在线提交意见反馈信息 7.用户查看报修记录…

记录一次接口套娃数据处理

由于后端接口设计历史遗留问题&#xff0c;要求在一个接口中&#xff0c;通过他返回的数据去请求其他接口&#xff0c;数据以表格的形式渲染出来 目录 前言 一、每次仅展示一个步骤图 二、整合接口数据&#xff0c;一次性渲染 1.请求步骤条接口的地方对数据进行处理 2.修改…

完全小白的pycharm深度学习调试+for循环断点条件设置

完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…

简单分析Linux内核基础篇——initcall

写过Linux驱动的人都知道module_init宏&#xff0c;因为它声明了一个驱动的入口函数。 除了module_init宏&#xff0c;你会发现在Linux内核中有许多的驱动并没有使用module_init宏来声明入口函数&#xff0c;而是看到了许多诸如以下的声明&#xff1a; static int __init qco…

C++基础算法③——排序算法(选择、冒泡附完整代码)

排序算法 1、选择排序 2、冒泡排序 1、选择排序 基本思想&#xff1a;从头至尾扫描序列&#xff0c;每一趟从待排序元素中找出最小(最大)的一个元素值&#xff0c;然后与第一个元素交换值&#xff0c;接着从剩下的元素中继续这种选择和交换方式&#xff0c;最终得到一个有序…

Redis(十四)【Redisson分布式锁基础介绍】

分布式锁 Redisson 一、Redisson 概述 什么是 Redisson Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。 Redisson 的宗旨是促进使…