详解时间复杂度计算公式(附例题细致讲解过程)

news2024/12/23 9:40:44

这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度空间复杂度,题目虽然写出来了,但是很没底。印象里数据结构老师讲过一点,沉睡的记忆苏醒了。只记得一个时间复杂度是O(n),空间复杂度是S(n)。for循环常常是O(n),具体是怎么算的不清楚。所以在看了相关的视频教学后,总结一下时间复杂度的计算公式,希望能给大家的学习带来帮助!

目录

一、什么是时间复杂度 

二、单层循环时间复杂度计算公式

三、两层循环时间复杂度计算公式

四、多层循环时间复杂度计算公式

方法一:抽象为计算三维物体体积

方法二:列式求和


一、什么是时间复杂度 

时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。

时间复杂度大小比较:

时间复杂度分类:

  • 算法完成工作最少需要多少基本操作叫做最优时间复杂度,是一种最乐观最理想的状态。
  • 算法完成工作最多需要多少基本操作叫做最坏时间复杂度,是算法的一个保障。
  • 算法完成工作平均需要多少基本操作叫做平均时间复杂度,它可以均匀全面的评价一个算法的好坏。

时间复杂度基本计算规则:

  1. 基本操作即只有常数项,认为其时间复杂度为O(1)
  2. 顺序结构,时间复杂度按加法进行计算
  3. 循环结构,时间复杂度按乘法进行计算
  4. 分支结构,时间复杂度取最大值
  5. 判断一个算法效率时,往往只需要关注操作数量的最高次项,其他次要项和常数项可以忽略
  6. 在没有特殊说明时,我们所分析的时间复杂度都是指最坏时间复杂度

二、单层循环时间复杂度计算公式

 解题步骤

  1. 列出循环趟数t及每轮循环i的变化值
  2. 找到t与i的关系
  3. 确定循环停止条件
  4. 联立两式解方程
  5. 写结果

 例题分析

 例一:

i = n*n;
whlie(i != 1)
    i = i/2;

第一步:列出循环趟数t及每轮循环i的变化值:

t0123
in^{2}\frac{n^2}{2}\frac{n^2}{4}\frac{n^2}{8}

第二步:找到t与i的关系:

 i=\frac{n^{2}}{2^{t}}

第三步:确定循环停止条件:

i = 1

第四步:联立第二步第三步两式解方程:

\frac{n^{2}}{2^{t}} = 1 \quad\quad n^2 = 2^t \quad\quad t = \log_2n^2

t = \log_2n^2 = 2\log_2n

所以得到时间复杂度为:

T = O(\log_2n)

例二:

x = 0;
while (n>=(x+1)*(x+1))
    x = x+1;

第一步:列出循环趟数t及每轮循环x的变化值:

t01234
x01234

第二步:找到t与x的关系:

 t = x

第三步:确定循环停止条件:

n = (x+1)^2

第四步:联立第二步第三步两式解方程:

(t +1)^2 = n

t = \sqrt[]{n}-1

所以得到时间复杂度为:

T=O(\sqrt[]{n})

 例三:

int i = 1;
while (i<=n)
    i = i *2

第一步:列出循环趟数t及每轮循环i的变化值:

t01234
i01234

第二步:找到t与x的关系:

 i = 2^t

第三步:确定循环停止条件:

i = n

第四步:联立第二步第三步两式解方程:

2^t = n

t = \log_2n

所以得到时间复杂度为:

T = O(\log_2n)

 例四:

int i = 0;
while (i*i*i<=n)
    i ++;

第一步:列出循环趟数t及每轮循环i的变化值:

t01234
i01234

第二步:找到t与x的关系:

 i=t

第三步:确定循环停止条件:

i^3 = t

第四步:联立第二步第三步两式解方程:

t^3 = n

t = \sqrt[3]{n}

所以得到时间复杂度为:

T=O( \sqrt[3]{n})

 例五:

y = 0;
while (y+1)*(y+1) <= n
    y = y+1;

第一步:列出循环趟数t及每轮循环y的变化值:

t01234
y01234

第二步:找到t与x的关系:

 t = y

第三步:确定循环停止条件:

(y+1)^2= n

第四步:联立第二步第三步两式解方程:

(t +1)^2 = n

t = \sqrt[]{n}-1

所以得到时间复杂度为:

T=O(\sqrt[]{n})

三、两层循环时间复杂度计算公式

 解题步骤

  1. 列出循环中i的变化值
  2. 列出内层语句的执行次数
  3. 求和,写结果

 例题分析

例一:

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

第一步列出循环中i的变化值:

第二步列出内层语句的执行次数:

i12345......n
内层语句执行次数246810......2*n次

第三步 求和,写结果

2+4+...+2n = \frac{2+2n}{2}n = n(n+1)

T= O(n^2)

 例二:

for (i=0;i<n;i++)
    for(j=0;j<m;j++)
        a[i][j] = 0;

第一步列出循环中i的变化值:

第二步列出内层语句的执行次数:

i01234......n-1
内层语句执行次数mmmmm......m次

第三步 求和,写结果

m*(n-1-0+1) = m*n

T = O(mn)

 例三:

count = 0;
for (k=1;k<=n;k*=2)
    for(j=1;j<=n;j++)
        count ++;

这里k*=2,不再是++,所以要先用单层循环求出变换趟数:

t1234
k1234

k = 2^{t-1}

t = \log_2k +1

内层每个都是n,求和则可以得到:

T= O(n\log_2n)

 例四:

for (i=n-1;i>=1;i--)
    for(j=1;j<=i;j++)
        if A[j] > A [j+1]
            A[j]与A[j+1]交换;

第一步列出循环中i的变化值:

第二步列出内层语句的执行次数:

in-1n-2......2
内层语句执行次数n-2n-3......1次

第三步 求和,写结果

\frac{n-2+1}{2}*(n-2) = \frac{n+1}{2}*(n-2)

T=O(n^2)

四、多层循环时间复杂度计算公式

方法一:抽象为计算三维物体体积

方法二:列式求和

例一:

for(i=0;i<=n;i++)
    for(j=0;j<=i;j++)
        for(k=0;k<j;k++)

方法一:抽象为计算三维物体体积:

 i依赖于n,j依赖于i,k依赖于j,三者都可以看成是n,再由体积公式V = \frac{1}{3}Sh可以求出

T= O(n^3)

方法二:列式求和:

\sum_{i=0}^{n}\sum_{j=0}^{i}\sum_{k=0}^{j-1} = \sum_{i=0}^{n}\sum_{j=0}^{i}\(j-1-0+1)= \sum_{i=0}^{n}\sum_{j=0}^{i}\j

\sum_{i=0}^{n}\sum_{j=0}^{i}\j= \sum_{i=0}^{n}\frac{i(i+1)}{2}=\sum_{i=0}^{n}(i^2+i)=\frac{1}{2}\sum_{i=0}^{n}i^2=\frac{1}{2}\sum_{i=0}^{n}i=O(n^3)

T = O(n^3)

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

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

相关文章

中学语文教学参考杂志社中学语文教学参考编辑部2022年第27期目录

理论学术_课题荟萃《中学语文教学参考》投稿&#xff1a;cn7kantougao163.com 统编教材鲁迅作品的民俗文化分析及教学应用 张家波;张晓静; 3-5 高中语文线上学习的实践与反思 张灵贵; 6-797 不同课型导学案设计建议 张桂霞; 8-997 现代化进程中的阵痛:《哦,香雪…

遇到Bug漏测,不能总想着甩锅吧

背景 漏测Bug是指产品逻辑缺陷在测试过程中没有被发现&#xff08;尤其是测试环境可以重现的缺陷&#xff09;&#xff0c;上线版本发布后或者在用户使用体验后发现并反馈回来的缺陷。 漏测Bug可能造成线上故障或者资损&#xff0c;在对产品测试过程中&#xff0c;自己也难免…

Pandas常见筛选数据的五种方法其一逻辑筛选。看见必懂,懂者必会,会者必加分

前言&#xff1a;Pandas的数据操作中&#xff0c;最基本的就是操作的筛选了&#xff0c;但是对新学员来说的这又是一个难点&#xff0c;因为方法比较多&#xff0c;不容易记。在此总结一下pandas中的一些常用的数据筛选操作。 逻辑筛选数据&#xff1a;切片&#xff08;[ ]&am…

ubuntu 安装、配置FTP

ubuntu 安装、配置FTP 提示&#xff1a;ubuntu 16.0.4&#xff0c;不同版本操作可能稍有不同 前言 本文主要对服务器安装及配置FTP做一个记录&#xff0c;涉及安装、配置、创建FTP账号、以及第一次连接异常等。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

单载波频域均衡matlab仿真,包括卷积编码维特比译码,矩阵交织,QPSK调制解调,导频插入,MMSE-FDE频域均衡

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 频域均衡是从校正系统的频率特性出发&#xff0c;利用一个可调滤波器的频率的频率特性去补偿信道或系统的频率特性&#xff0c;使包括可调滤波器在内的基带系统的总特性接近无失真传输条件。频域…

【Spring项目中的Controller理解】

目录 1. 添加依赖 2. 关于异常 1. 添加依赖 首先&#xff0c;需要保障此项目中存在spring-boot-starter-web依赖项&#xff0c;否则&#xff0c;当前项目并不具备Web应用程序开发所需的依赖&#xff01; 提示&#xff1a;spring-boot-starter-web是建立在spring-boot-starte…

基于Python的Django开发接口框架搭建

1、安装Django&#xff0c;如图1 命令行执行&#xff1a;pip install django 2、创建Django项目&#xff0c;如图2 django-admin startproject imooc 3、创建Django的应用项目&#xff0c;如图3 必须进入项目文件下执行命令&#xff1a; python3 manage.py startapp app …

✿✿✿JavaScript ---- 函数/js内置对象

目 录 一、函数 自调用函数如下演示&#xff1a; 二、JS中的内置对象 2.Number对象 3.Date 对象 补&#xff1a;第三方的日期工具类 moment.js 4.Math对象 5.数组对象 补&#xff1a;ES6中数组对象新增的方法 6.Global全局方法对象 7.RegExp(**)正则表达式对象 一、…

Word2010入门

Word简介 Microsoft Office Word 2010是微软公司的一个文字处理应用程序。 我们可以利用Word编辑文字、图文排版、建立表格、图形绘制。一直以来&#xff0c;Word都是最流行的文字处理应用程序。 .doc、.docx是Word软件默认存储文件类型&#xff0c; .docx正在逐步取代.doc。…

QT和网络调试助手之间的UDP通信

文章目录一、背景二、实现过程简述UDP协议工作原理及编程模型UDP 接收端UDP 发送端运行UDP接收端和发送端运行UDP发送端发送数据给网络调试助手一、背景 之前一篇博客实现了两个网络调试助手之间的UDP通信。 文章链接&#xff1a;在MacOS上实现两个网络调试助手的UDP通信测试…

西电数据库实验-学生学籍管理系统 数据库设计

西电数据库实验-学生学籍管理系统 数据库设计 文章目录西电数据库实验-学生学籍管理系统 数据库设计需求分析实体集联系集概念结构设计逻辑结构设计实体集department(id‾,name)department(\underline {id},name)department(id​,name)instructor(id‾,name,dept_id)instructor…

如何翻译英文音频?看完你就学会了

在平时的工作中&#xff0c;相信大家应该都会遇到一些不太熟悉的英文或者其它外文的语言&#xff0c;这给我们的生活带来了诸多烦恼&#xff0c;那遇到这种情况&#xff0c;我们应该怎么办呢&#xff1f;其实很简单&#xff0c;我们可以利用一些软件来将这些语言转换成中文&…

SpringCloud系列(三)Nacos 注册中心的搭建及服务发现

在 SpringCloud 系列&#xff08;一&#xff09;里面介绍了 Eureka 注册中心主要用来做什么&#xff0c;如何搭建并进行了简单的测试&#xff0c;但是 Eureka 有诸多不便之处&#xff0c;如需要配合 SpringCloud config 来实现&#xff0c;我们还需要再写一个 Module 进行启动等…

Python安装库教程(解决安装报错)

Python库安装以及报错解决方法 本文章以jieba库和wordcloud库的安装来演示安装以及安装过程报错的解决方法 一. 使用Pycharm安装 1. 没有创建项目&#xff08;创建了直接去往第二步&#xff09; 选择下一步 创建完成 2. 已经创建项目 3. 安装python库报错 如果显示这个就表示…

融云全球社交泛娱乐洞察,老资格的「游戏社交」还有哪些想象空间

一切应用都将社交化。关注【融云全球互联网通信云】回复【融云】抽取高颜值大容量高端可乐保温杯哦~ 融入社交能力&#xff0c;创造增长奇迹。激活用户在不同场景的社交需求&#xff0c;让各类应用焕发出了新的生命力&#xff0c;也让“社交X”成为出海最大的浪。 《2022 社交…

VMware ESXi 8.0 SLIC Unlocker, 集成网卡驱动和 NVMe 驱动

发布 ESXi 8.0 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;VMware ESXi 8.0 SLIC & Unlocker, 集成网卡驱动和 NVMe 驱动&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 发布 …

MYSQL练习题:报告系统状态的连续日期

题目&#xff1a;报告系统状态的连续日期 系统 每天 运行一个任务。每个任务都独立于先前的任务。任务的状态可以是失败或是成功。 编写一个 SQL 查询 2019-01-01 到 2019-12-31 期间任务连续同状态 period_state 的起止日期&#xff08;start_date 和 end_date&#xff09;。…

Spark系列之Spark的数据倾斜

title: Spark系列 第九章 Spark的数据倾斜 9.1 Spark调优概述 ​ 有的时候&#xff0c;我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜&#xff0c;此时 Spark 作业的性能会比期望差很多。数据倾斜调优&#xff0c;就是使用各种技术方案解决不同类型的数据倾斜问题…

安装TensorRT

安装TensorRT 安装可以查看官方文档&#xff1a;Installation Guide :: NVIDIA Deep Learning TensorRT DocumentationThis NVIDIA TensorRT 8.5.1 Installation Guide provides the installation requirements, a list of what is included in the TensorRT package, and ste…

性能测试 之进程上下文切换问题分析

安装监控平台 通过 grafana(前端) prometheus(时序数据库) node_exporter(硬件资源收集器) 安装监控系统 node_exporter 安装在被压测的服务器上&#xff0c;因为我本机已经安装过&#xff0c;所以只需要通过find 命令找到node所在位置&#xff0c;执行 ./node_exporter 启…