【2022统考真题】计算时间复杂度

目录

一、题目描述

二、思路分析

三、易错提醒

四、同级和嵌套的关系

一、题目描述

下列程序段的时间复杂度是()

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

A. O(logn)

B. O(n)

C. O(nlogn)

D. O(n^2)

二、思路分析

首先我们先对外层循环进行分析:

外层每循环一次,i=i*2

即:i*2*2*2*2*2*...*2=n

每乘以一次2,代码执行一次;共乘了多少次2,就代表代码执行了多少次

设共执行了x次,所以:2^x=n

即x=logn

所以外层循环的时间复杂度为:O(logn)


接下来看内层循环:

我们发现,内层j的循环次数是基于外层i的值

由于j<i,每当外层循环迭代器一次,内层的循环次数就是i-1

因为i是呈指数的形式增长的

外层第一次执行循环:i=1=2^0

外层第二次执行循环:i=1=2^1

外层第三次执行循环:i=1=2^2

外层第四次执行循环:i=1=2^3

......

所以外层循环迭代器第k次的时候,i的值大概是2^(k-1)

所以外层循环第k次时,内层循环执行2^(k-1)-1次。

内层的总执行次数就是:1+2+4+8+......+2^(k-1)-1

这里求出的内层执行次数的总和,也就是内外层执行的次数

其实就是一个等比数列

等比数列求和公式有两种,当q!=1的时候,Sn=a1(1-q^n)/1-q  or  Sn=(a1-an*q)/1-q

因为k=logn

所以:

Sn= 1 * (1 - 2^(k-1))  / (1 - 2) = (2^k-1)  = 2^(logn-1) 

忽略掉1,则2^(logn-1) =n

时间复杂度为:O(n)

综上所B述:答案为B

三、易错提醒

  1. 为什么求出内层总循环次数就是求出总执行次数?
  2. 循环嵌套不该是内层循环次数*外层循环次数吗?
  3. 那外层明明也执行了,那不该把外层执行次数与内层执行次数相加吗?

这是我在写这道题碰壁的三个点。

个人见解如下:

3.1 内层总循环次数就是总执行次数的原因

在之前写代码,我们遇见过这种类型的代码:

int sum = 0;
for (int i = 0; i < n; i++)
{for (int j = 0; j < n; j++){sum++;}
}

我们知道,它的时间复杂度是:O(n^2)

那为什么是O(n^2)呢?

那就结合图来进行详细分析一下:

所以说,内层总循环次数就是求出了总执行次数。


3.2 是否可以内外层简单相乘的情况

那为什么图1代码求的方式是外层*内层即可,而图2却不能外层*内层?也就是n*logn?

简单分析来看:

  1. 因为图1的代码循环终止条件是相互不关联的,都是为n,所以可以进行简单的相乘来进行。
  2. 而图2的代码终止条件是具有关联性的,内层的循环次数取决于外层i的值,所以要逐步分析出当外层执行一次,内层循环次数的变化,并把内层相加。


3.3 内外层执行次数是否需要相加

那外层明明也执行了,那不该把外层执行次数与内层执行次数相加吗?

结合图进行分析:

那为什么求时间复杂度求最深层语句即可,不需要加上最外层的执行次数?

因为当n取很大值的时候,cpu运行速度很快,那些较小的数值就可以忽略不计,只需要计算属于哪个量级即可。

当n很大时,图3的n^2远远大于n ,可以忽略n,所以时间复杂度为O(n^2)

图4的n远远大于logn,可以忽略logn,所以时间复杂度为O(n)

因为时间复杂度本质是计算算法的执行次数属于哪个量级!!!

故而,我们解决了以上的三个问题!

四、同级与嵌套的关系

同级关系相加    嵌套关系相乘

我们对比以下两段代码:

代码一

//嵌套
int n = 10;
int sum = 0;
for (int i = 0; i < n; i++)
{for (int j = 0; j < n; j++){sum++;}
}

代码二

//同级
int n = 10;
int sum = 0;
for (int i = 0; i < n; i++)
{sum++;
}
for (int j = 0; j < n; j++)
{sum++;
}
cout << sum << endl;

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

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

相关文章

【工欲善其事】巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号

文章目录 巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号1 问题描述2 解决方案3 具体步骤4 效果测试5 小结与复盘 巧用 PowerShell 自动清除复制 PDF 文本时夹杂的换行符号 1 问题描述 不知各位是否也为复制过来的文本中夹杂的回车换行符抓狂过&#xff1f;就是在复…

作业2-线性回归的Matlab代码实现

一、前言 相关配置&#xff1a;Matlab 2020a&#xff08;版本的影响应该不大&#xff0c;.m代码基本都能运行&#xff0c;个人感觉就是Simulink对版本的要求高一些&#xff09; 二、任务描述 基于近两节课的理论推导&#xff0c;用代码实现线性回归&#xff0c;并对预测结果进…

基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

目标检测系统【环境详细配置过程】(CPU版本)

&#xff08;如果你使用的是笔记本电脑&#xff0c;没有比较好的GPU&#xff0c;可以配置CPU运行环境&#xff09; 链接&#xff1a;上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09; 1.安装…

MySQL中什么情况下类型转换会导致索引失效

文章目录 1. 问题引入2. 准备工作3. 案例分析3.1 正常情况3.2 发生了隐式类型转换的情况 4. MySQL隐式类型转换的规则4.1 案例引入4.2 MySQL 中隐式类型转换的规则4.3 验证 MySQL 隐式类型转换的规则 5. 总结 如果对 MySQL 索引不了解&#xff0c;可以看一下我的另一篇博文&…

CTF(七)

导言&#xff1a; 本文主要讲述在CTF竞赛中&#xff0c;Misc&#xff08;杂项&#xff09;题目中的CatchCat。 靶场链接&#xff1a;攻防世界 (xctf.org.cn) 一&#xff0c;分析题目。 下载并解压附件&#xff1a; CatchCat.txt文件内容为&#xff1a; 发现是坐标。 另一个…

表贴式永磁同步电机无感控制-基于滑膜观测器SMO法

导读:在全速域范围内,一般的永磁同步电机无感控制要分为低速区域和高速区域两个部分。原因在于常规的方法是利用模型建立反电动势观测器来求解转子位置信息,但其只适合在中高速区域。本文介绍一种基于滑膜观测器SMO法+PLL的方法。 需要文章中的仿真,关注微信公众号:浅谈电…

python机器人编程——用python调用API控制wifi小车的实例程序

目录 一、前言二、一个客户端的简单实现2.1 首先定义一个类及属性2.2 其次定义连接方法2.3 定义一些回调函数2.4 定义发送小车指令方法2.5 定义一个正常关闭方法 三、python编程控制小车的demo实现四、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源p…

【大数据技术基础 | 实验四】HDFS实验:读写HDFS文件

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;Java Classpath&#xff08;二&#xff09;Eclipse Hadoop插件 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;配置master服务器classpath&#xff08;二&#xff09;使用master服务器编写…

JVM学习总结:字节码篇

本文是学习尚硅谷宋红康老师主讲的 尚硅谷JVM精讲与GC调优教程 的总结 &#xff0c;部分内容也参考了 JavaGuide 网站&#xff08;文末有链接&#xff09; JVM 概述 Oracle JDK 与 OpenJDK 是什么关系&#xff1f; 2006 年 SUN 公司将 Java 开源&#xff0c;也就有了 OpenJDK。…

Games202作业5(完结)

单帧降噪 也就是针对图像空间进行降噪 也就是我们需要在像素&#xff08;i,j&#xff09;的四周进行采样&#xff0c;然后将采样的权重加到一起&#xff0c;然后所有的权重和像素的乘积也加到一起&#xff0c;然后相除&#xff0c;得到最终滤波后的(i,j)像素期望的结果。 Buf…

P4可编程技术详解:从理论到硬件实现

P4的诞生 为打破传统的固定封装模式&#xff0c;充分解放数据平面的编程能力&#xff0c;Nick McKeown领导的斯坦福大学研究团队于2014年提出可编程处理语言P4。借助P4的数据平面编程能力&#xff0c;用户可在网卡、交换机、路由器等网络设备上实现包括VXLAN、MPLS等在内的各种…

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处&#xff0c;在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis&#xff1a;查找命令的程序文件位置 2、locate&#xff1a;也是一种文件查找&#xff0c;但是基于数据库的查找 3、find&#xff1a;针…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

01 设计模式-创造型模式-工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 通过使用工厂模式…

1.2.3 TCP IP模型

TCP/IP模型&#xff08;接网叔用&#xff09; 网络接口层 网络层 传输层 应用层 理念&#xff1a;如果某些应用需要“数据格式转换”“会话管理功能”&#xff0c;就交给应用层的特定协议去实现 tip&#xff1a;数据 局部正确不等于全局正确 但是&#xff0c;数据的 全局正…

数码准备记录

1.数据结构 常见的数据结构包括数组、链表、栈、队列、树&#xff08;如二叉树、B树、B树&#xff09;、图等 2.队列和栈的区别 队列是一种先入先出的数据结构&#xff0c;即最先加入的元素被最先移除&#xff1b; 栈是一种后进后出的数据结构&#xff0c;即最后加入的元素…

RTMP协议分析

理论 总体介绍 RTMP协议是应⽤层协议&#xff0c;是要靠底层可靠的传输层协议&#xff08;通常是TCP&#xff09;来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后&#xff0c;RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…