算法的时间复杂度及空间复杂度

在这里插入图片描述

 算法是指操作数据,解决问题的一组方法,就像排序一个无序数组使用不同的排序方法所耗费的时间和空间是不一样的,解决问题使用不同的算法耗费的时间和空间也会大有不同。
 接下来我们就来详细了解一下时间复杂度和空间复杂度是如何去考量的。
 算法的时间复杂度的考量我们虽然可以写一段程序去记录运行的时间,但这种方法必然是有很多弊端的,难以控制的误差,测试时使用的数据规模都会对结果产生很大的影响。
 为了描述算法的时间和空间复杂度,首先我们要先了解[大O符号表示法]
 在这种表示法中,不会精确计算某一过程运行的次数,因为CPU运行速度很快,这样去估计没有意义。
用一个例子表示

for (int i = 0; i < n; i++)
{cout<<"hello";cout<<"hi";
}

 在这段代码中,假设第一行执行的时间颗粒为1,第二行代码循环n次,时间颗粒为n,第三段也一样,这样运行完所需要的时间颗粒为2n+1,在n趋近于无限大时,加上的1就几乎没有影响了,倍数二也没有很大影响了,我们就可以用大O表示法,时间复杂度为O(n)。
常见的时间复杂度有以下几种
 常数级O(1),不管代码执行多少行,只要是没有循环或循环次数是可数的,那么这段代码的时间复杂度就都是O(1),消耗的时间不会随着某个变量的增长而增长,无论有几十万行代码,他的时间复杂度都为O(1)
例如:

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

对数阶O(logn)
 就像我们耳熟能详的有序数组寻找某个数的二分查找法,在每次查找的过程中都能排除一半,假设有n个数字,我们只需要log2n的时间就可以找到。通常省略下边的2,当然也可以是其他数字。
另一个例子

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

该例中i是以次方的速度接近于n的,只需要循环log2n次就结束循环。
线性阶O(n)。

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

线性对数阶O(nlogn)。
上边两个相乘

for (int i = 0; i < n; i++)
{int j = 1;while (j < n){j *= 2;}
}

平方阶O(n2)。

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

K次方阶O(nk)。
 从上到下时间复杂度越来越大,执行的效率当然也是越来越慢。
我们来看几道题目
在这里插入图片描述
 这道题目选C,很明显,我们上边已经说过大O是一个渐进表示法,不会去精确表示运行次数。
 D选项是正确的,在用大O表示法,我们通常考虑最坏的情况,例如在一个普通二叉搜索树中找某一数值,我们会考虑最坏的情况
在这里插入图片描述
如上图,时间复杂度就会跌为O(n).
再来一题
在这里插入图片描述
 这道题也是前边说过的,有两层循环,每层n次,时间复杂度为N*N,用大O表示法就是O(n2)次。
在这里插入图片描述
要注意,这里的i增长趋势是指数型的,所以这道题时间复杂度为O(logn)。
在这里插入图片描述
 注意数组是有序的,我们可以设置两个指针分别指向首尾,根据这两个指针指向的数字和来判断移动,这道题目最坏的情况就是直到整个数组都被搜索一边,时间复杂度为O(n)。
在这里插入图片描述
来一道编程题
消失的数字
这道题有很多种解法,需要在O(n)的时间内完成。
在这里插入图片描述
方法一:
 可以新建一个数组,该数组包含从0到n,而且并没有缺少元素,我们可以通过将两个数组所有元素异或的方法找到该元素。
方法二:
 很简单,求和公式,然后减去数组中所有元素,就可以得到缺失的整数。
以上方法的时间复杂度都为O(n)。
空间复杂度
 我们已经知道了时间发咋读不是按照程序运行所消耗的时间来判定的,那么空间复杂度也不是用来计算程序实际占用的空间的。
 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样梵音的是一个趋势。
空间复杂度比较常用的有O(1),O(n),O(n2)。
1,O(1)
入宫算法执行的时间复杂度不随着某个变量的大小而变化,那么该算法的空间复杂度就为O(1)。
2,O(n)

int* m = new int[n];
//

 该行代码中,我们new出了一个数组,数组占用大小为n,此时他的空间复杂度就为O(N),当然,类比一下,如果我们开辟了两个大小为n的数组呢?他的空间复杂度还是O(N),因为当N趋近于无穷大时,他的倍数忽略也可。
我们来看一道题目
在这里插入图片描述
 只要上边理解了,这里也就能很快得出答案,该二维数组的空间大小是一定的,不会变化,所以空间复杂度自然而然就为O(1).
在这里插入图片描述
 这道题首先创作了一个指针数组,数组的大小为n,在下边的循环中,指针数组中n个指针分别指向一块空间大小为n的数组,我们可以将它们看作是一个正方形的二维数组,边长为n,所以则道题的空间复杂度为O(n2)。
总结
时间复杂度和空间复杂度是抽象出来用来形容一个算法的优略的,该文只是对两种概念进行解释,在后续的学习中很多地方会用到时间复杂度和空间复杂度用来判断一些算法的优略,希望我们能在学习中一起成长!

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

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

相关文章

【洛谷学习自留】p5707 上学迟到

解题思路&#xff1a; 1.先用给出的时间和速度&#xff08;如果无法整除&#xff0c;则时间加一&#xff09;&#xff0c;计算出时间&#xff08;分&#xff09;&#xff0c;然后将时间加上10分钟。 2.创建一个计时器&#xff0c;设置一个日期&#xff0c;保证时分秒部分&#…

HCIA-Datacom题库(自己整理分类的)_29_PPP协议判断【6道题】

1.数据链路层采用PPP封装链路两端的IP地址可以不在同一个网段。√ 2.PPP链路两端不在同一网段不能通信。 3.参考以下拓扑及配置&#xff0c;路由器R1与R2通过Serial低速线缆连接&#xff0c;且数据链路层封装使用PPP。当R1和R2的Holdtime不一致时&#xff0c;PPP协商失败&…

Docker 创建容器并指定时区

目录 1. 通过环境变量设置时区&#xff08;推荐&#xff09;2. 挂载宿主机的时区文件到容器中3. 总结 要在 Docker 容器中指定时区&#xff0c;可以通过两种方式来实现&#xff1a; 1. 通过环境变量设置时区&#xff08;推荐&#xff09; 在 Docker 运行时&#xff0c;可以通…

【Godot 4.2】Tree控件与TreeItem完全解析

概述 本篇是控件完全解析系列之一&#xff0c;主要总结一下Tree控件与TreeItem的使用。 Tree控件是一个非常强大的控件&#xff0c;尤其是在编写一些相关的程序或编辑器插件时&#xff0c;非常适合展示树形组织的节点型数据。 本篇将从简单的添加根节点&#xff0c;根节点子…

论文阅读_代码生成模型_CodeGeeX

英文名称: CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X 中文名称: CodeGeeX&#xff1a;一种用于代码生成的预训练模型&#xff0c;并在HumanEval-X上进行多语言评估 链接: https://arxiv.org/abs/2303.17568 代码: http…

深度学习目标检测】二十二、基于深度学习的肺炎检测系统-含数据集、GUI和源码(python,yolov8)

肺炎尽管很常见&#xff0c;但准确诊断是一项困难的任务。它要求训练有素的专家对胸部X光片进行检查&#xff0c;并通过临床病史&#xff0c;生命体征和实验室检查进行确认。肺炎通常表现为胸部X光片上一个或多个区域的阴影(opacity)增加。但是&#xff0c;由于肺部有许多其他状…

【笔记】OpenHarmony和HarmonyOS区别及应用开发简介

一、概念 OpenHarmony(OH) &#xff1a; OpenAtom OpenHarmonyHarmonyOS(HO)&#xff1a;开发 | 华为开发者联盟 (huawei.com) HO当前最高是3.1&#xff0c;在华为mate 60上面也是。关于4.0、5.0和next这类版本说法都是面向用户的&#xff0c;不是开发人员。对于程序员&#…

Python爬虫——解析常用三大方式之JsonPath

目录 JsonPath 安装 使用 我们的json数据 基本使用 案例 总结 JsonPath 主要适用于解析一些json的数据 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jsonpath 使用 obj json.load(open( json文件 , r , encoding utf-8 ) )ret jsonpath.…

【C++ 函数栈】栈区保存函数参数和函数调用的过程

目录 1 调用过程 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;C专栏&#x1f4a5; 标题&#xff1a;【C 函数栈】栈区保存函数参数和函数调用的过程❣️ 寄语&#xff1a;人生的意义或许可以发挥自己全部的潜力&#xff0c;所以加油吧&#xff…

yolov5训练太慢的解决方案

问题原因 训练太慢大多是因为没有安装CUDA和pytorch&#xff0c;导致的只有cpu在跑&#xff0c;显卡没跑 这就是很典型的。 解决方案 第一步&#xff1a;安装CUDA 在本机上面安装CUDA,记住只有N卡可以安装&#xff0c;一开始的电脑是自带CUDA的。 如果不是自带的CUDA&…

自己本地模拟内存数据库增删改查

目录 学习初衷准备代码实现结果感谢阅读 学习初衷 用于满足自己的测试要求&#xff0c;不连接数据库&#xff0c;也不在意数据丢失 准备 maven依赖 org.springframework.boot spring-boot-starter-test test 代码实现 内存数据库&#xff08;InMemoryDatabase&#xff0…

Java中的List

List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素&#xff0c;返回被删除的元素E set(int index,E element)修改指定索引处的元素&#xff0c;返回被修改的元素E get(int inde…