如何衡量算法的效率?时间复杂度空间复杂度

news2025/1/12 1:03:38

本篇博客会讲解如何衡量一个算法的效率。衡量算法的效率,主要有2个维度,分别是:时间复杂度和空间复杂度。

  1. 时间复杂度用来衡量算法的时间效率。时间复杂度越低,算法的耗时越短,效率则越高。
  2. 空间复杂度用来衡量算法的空间效率。空间复杂度越低,算法占用的空间越小,效率则越高。

我们实现算法时,应该尽可能的降低算法的时间复杂度和空间复杂度,提升程序的效率。那么,如何计算时间复杂度和空间复杂度呢?

时间复杂度&&空间复杂度

时间复杂度

时间复杂度计算的是算法执行的大致次数。举个例子:

void test(int n)
{
	int count = 0;
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			++count;
		}
	}

	for (int i = 0; i < 2*n; ++i)
	{
		++count;
	}

	for (int i = 0; i < 10; ++i)
	{
		++count;
	}
}

在函数test中,一共执行了几次++count呢?应该是n^2 + 2*n + 10次,这里为了直观,^并不表示异或的意思,而是次方的意思,比如n^2表示n的平方。

由于n^2 + 2*n + 10是一个准确的执行次数,我们称之为准确的时间复杂度函数式。一般来说,我们不会去考虑准确的时间复杂度函数式,有2个原因:

  1. 不好计算。虽然看起来我们算出了“准确”的执行次数,但是其实也不是很准确,因为还有其他的语句执行没有计算进去,比如++i,变量count的定义等。哪怕把这些语句都计算进去了,也只是C语言语句的执行次数,在编译期间,会转换为汇编语言,这些指令的执行次数你算了吗?很难吧。
  2. 不好比较。这些“准确”的式子太长了,如果有2个算法,想要比较它们的时间复杂度谁高谁低,不方便比较。

所以,时间复杂度一般采用大O的渐进表示法,这是一个估算值,规则是:

  1. 如果只有常数项,用O(1)表示。
  2. 只保留最高阶项。
  3. 系数取1。
  4. 一般变量取大写的N。

比如:准确的执行次数是n^2 + 2*n + 10,只取最高阶项N^2,且系数是1,得O(N^2)。下面再举几个例子:

  • 准确的执行次数:3*n^3 + 2*n^2 + n + 10000,大O的渐进表示法:O(N^3)。
  • 准确的执行次数:10000,大O的渐进表示法:O(1)。

下面再看一个问题:二分查找的时间复杂度是多少?不知道二分查找的朋友,戳这里

这里介绍时间复杂度的另外一个规则:只考虑最坏情况。那么,二分查找的最坏情况是什么呢?那就是:找不到!假设查找了x次,有2^x==N,即x=log2N,所以时间复杂度是:O(log2N),一般来说底数的2会比较难打出来,我是用数学公式的方式打出来的,为了简单起见,就写O(logN)来代替。

空间复杂度

空间复杂度计算的是算法消耗的额外空间,计算方式和时间复杂度类似,一般采用大O的渐进表示法,表示算法创建的额外变量的大概个数。比如冒泡排序:

void bubble_sort(int arr[], int sz)
{
	for (int i=0; i<sz-1; ++i)
	{
		bool flag = true; // 假设已经有序
		for (int j=0; j<sz-1-i; ++j)
		{
			if (arr[j] > arr[j+1])
			{
				flag = false;
				int tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
		if (flag)
		{
			break;
		}
	}
}

创建的额外变量有flag, i, j, tmp等,由于是常数项,故空间复杂度为O(1)。

举一个空间复杂度是O(N)的例子。对于递归求n的阶乘的算法:

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

由于会递归调用n次,每次调用都会创建一块栈帧,而栈帧里的额外变量是常数个,故空间复杂度是O(N)。

总结

  1. 时间复杂度和空间复杂度衡量的是算法的时间和空间效率,一般更加看重时间效率,所以会有“以空间换时间”的做法。
  2. 一般都采用大O的渐进表示法,时间复杂度计算大致的执行次数,空间复杂度计算额外创建变量的大致个数,计算时都只考虑最坏情况。
  3. 只保留最高阶项,且系数取1。如果只有常数项,则复杂度为O(1)。

感谢大家的阅读!

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

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

相关文章

Space Cloud updated Crack

Space Cloud updated Crack Space Git Flow-对于实践连续发布周期的开发团队来说&#xff0c;在协调团队成员、建立流程和集成多个工具时&#xff0c;建立交付流可能需要付出巨大努力。为了更容易做到这一点&#xff0c;引入了JetBrains Space Git流&#xff0c;这是一个完整的…

同一热卖商品的高并发写难题 - Lua脚本扣减库存方案

目录 一、Mysql高并发写时的行锁难题 二、Redis的相关命令 1. WATCH命令 2. EVAL与EVALSHA命令 三、SpringBoot执行Lua脚本代码示例 1. 依赖包 2. Lua脚本sku.lua 3. 加载Lua脚本 4. 执行Lua脚本 四、参考资料 一、Mysql高并发写时的行锁难题 通常来说&#xff0c;秒…

百度大模型ERNIE3.0

大模型对比 文心全景图 ERNIE 3.0

《Java8实战》第9章 重构、测试和调试

9.1 为改善可读性和灵活性重构代码 Lambda 表达式可以帮助我们用更紧凑的方式描述程序的行为。 9.1.1 改善代码的可读性 可读性非常主观&#xff0c;但是通俗的理解就是“别人理解这段代码的难易程度”。改善可读性意味着你要确保你的代码能非常容易地被包括自己在内的所有…

【Java|基础篇】方法的定义使用、重载以及递归

文章目录 1.什么是方法2.方法的定义和使用返回值类型形参与实参方法执行过程 3.⭐方法的重载4.递归5. 总结 1.什么是方法 方法就是组织好的,可重复使用的具有某种功能的特定代码块 (类似于函数) 在我们平时写代码时,如果遇到会经常使用的一些功能相同的代码时,我们就可以把这段…

在线考试系统学员答题批改日志,实战练习

一、环境要求 sandbox-hdp 2.6.4 或同等版本自建的HadoopHiveSparkHBase 开发环境。 二、数据描述 这是一份来自于某在线考试系统的学员答题批改日志&#xff0c;日志中记录了日志生成时间,题目难度系数&#xff0c;题目所属的知识点 ID&#xff0c;做题的学生 ID&#xff0…

Oracle的学习心得和知识总结(二十一)|Oracle数据库可插拔数据库PDB的创建及删除

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

华为OD机试(Java),5键键盘的输出

一、题目描述 有一个特殊的5键键盘&#xff0c;上面有a&#xff0c;ctrl-c&#xff0c;ctrl-x&#xff0c;ctrl-v&#xff0c;ctrl-a五个键。 a键在屏幕上输出一个字母a&#xff1b;ctrl-c将当前选择的字母复制到剪贴板&#xff1b;ctrl-x将当前选择的字母复制到剪贴板&#…

极氪要上市,吉利“基因改造”成功

文|智能相对论 作者| 落笔 当越来越多的国产新锐品牌入局新能源汽车市场&#xff0c;晚半拍的极氪却用较短的时间实现了主观逆袭。据统计&#xff0c;极氪001自问世以来便接连斩获消费者欢心&#xff0c;2022年极氪001更是实现了全年交付71941台的战绩&#xff0c;且持续蝉联…

ASP音乐网站的设计与实现

本文阐述了音乐网站的设计与实现&#xff0c;本系统采用ASPSQL Sever 2000作为开发工具。前台主要实现歌曲的分类显示及分类查询、歌曲的在线试听及下载、会员注册、登录以及最新音乐的新闻介绍&#xff0c;并且还为用户提供了在线交流的平台等功能&#xff1b;后台主要用于数据…

BGP路由优选实验

一&#xff0c;实验要求及其拓扑图 二&#xff1a;划分好IP的拓扑 三&#xff1a; 实验分析 1、使用 Preval 策略&#xff0c;确保R4通过R2到达192.168.10.0/24 1、抓取流量 [r4]ip ip-prefix PV permit 192.168.10.0 24 2、配置策略 [r4]route-policy PV permit node 10 [r4…

Web UI自动化测试框架

WebUI automation testing framework based on Selenium and unittest. 基于 selenium 和 unittest 的 Web UI自动化测试框架。 特点 提供更加简单API编写自动化测试。提供脚手架&#xff0c;快速生成自动化测试项目。自动生成HTML测试报告生成。自带断言方法&#xff0c;断言…

Linux常用环境配置

一、sqlite3 1、官网地址 SQLite Download Page 2、在Linux下载 右键复制源代码链接在linux用wget下载 wget https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz 3、解压 tar -xzvf sqlite-autoconf-3410200.tar.gz 4、编译 # 进入解压目录 cd sqlite-autoconf-34102…

App 版本更新插件介绍及使用指南

随着移动互联网的发展&#xff0c;APP 已经成为人们生活中必不可少的一部分&#xff0c;而版本更新也是 APP 发展过程中必不可少的环节。为了更好地实现 APP 版本更新和管理&#xff0c;我们推荐一个非常实用的插件&#xff1a;App 版本更新插件。 该插件支持强制更新、静默更…

Hystrix传递ThreadLocal范围对象的问题(最为细致的分析)

场景 在springcloud微服务体系下&#xff0c;从网关层开始要在request请求头放置一些重要参数&#xff0c;比如traceId&#xff0c;并要求在fegin之间的调用时&#xff0c;也能够一直传递下去&#xff0c;由于实际项目使用中&#xff0c;都是fegin集成了hystrix一起配合使用的…

cloud-canal的部署使用

一&#xff0c;官网参考&#xff1a; https://www.clougence.com/ https://www.clougence.com/cc-doc/quick/quick_start 二&#xff0c;点击下载私有部署版 返回数据&#xff1a; 版本号: 2.5.0.7 MD5值: 18e2502xxxxxxx 下载地址: https://tgzdownload.clougence.com/lates…

华为OD机试(Java),分班

一、题目描述 幼儿园两个班的小朋友在排队时混在了一起&#xff0c;每位小朋友都知道自己是否与前面一位小朋友是否同班&#xff0c;请你帮忙把同班的小朋友找出来。 小朋友的编号为整数&#xff0c;与前一位小朋友同班用Y表示&#xff0c;不同班用N表示。 二、输入描述 输…

PYQT5学习笔记01——PYQT5初体验以及PYQT5程序基本结构分析

一、PYQT5初体验 我们首先用代码编写一个窗口&#xff0c;窗口里面有一个标签控件&#xff0c;标签内的文本是 Hello World&#xff0c;代码如下&#xff1a; # -*- coding: UTF-8 -*- # 导入需要的包 from PyQt5.Qt import * import sys# 创建应用程序对象 app QApplicatio…

【c++初阶】:

c入门 一.概念二.使用三.应用四.常引用五.引用与指针 一.概念 c语言中我们常用指针找地址&#xff0c;但在c中&#xff0c;忽略了指针&#xff08;当然也可以使用指针&#xff09;。常用引用这个概念。 二.使用 可以看到这里的b和c本质上都是a&#xff0c;只是不同的称呼罢了。…

手把手教你将项目部署到服务器!

一、导入centos7虚拟机&#xff1a; 打开VMWare&#xff0c;点击“打开虚拟机”&#xff0c;选择centos7.ova之后&#xff0c;选择存储路径&#xff1a; 点击导入&#xff1a; 选择“不再显示此消息”&#xff0c;点击“重试”按钮&#xff1a; 点击“编辑虚拟机设置”&#x…