一篇文章理解时间复杂度和空间复杂度

今天也是很开心的学到了数据结构,也是打算把我自己对知识的理解给写出来了。第一篇数据结构开始咯。开始之前我们先理解一个概念。

什么是算法效率?

算法效率是指算法执行的速度或完成任务所需的资源(如时间和空间)的度量。它通常用于评估算法的性能和比较不同算法的优劣。
 
算法效率的主要考量因素包括:
 
1. 时间复杂度:描述算法执行所需的时间与问题规模(如输入数据的大小)之间的关系。常见的时间复杂度度量方法有 O(n)、O(log n)、O(n log n) 等。较低的时间复杂度表示算法在处理大规模问题时效率更高。
2. 空间复杂度:描述算法所需的额外存储空间与问题规模之间的关系。较低的空间复杂度表示算法在内存使用上更高效。
3. 稳定性:某些算法可能对输入数据的顺序或其他特征有特殊要求,稳定性指的是算法在这些情况下的表现。
4. 可扩展性:算法是否容易适应更大规模或更复杂的问题。
5. 实际性能:除了理论分析,实际测试和基准测试也可以用来衡量算法在具体硬件和环境中的效率。

 
评估算法效率的目的是选择在特定场景下最适合的算法,以达到最优的性能和资源利用。在设计算法时,通常会追求高效率的算法,以减少计算时间和资源消耗。同时,还需要考虑算法的实现复杂度、可读性和可维护性等因素。对于一些复杂问题,可能需要在效率和其他因素之间进行权衡。
 

但是现在我们不了解那么多,我们就来理解一下简单的时间复杂度和空间复杂度!!!

目录

时间复杂度

空间复杂度


时间复杂度

时间复杂度是一种对算法运行时间的度量,用于描述算法在处理特定规模问题时所需的计算操作数量。它反映了算法的效率和性能。
 

时间复杂度通常使用大 O 表示法来表示,其中 O(n) 表示算法的运行时间与问题规模 n 成正比。例如,如果一个算法的时间复杂度为 O(n),意味着随着问题规模的增大,算法的运行时间也会线性增加。
 
常见的时间复杂度级别包括:
 
1. O(1):表示常量时间复杂度,算法的运行时间与问题规模无关,无论输入规模如何变化,算法的执行时间都是固定的。
2. O(log n):对数时间复杂度,算法的运行时间与对数函数相关,对于大规模问题,算法的效率较高。
3. O(n):线性时间复杂度,算法的运行时间与问题规模成线性关系。
4. O(n log n):线性对数时间复杂度,算法的运行时间与 n 和 log n 相关。
5. O(n^2):平方时间复杂度,算法的运行时间与 n 的平方成正比,对于大规模问题,效率可能较低。
6. O(n^c):其中 c 是常数,这种复杂度表示算法的运行时间与 n 的 c 次幂成正比。
 
这里需要注意的是:时间复杂度的评估是基于算法的最坏情况运行时间,即在最不利的输入情况下的时间复杂度。它提供了一种对算法效率的粗略估计,帮助我们在不同算法之间进行比较和选择。
 
时间复杂度只是一种理论上的度量,实际的运行时间还受到其他因素的影响,如硬件性能、数据结构的选择、算法的实现细节等。因此,在实际应用中,除了考虑时间复杂度外,还需要综合考虑其他因素来评估算法的性能。

 
通过分析算法的时间复杂度,我们可以在设计和选择算法时做出更明智的决策,以满足特定场景下对效率的要求。较低的时间复杂度通常意味着算法在处理大规模问题时具有更好的性能。但在实际情况中,还需要结合具体问题和需求来选择合适的算法。

下面我们就开始用例子来说说如何计算时间复杂度。

例一:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int Func(int n)
{int i = 0;int j = 0;int count = 0;for (i = 0; i < n; i++){for (j = 0; j < n; j++){++count;}}int k = 0;for (k = 0; k < 2 * n; k++){++count;}int a = 20;while (a){++count;--a;}return count;
}int main()
{int n = 0;scanf("%d", &n);int count = Func(n);printf("%d\n", count);return 0;
}

 在上面代码中大家觉得Func函数的时间复杂度是多少呢?下面就说一下时间复杂度的算法。我们把图一看就都理解了。

上图显示Func函数执行基本操作的次数,那有什么用呢?

其实在计算时间复杂度时我们可以用执行次数的表达式,用大 O渐近表示法,来表示时间复杂度,但随着n的值变大,我们发现其实对次数变化影响最大的是 n*n这一项,而且时间复杂度是估算的所以我们就剔除掉后面影响不大的两项,取影响最大的进行估算。所以这个函数的时间复杂度就是 O(n^2).


例二:

int Func1(int n ,int m )
{int i = 0;int j = 0;int count;for ( i = 0; i < k; i++){for (j = 0; j < m; j++){++count;}}return count;
}

我们列出数学表达式计算次数:F(n)=n+m. 这里的时间复杂度就是O(n+m)

需要注意的是:如果题目给出n远大于m,那么此时的时间复杂度就是O(n)。


例三:
 

int Func2( )
{int i = 0;int j = 0;int count;for ( i = 0; i < 10; i++){for (j = 0; j < 100; j++){++count;}}return count;
}

 这里列出数学表达式F(n)=10*100=1000。大家是不是以为函数Func2的

时间复杂度为O(1000)了,其实不然,在计算机中我们把常数次基本操作的函数的时间复杂度统一设定为O(1)。故func2的时间复杂度其实为O(1)在计算中这种复杂度是最优的了.

例四:

 

int Func4(arr[],int sz,int x)
{int begin = 0;int end = sz;int n = 0;while (end>begin){int mid = (begin + end) / 2;if (arr[mid] > x){end = mid - 1;}else if (arr[mid] < x){begin = mid + 1;}elsereturn mid;}

列出数学表达式F(n)=log 2 n,但在计算机中这里的底数难以表示,所以在计算机中就自动把底数省略掉,所以这里的空间复杂度就是O(log n) 。


空间复杂度

空间复杂度是对算法在执行过程中所需的额外存储空间的度量。它用于评估算法对内存的使用效率。
 
与时间复杂度类似,空间复杂度通常使用大 O 表示法来表示。空间复杂度描述了算法在解决特定问题时所需的存储空间与问题规模之间的关系。例如,O(n) 表示算法的空间复杂度与问题规模 n 成正比。
 
空间复杂度主要考虑以下几个方面:
 
1. 额外的存储空间:算法可能需要额外的存储来保存中间结果、临时变量或其他数据结构。
2. 输入数据的规模:问题的输入规模可能直接影响算法所需的空间。
3. 数据结构的选择:不同的数据结构可能具有不同的空间复杂度,例如使用数组和使用链表可能会有不同的空间需求。
4. 递归算法:递归算法在执行过程中可能会产生大量的栈空间消耗。
 

较低的空间复杂度意味着算法在内存使用上更高效,尤其在处理大规模问题或资源受限的环境中更为重要。然而,在实际情况中,需要在空间复杂度和算法的其他特性(如时间复杂度、可读性等)之间进行权衡。
 
与时间复杂度一样,空间复杂度的评估是基于算法的最坏情况,并且是一种理论上的估计。实际的空间需求可能受到具体实现、硬件环境和问题特征的影响。
 
在设计算法时,了解和优化空间复杂度可以帮助避免不必要的内存消耗,并提高算法的整体效率。但需要根据具体问题和系统资源来综合考虑空间复杂度与其他因素的平衡。有时候,为了获得更好的时间复杂度或其他优势,可能会接受较高的空间复杂度。
 


了解完后,我们继续举例:

例5:

int Func(int n)
{int i = 0;int j = 0;int count = 0;for (i = 0; i < n; i++){for (j = 0; j < n; j++){++count;}}int k = 0;for (k = 0; k < 2 * n; k++){++count;}int a = 20;while (a){++count;--a;}
}

空间复杂度与时间复杂度计算方法相似,不同的是空间复杂度是用计算变量的个数来估算空间复杂

度,也是用大O 表示法来表示。如上面中我们看到此函数创建的变量的数量为6个,即n,i,j,

k,count,a。与时间复杂度一样常数用O(1)表示,故函数的空间复度为O(1).


例五:

 

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

 像这里运用·递归来算n的阶乘,我们知道在它每次递推过程中都会在栈区开辟一块空间,在此函

数中共递推n次,故其空间复杂度为O(n)。


总之:空间复杂度和时间复杂度相似只不过一个通过计算变量个数来估算,一个是计算执行基本次

数来估算,都是用大O 渐近表示法来表示,且都是取影响最大的项,剔除掉影响较小的项,有的情

况也需根据实际情况进行改变。


今天这篇博客就写到这了。

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

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

相关文章

C程序训练:二分查找法的应用之2

本文来自&#xff1a;C程序训练&#xff1a;二分查找法的应用之2 在《C程序训练&#xff1a;二分查找法的应用》一文中介绍了利用二分查找计算某个区间中数的个数&#xff0c;本文介绍利用二分查找法计算数列中出现单个数字的位置。题目描述如下。 题目描述&#xff1a;一维整…

Java基础常见面试题总结-并发(一)

线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创建开销大 为什么不受控&#xff1f; 系统资源有限&#xff0c;每个人针对不同业…

秘塔科技推出AI搜索产品「秘塔AI搜索」

近日&#xff0c;国内一家人工智能科技公司&#xff08;秘塔科技&#xff09;推出了一款AI搜索产品——秘塔AI搜索&#xff0c;能够大幅提升搜索效率&#xff0c;解决日常生活、工作学习等场景中遇到的各类搜索需求。 秘塔AI搜索官网&#xff1a;https://metaso.cn/ 相较于传统…

unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题

自己这几天用 unity 2021 xcode 14.2 开发ios内购&#xff0c;appstore上面内购商品都已经配置好了&#xff0c;但是在手机里就是不显示&#xff0c;最后才发现必需得满足以下条件才行&#xff1a; 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…

宏观行业心得

OLAP的特点 电商这样的OLTP场景大家更熟悉。相比之下&#xff0c;OLAP的特点&#xff1a; 读相对多&#xff0c;1000row以上大批写入&#xff0c;不改已有数据查询时输出很多行、很少列&#xff0c;结果被过滤或聚合后能够在一台服务器的内存中单台服务器qps数百&#xff0c;…

编曲入门软件哪个好 编曲入门教程 Studio One哪个版本好 Studio One6.5正版多少钱 FL Studio下载

新手编曲软件推荐&#xff1f;新手学编曲要先熟悉编曲逻辑&#xff0c;因此需要选择编曲逻辑简明易懂的宿主软件。编曲新手应该做哪些准备&#xff1f;准备好编曲设备、宿主软件、基础乐理学习资料。 一、编曲入门软件哪个好 新手入门阶段还没有形成系统的编曲思维&#xff0…

C++面试宝典第27题:完全平方数之和

题目 给定正整数 n,找到若干个完全平方数(比如:1、4、9、16、...),使得它们的和等于n。你需要让组成和的完全平方数的个数最少。 示例1: 输入:n = 12 输出:3 解释:12 = 4 + 4 + 4。 示例2: 输入:n = 13 输出:2 解释:13 = 4 + 9。 解析 这道题主要考察应聘者对于…

公众号流量主生意,月入五万?

自从公众号开放了公域流量&#xff0c;流量蹭蹭蹭往上帽。 前几年的公众号是没有算法机制这一说的。 常见问题&#xff1a; 一个人能注册几个公众号&#xff1f; 从腾讯最新公告来看&#xff0c;目前为此个人身份证可注册1个公众号&#xff08;须绑定一张银行卡&#xff09;…

计算机网络基本知识(一)

文章目录 概要速率带宽、吞吐量带宽吞吐量 时延发送&#xff08;传输&#xff09;时延传播时延排队时延处理时延时延带宽积 利用率 概要 速率、带宽、吞吐量、时延、利用率 速率 记忆要点&#xff1a;10的三次方 记忆要点&#xff1a;2的10次方 带宽、吞吐量 带宽 单位&…

机器学习系列——(十七)聚类

引言 在当今数据驱动的时代&#xff0c;机器学习已经成为了解锁数据潜能的关键技术之一。其中&#xff0c;聚类作为机器学习领域的一个重要分支&#xff0c;广泛应用于数据挖掘、模式识别、图像分析等多个领域。本文旨在深入探讨聚类技术的原理、类型及其应用&#xff0c;为读…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同&#xff0c;但其参加过 PAT 考试&#xff0c;且成绩达到了该企业的面试分数线&#xff0c;则也可以接受——同一批次这样的人可以有多个&#xff01;&#xff01;&#xff01;如果 pta 分数不低于 175 &#…

C#用Array类的Reverse方法反转数组中元素

目录 一、Array.Reverse 方法 1.重载 2.Reverse(Array, Int32, Int32) 3. Reverse(Array) 4.Reverse(T[]) 5. Reverse(T[], Int32, Int32) 二、实例 1.Array.Reverse 方法4种重载方法综合实例 2.Reverse(Array)方法的实例 一、Array.Reverse 方法 反转一维 Array 或部…

PKI - 05 证书申请步骤

文章目录 Pre概述第一步:时间同步第二步: 部署证书服务器第三步: 客户端产生密钥第四步: 验证证书服务器第五步: 申请个人证书第六步&#xff1a; 审核并签名证书第七步: 颁发数字证书第八步: 交换公钥 Pre PKI - 02 对称与非对称密钥算法 PKI - 03 密钥管理&#xff08;如何…

Stable Diffusion 模型下载:majicMIX fantasy 麦橘幻想

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 非常推荐的一个非常绚丽、充满幻想的大模型,由国人“Merjic”发布,下载量颇高。这个模型风格炸裂,远距离脸部需要inpaint以达成最好效果。 条目内容

【GameFramework框架】四、GameFramework框架内置模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

IP地址查询的应用与意义

在数字化时代&#xff0c;IP地址已成为连接我们与网络世界的纽带之一。通过IP地址查询&#xff0c;我们可以揭开数字世界的面纱&#xff0c;了解更多有关网站、用户和网络活动的信息。本文将探讨IP地址查询的应用场景、意义以及其在网络安全、个人隐私保护和地理定位服务中的作…

Redis篇之分布式锁

一、为什么要使用分布式锁 1.抢劵场景 &#xff08;1&#xff09;代码及流程图 &#xff08;2&#xff09;抢劵执行的正常流程 就是正好线程1执行完整个操作&#xff0c;线程2再执行。 &#xff08;3&#xff09;抢劵执行的非正常流程 因为线程是交替进行的&#xff0c;所以有…

Java学习17-- super类

重点&#xff1a;super类 & 方法重写 super类 super指的是本级的上一级&#xff0c;即father class父类 很好理解&#xff0c;比如Person class>Student class 当前在Student class执行&#xff0c;那么就写this.xxx 需要在Student程序里面调用Person&#xff0c;那就…

unity——ScriptableObject相关知识点【学习笔记/不足之处欢迎斧正/个人复习向/侵删】

一、相关简介 1.ScriptableObject是什么&#xff1a;Unity提供的一个数据存储基类 2.ScriptableObject的好处有哪些&#xff1a;文件配置、数据复用、更好的处理数据带来的多态性为 二、ScriptableObject的创建 1.自定义ScriptableOject数据容器 继承ScriptableObject类 在…

二十多篇文献带你读懂分布式学习与联邦学习优化思路 调度优化 压缩算法 聚合算法

前言 文中增加了引用跳转&#xff0c;如果想要细度哪一篇文章&#xff0c;只需通过引用跳转到结尾的Reference便可以获得文章的标题&#xff0c;通过Google Scholar搜索便可以获取原文。 本文为作者原创&#xff0c;转载请注明作者kaiserqzyue。 摘要 联邦学习的提出是为了…