复杂度的讲解

1.算法效率

如何衡量一个算法的好坏?从两个维度,时间和空间(算法运行的快慢,消耗的空间大不大)。因为计算机硬件领域的高速发展,如今计算机的存储量已经达到了一个很高的程度,所以现在我们一般重点关注时间复杂度,空间复杂度也就不那么被重视了。

2.时间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数表达式(数学意义上的函数)。时间复杂度描述的不是算法运行的具体时间,因为一个程序的时间是没有标准的,他跟计算机的硬件有很大的关系,而一个算法的运行时间与其中语句的执行次数是成正比例的,所以时间复杂度描述的是算法中的基本操作的执行次数。

找到某条基本语句和问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。比如下面这段代码:

void test(int N)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < i; j++)
		{
			printf("* ");
		}
		printf("\n");
	}
}

这个算法的基本语句就是循环中的打印星号和打印换行,打印星号的执行的次数是(0+1+2+……+N-1)=N(N-1)/2,而打印换行的执行次数为N次,所以这个算法的时间复杂度为N(N+1)/2。但是我们一般不需要准确的执行次数,只需要知道大概的次数就行了,于是就有了一种大O的渐进表示法。比如这个算法,我们一般描述它的时间复杂度就是O(N^2)

大O的渐进表示法的规则:

1.用常数1取代运行时间中的所有加法常数

2.在修改后的运行次数追踪,只保留最高阶

3.如果最高阶项系数存在且不为1,则去除这个项的常数系数。

如果表达式结果是常数,那就是O(1)

就比如上面的算法,准确的运行次数是N^2/2+N/2,首先去除加法常数,因为没有,所以不用管。如何只保留最高阶,也就是N^2/2,最高阶地系数为1/2,把系数去除,得到的就是N^2,时间复杂度就是O(N^2)。

只保留最高项是因为这个最高项是对结果产生决定性影响,就比如N^2+N,当N接近无穷大时,N^2的结果才是决定最终结果的关键因素,而N在这里起到的效果几乎可以忽略不记。

为什么最高项常数系数要去除呢?还是因为N趋近无穷大时,由于这个常数系数不管多大他都是远小于无穷大的,不会对最终结果产生太大影响,至少不会在量级上产生大的影响。

再比如下面这个算法:

int fib(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}

我们可以把这个递归的图给画出来

右边的肯定是要比左边递归的深度要小的,但是我们只用算大概的执行次数就行了,我们假设这个三角形是完整的,他的执行次数总数和就是 ( 1+2+4+……+2^n-2),最终结果的最高项肯定是2^n,所以这个算法的时间复杂度就是O(N)

int fib(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	int a = 1;
	int b = 1;
	int ret = 1;
	while (n>2)
	{
		ret = a + b; 
		a = b;
		b = ret;
		n--;
	}
	return ret;
}

这个算法的时间复杂度就是O(N)

我们还可以知道一些常用的算法的时间复杂度,比如冒泡排序的时间复杂度就是O(N^2),二分查找的时间复杂度就是logN,注意,我们在时间复杂度中的log都是默认以2为底的。

3.空间复杂度

时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。 空间复杂度也是一个函数表达式,是对一个算法在运行过程中临时(额外)占用存储空间的大小。但是我们关注的也不是具体的内存的大小,还是因为硬件的原因,比如同一段代码,一个int类型的变量,在有的机器上他只占两个字节,而在有的机器上占四个字节,所以这个所占空间的具体的大小也是没有意义的。空间复杂度算的是变量的个数或者函数调用建立栈帧的次数或者层数(递归)。

就比如我们递归求斐波那契数的函数

我们可以将上面的每一个方块看成一个函数栈帧,但是我们要记住一点,我们调用fib(n-1)+fib(n-2)时,不是同时为这两个函数创建栈帧,而是会在fib(n-1)返回后再去调用fib(n-2),所以计算这个递归的空间复杂度看的不是调用的次数,而是递归的深度,同时,因为每次创建栈帧时栈帧的空间就已经是固定的了,也就是一个常数,在大O的渐进表示法中,加法的常数和系数的常数都是会删掉的,所以这个算法的空间复杂度就是O(N)。

在之前我们学完函数栈帧的时候就能发现,一个变量生命周期结束后,它的空间就还给了操作系统,如果我们在后面创建变量时,是有可能会重复利用这块空间的。

要记住,空间是可以重复利用的,不累积。而是就是一去不复返的,是累积的。在写算法的时候,我们尤其要注意算法的时间复杂度,必要时我们要采取以空间换时间的策略。

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

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

相关文章

MyBatis的xml实现方式

1、该项目引入的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

DotNetBar的SlidePanel和metroTilePanel使用笔记

一、前言 界面组件DotNetBar2中的2个控件属性SlidePanel和metroTitlePanel的使用方法&#xff0c;网上相关资源较少&#xff0c;就一些属性的使用学习记录如下&#xff1a; SlideSideDevComponents.DotNetBar.Controls.eSlideSide.Top/Bottom/Right/Left 及 metroTilePanel和m…

【拓扑空间】示例及详解1

例1 度量空间的任意两球形邻域的交集是若干球形邻域的并集 Proof&#xff1a; 任取空间的两个球形邻域、&#xff0c;令 任取,令 球形领域 例2 规定X的子集族,证明是X上的一个拓扑 Proof&#xff1a; 1. 2., &#xff08;若干个球形邻域的并集都是的元素&#xff0c;元素…

法向量估计

法向量估计 1. 求解点P法向量的原理2. 法向量估计的证明3. 为什么求点P的法向量&#xff0c;需要使用以P为中心的邻域内的点&#xff1f;4. 法向量估计的应用和思考5. 权重法向量估计 1. 求解点P法向量的原理 已知有一组点 P ( p 1 , p 2 , p 3 , . . . , p n ) , p i ∈ R 3…

该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系

该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系 这个去集群主机cm界面上看会出现这个错误 排查思路&#xff1a; 一般比较常见的原因可能是出问题的主机和集群主节点的时间对应不上了。还有就是cm agent服务出现问题了 去该主机的…

阿里 对象存储OSS 云存储服务

1.简介 对象存储服务(Object Storage Service ,OSS) 是一种 海量、安全、低成本、高可靠的云存储服务&#xff0c;适合存放任意类型的文件。容量和处理能力弹性扩展&#xff0c;多种存储类型供选择&#xff0c;全面优化存储成本。 2.如何使用。参考文档 看文档&#xff0c;说的…

水离子雾化壁炉与传统壁炉的区别与比较

水离子雾化壁炉与传统壁炉在工作原理、燃料、安全性和环保性等方面存在明显的区别和比较&#xff1a; 工作原理&#xff1a; 传统壁炉&#xff1a;传统壁炉通常使用木材、煤炭、天然气等燃料&#xff0c;并通过燃烧产生真实的火焰和热量。 水离子雾化壁炉&#xff1a;水离子雾…

备考ICA----Istio实验16---HTTP流量授权

备考ICA----Istio实验16—HTTP流量授权 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f istio/samples/bookinfo/networking/bookinfo-gateway.yaml访问测试 curl -I http://192.168.126.220/productpage2. 开启mtls m…

MATLAB入门教程(带详细注释的MATLAB代码)

使用方法 将mlx文件在MATLAB上运行&#xff0c;即可得到下列结果&#xff1a; 完整代码 给出mlx文件的全文 MATLAB软件入门分析 Date&#xff1a;2023年3月13日 Author&#xff1a;Evand 入门综述 使用matlab编程时&#xff0c;通常使用.m文件&#xff0c;把所有代码编好后…

JAVA毕业设计133—基于Java+Springboot+Vue的网上宠物店商城管理系统(源代码+数据库+12000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的网上宠物店商城管理系统(源代码数据库12000字论文)133 一、系统介绍 本项目前后端分离&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注册…

注意,这类人无法在视频号开店!

我是王路飞。 视频号也可以开店铺去卖货了吗&#xff1f; 是的&#xff01;其实早在22年的时候&#xff0c;视频号就上线【小店】功能了&#xff0c;可以通过短视频、直播达人带货的形式&#xff0c;帮助商家转化商品。 当然了&#xff0c;视频号小店跟我一直在科普的抖音小…

团体程序设计天梯赛-练习集 01

天梯赛题解合集 团体程序设计天梯赛-练习集 (L1-001 - L1-012) 团体程序设计天梯赛-练习集 (L1-013 - L1-024) 团体程序设计天梯赛-练习集 (L1-025 - L1-036) 团体程序设计天梯赛-练习集 (L1-037 - L1-048) L1-001 Hello World 输出题 样例 输入 输出 Hello World!思…

kafka集群介绍+部署Filebeat+Kafka+ELK

一、消息队列 1、为什么需要消息队列&#xff08;MQ&#xff09; 主要原因是由于在高并发环境下&#xff0c;同步请求来不及处理&#xff0c;请求往往会发生阻塞。比如大量的请求并发访问数据库&#xff0c;导致行锁表锁&#xff0c;最后请求线程会堆积过多&#xff0c;从而触…

Mac电脑清理垃圾软件 Mac电脑清理垃圾的文件在哪 cleanMyMac X 4.8.0激活号码

Mac用户经常会有这样一些烦恼&#xff0c;比如软件之间的管理&#xff0c;应用生成的缓冲文件怎样删除&#xff0c;还有软件的卸载等等... 如何有效清理Mac中的垃圾文件&#xff0c;删除多余的软件成为Mac用户迫切的需求。本文就为大家介绍几款好用的Mac电脑清理垃圾软件&#…

AJAX —— 学习(一)

目录 一、原生 AJAX &#xff08;一&#xff09;AJAX 介绍 1.理解 2.作用 3.最大的优势 4.应用例子 &#xff08;二&#xff09;XML 介绍 1.理解 2.作用 &#xff08;三&#xff09;AJAX 的特点 1.优点 2.缺点 二、HTTP 协议 &#xff08;一&#xff09;HTTP 介…

GPT3, llama2, InternLM2技术报告对比

GPT3&#xff08;September 22, 2020&#xff09;是大语言应用的一个milestone级别的作品&#xff0c;Llama2&#xff08;February 2023&#xff09;则是目前开源大模型中最有影响力的作品&#xff0c;InternLM2&#xff08;2023.09.20&#xff09;则是中文比较有影响力的作品。…

05 - 7 段十进制数码管显示

---- 整理自B站UP主 踌躇月光 的视频 1. 实验设计 根据前一节的内容&#xff0c;这里也通过 ROM 的方法显示十进制。这里我们设计显示 3 位十进制数&#xff0c;需要三个数码管&#xff0c;地址位宽为 8&#xff0c;数据位宽为 12。 A7A6A5A4A3A2A1A0number000000000000000011…

SambaNova 芯片:深入解析其架构和高性能秘诀

SambaNova——一家总部位于帕洛阿尔托的公司已经筹集了超过10亿美元的风险投资&#xff0c;不会直接向公司出售芯片。相反&#xff0c;它出售其定制技术堆栈的访问权限&#xff0c;该堆栈具有专门为运行最大的人工智能模型而设计的专有硬件和软件。 最近&#xff0c;SambaNova…

【科研笔记】知识星球不可选择内容爬虫

知识星球不可选择内容爬虫 1 背景2 实现3 拓展遗留问题1 背景 针对与知识星球中,电脑打开网页不可选择复制粘贴的问题,进行爬虫处理,获取网页的内容,并保存在本地 2 实现 需要下载python,和爬虫的第三方库selenium,可以查看博客中有关selenium的内容进行回顾。当前使用…

在云端遇见雨云:一位服务器寻觅者的指南

引言&#xff1a;寻觅一座云端归宿 当我踏入数字世界的边缘&#xff0c;带着对网络的探索与期待&#xff0c;我迫切需要一座安全可靠的数字栖息地。云计算技术正如一场魔法般的变革&#xff0c;而在这片广袤的云端中&#xff0c;雨云就像是一位友善的向导&#xff0c;引领我穿越…