关于时间与空间复杂度的学习

关于时间与空间复杂度的学习

  • 算法时间复杂度定义
  • 标准算法度量单位
    • 渐近记号
      • 1、Θ(big-theta)
      • 2、O(big-oh)
      • 3、Ω(big-omege)
  • 推导时间复杂度步骤与法则
    • 步骤
    • 法则
  • 示例
    • 1.常数阶
    • 2、线性阶
    • 3、对数阶
    • 4、平方阶
    • 5、立方阶
    • 扩展一个之前遇到的比较有意思的题
  • 常见的时间复杂度比较
  • 最坏情况与平均情况
  • 算法的空间复杂度
    • 常用的算法的时间复杂度和空间复杂度
  • 一些计算的规则
    • 1、加法规则
    • 2、乘法规则
    • 3、复杂度与时间效率的关系

算法时间复杂度定义

在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模n的函数,进而分析T(n)n的变化情况并确定T(n) 的数量级。算法的时间复杂度,也就是算法的时间量度。记作:T(n)=O(f(n))。 它表示随问题n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中,f(n)是问题规模n的某个函数。

标准算法度量单位

渐近记号

1、Θ(big-theta)

若存在正常量 c1、c2和n0 ,使得当 n ≥ n0 时,不等式0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) 恒成立,则称g(n)是f(n)的一个渐近紧确界,记作Θ。它包含渐近上界渐近下界

简单的理解为在 n ≥ n0 时,f(n)被夹在c1g(n)和c2g(n)之间,c1g(n)为f(n)的渐近下界,c2g(n)为f(n)的渐近上界,如下图所示。

在这里插入图片描述

2、O(big-oh)

若存在正常量c和n0,使得当n ≥ n0 时,不等式 0 ≤ f(n) ≤ cg(n)恒成立,则称g(n)是f(n)的一个渐近上界,记作O。

简单的理解为在 n ≥ n0 时,cg(n)总是在f(n)之上。cg(n)为f(n)的渐近上界。如下图所示。

在这里插入图片描述

3、Ω(big-omege)

若存在正常量 c和n0,使得当 n ≥ n0 时,不等式 0 ≤ cg(n) ≤ f(n) 恒成立,则称g(n)是f(n)的一个渐近下界,记作Ω。

简单的理解为在 n ≥ n0 时,cg(n)总是在f(n)之下。cg(n)为f(n)的渐近下界。如下图所示。
在这里插入图片描述

我们使用O表示算法在最坏的情况下所代表的时间复杂度,Ω表示算法在最好的情况下所代表的时间复杂度,Θ表示算法在平均情况下所代表的时间复杂度。这个是算法书中比较标准的,现在网上大部分都直接用O来概括表示,这里理解就好。

这里看到网上的一片文章学习而来
原文链接:https://blog.csdn.net/qq_31116753/article/details/81602582

推导时间复杂度步骤与法则

步骤

  1. 找出算法中的基本语句;
    算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  2. 计算基本语句的执行次数的数量级;
    计算基本语句执行次数的数量级,只保留最高阶项。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

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

  4. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

O(log2n)、O(n)、O(nlog2n)、O(n2)和O(n3)称为多项式时间,而O(2n)和O(n!)称为指数时间。计算机科学家普遍认为前者是有效算法,把这类问题称为P(Polynomial,多项式)类问题,而把后者称为NP(Non-Deterministic Polynomial,非确定多项式)问题。

法则

  1. 对于一些简单的输入输出语句或赋值语句,近似认为需要O(1)时间

  2. 对于顺序结构,需要依次执行一系列语句所用的时间可采用大O下"求和法则" 求和法则:是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n)=O(g(n)),则 T1(n)+T2(n)=O(max(f(n),g(n)))。特别地,若T1(m)=O(f(m)), T2(n)=O(g(n)),则 T1(m)+T2(n)=O(f(m)+g(n))

  3. 对于选择结构,如if语句,它的主要时间耗费是在执行then字句或else字句所用的时间,需注意的是检验条件也需要O(1)时间

  4. 对于循环结构,循环语句的运行时间主要体现在多次迭代中执行循环体以及检验循环条件的时间耗费,一般可用大O下"乘法法则"
    乘法法则: 是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n)=O(g(n)),则 T1*T2=O(f(n)*g(n))

  5. 对于复杂的算法,可以将它分成几个容易估算的部分,然后利用求和法则和乘法法则技术整个算法的时间复杂度
    另外还有以下2个运算法则:(1) 若g(n)=O(f(n)),则O(f(n))+O(g(n))=O(f(n));(2)O(Cf(n)) = O(f(n)),其中C是一个正常数。

示例

1.常数阶

顺序额结构的复杂度。下面用高斯定理计算1,2,3…n个数的和。

在这里插入图片描述
我们把这个元素当做一个函数来看待,该函数有三条语句记作f(n) = 3,根据上面的法则该函数不受n的影响且为常数项,所以时间复杂度记作O(1)。这种与问题的大小无关(n的多少),执行时间恒定的算法,我们称之为具有O(1)的时间复杂度,又叫常数阶

2、线性阶

线性阶的循环结构会复杂很多。要确定某个算法的阶次,我们常常需要确定某个特定语句或某个语句集运行的次数。因此,我们要分析算法的复杂度,关键就是要分析循环结构的运行情况。

在这里插入图片描述
上图中1语句频度为1,
2语句频度为1,
3语句频度为1,
4语句频度为n,
5语句频度为n,
6语句频度为n
所以次函数记作f(n) = 1 + 1 + 1 + n + n + n = 3n + 3,根据法则所以该算法时间复杂度为O(n)。

3、对数阶

在这里插入图片描述
如上图所示,已知n>1
1语句频度为1,
2语句的频度为2^f(n) <= n
f(n) = log2^n
取最大值f(n) = log2^n
所以时间复杂度记作O(log2^n)。

4、平方阶

在这里插入图片描述
如上图所示
1语句频度为1,
2语句的频度为nn
f(n) = 1 + n
n = n^2+1
所以时间复杂度记作O(n^2)。

5、立方阶

在这里插入图片描述
如上图所示
f(n) = 1 + nnn = n^3+1
所以时间复杂度记作O(n^3)。

扩展一个之前遇到的比较有意思的题

在这里插入图片描述
在这里插入图片描述
数学公式补充

公式一: 12/2+23/2+3*4/2+……+n(n+1)/2=n(n+1)(n+2)/6
公式二: 12+22+32+……+n2=n(n+1)(2n+1)/6
公式三: 13+23+33+……+n3=[n(n+1)/2]^2
在这里插入图片描述
f(n) = n(n+1)(n+2)/6
= n(n^2 +3n +3)/6
= (n^3 + 3n^2 + 3n)/6
时间复杂度为O(n^3)

常见的时间复杂度比较

常用的时间复杂度所耗费的时间从小到大依次是:
O(1) < O(log2 ^ n) < O(n) < O(nlog2 ^ n) < O(n ^ 2) < O(n ^ 3) < O(2 ^ n) < O(n!) < O(n ^ n)

指数阶O(2^n)和阶乘阶O(n!)等除非是很小的n值,否则哪怕n 只是100,都是噩梦般的运行时间。所以这种不切实际的算法时间复杂度,一般我们都不去讨论。

最坏情况与平均情况

我们查找一个有n 个随机数字数组中的某个数字,最好的情况是第一个数字就是,那么算法的时间复杂度为O(1),但也有可能这个数字就在最后一个位置上待着,那么算法的时间复杂度就是O(n),这是最坏的一种情况了。
最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。 在应用中,这是一种最重要的需求, 通常, 除非特别指定, 我们提到的运行时间都是最坏情况的运行时间。
而平均运行时间也就是从概率的角度看, 这个数字在每一个位置的可能性是相同的,所以平均的查找时间为n/2次后发现这个目标元素。平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。也就是说,我们运行一段程序代码时,是希望看到平均运行时间的。可现实中,平均运行时间很难通过分析得到,一般都是通过运行一定数量的实验数据后估算出来的。一般在没有特殊说明的情况下,都是指最坏时间复杂度。

算法的空间复杂度

类似于时间复杂度的探讨,一个算法的空间复杂度S(n)定义为该算法所消耗的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间算法的输入输出所占用的存储空间算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地进行的”,是节省存储的算法,如上面介绍的都是。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元。

当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(log2^n);当一个算法的空间复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)= O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。关于O(1)的问题, O(1)是说数据规模和临时变量数目无关,并不是说仅仅定义一个临时变量。举例:无论数据规模多大,我都定义100个变量,这就叫做数据规模和临时变量数目无关。就是说空间复杂度是O(1)。

对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

常用的算法的时间复杂度和空间复杂度

在这里插入图片描述

一些计算的规则

1、加法规则

 T(n,m) = T1(n) + T2(m) = O(max{f(n), g(m)})

2、乘法规则

 T(n,m) = T1(n) * T2(m) = O(max{f(n)*g(m)})

3、复杂度与时间效率的关系

c(常数) < logn < n < n*logn < n^2 < n^3 < 2^n < 3^n < n!
l------------------------------l--------------------------l--------------l
               较好                          一般                    较差

原文连接:https://blog.csdn.net/daijin888888/article/details/66970902#commentBox

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

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

相关文章

数据结构 模拟实现LinkedList单向不循环链表

目录 一、链表的简单介绍 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size得到单链表的长度方法 &#xff08;3&#xff09;addFirst头插方法 &#xff08;4&#xff09;addLast尾插方法 &#xff08;5&#xf…

SSM图书馆管理系统----计算机毕业设计

项目介绍 基于ssm的图书馆管理系统.主要功能包括&#xff1a;图书查询、图书管理、图书编辑、读者管理、图书的借阅与归还以及借还日志记录等。 用户分为两类&#xff1a;读者、图书馆管理员。图书馆管理员可以修改读者信息&#xff0c;修改书目信息&#xff0c;查看所有借还…

C++初阶——基础知识(内联函数)

目录 1.内联函数 内联函数的示例代码 1.内联函数 是一种 C 中的函数定义方式&#xff0c;它告诉编译器在每个调用点上插入函数体的副本&#xff0c;而不是像普通函数那样在调用时跳转到函数体所在的地址执行。这样可以减少函数调用的开销&#xff0c;提高程序的执行效率。 …

婴幼儿家庭护理百科知识,宝宝健康成长育儿实用课程

一、教程描述 本套教程由具有丰富育儿经验的多名专家精心打造而成&#xff0c;也是专门提供给准爸妈们学习的实用课程&#xff0c;可以解决宝宝的日常护理、日常喂养、饮食调理、疾病防治、意外护理等多方面问题。课程不仅可以丰富你的育儿知识&#xff0c;而且能够让你把这些…

中央集成式架构量产时代,openVOC方案将引发软件开发模式变革

2024年&#xff0c;中央计算区域控制架构正式进入规模化量产周期&#xff0c;汽车智能化正式迈入2.0时代&#xff0c;产业生态、应用创新、开发模式都将迎来巨大变革。 同时&#xff0c;随着ChatGPT引发的AIGC领域的爆发式增长&#xff0c;人工智能技术掀起全球万亿级信息化应…

63页!嵩山版Java开发手册分享

作为广受欢迎的编程语言之一&#xff0c;Java在软件开发领域扮演着重要的角色。然而&#xff0c;由于Java的灵活性和广泛应用&#xff0c;很容易出现代码质量低下、可读性差、维护困难等问题。为了解决这些问题&#xff0c;阿里巴巴集团发布了一份权威指南——阿里嵩山版Java开…

揭秘HTTP与HTTPS:保障安全的网页传输协议之争

目录 1、前言 2、HTTP与HTTPS的概念及区别 2.1 HTTP的定义与特点 2.2 HTTPS的定义与特点 2.3 HTTP与HTTPS的区别 3、HTTP的工作原理及安全隐患 3.1 HTTP的工作流程 3.2 HTTP的安全隐患 4、HTTPS的工作原理及优势 4.1 HTTPS的工作流程 4.2 HTTPS的加密算法 4.3 HTTP…

java springboot将接口查询数据放在系统中 一小时系统更新一次 避免用户访问接口查询数据库缓慢

真到了公司 很多数据库表 特别是常用的功能业务对应的 都是几百万条起步的数据 查询会比较缓慢 那么 我们就可以不用每次都真的查询数据库 例如 我这里有一个接口 通过 封装的 IBookService.list 函数去查询数据库 接口返回是这样的 我们先在启动类 条件装配上 这个接口所在的…

Jenkins 系列:Jenkins 安装(Windows、Mac、Centos)和简介

文章目录 简介发展历史应用场景 Jenkins 安装部署先决条件硬件要求软件包下载war 包部署linux 系统部署mac 系统部署windows 系统部署安装后基本配置解锁自定义 jenkins 插件创建用户配置更新站点 配置文件 简介 Jenkins前身是 Hudson&#xff0c;使用 java 语言开发的自动化发…

VS2019+OpenCV4.7.0+OpenCV_contrib4.7.0+CUDA安装+配置视频硬解码保姆级别教程

在算法开发过程中&#xff0c;涉及基于opencv的rtsp流硬解码&#xff0c;这里设计结合当前所有的资料&#xff0c;实现了现有opengl相关的所有跟视频硬解码相关的功能&#xff0c;下面对opencv4.7.0的编译流程进行说明&#xff1a; 一、准备工作 下载opencv &#xff1a;open…

Linux服务器搭建笔记-006:拓展/home目录容量

一、问题说明 Ubuntu服务器在使用过程中创建的新用户&#xff0c;每位用户会在/home目录下生成一个属于其个人的主文件夹。如果不限制各个用户的使用空间&#xff0c;所有的用户都会共用/home所挂载的硬盘。在这种多用户情况下&#xff0c;会很快的填满/home目录&#xff0c;导…

移动应用开发:揭秘内侧APP封装台的高效

在数字化浪席卷下&#xff0c;移应用已经成连接企业与用户纽带。为了抢占市场先机&#xff0c;快速发布高质量的移动应用成为业竞争的关键。侧APP封装平因此而诞生&#xff0c;成为了应开发者的得助手。以下是内侧APP封装台的全面解读&#xff0c;助在应用开发海洋中乘风破浪。…

国产芯片ACL16_S 系列 ,低成本物联网安全,可应用物联网认证、 SIM、防抄板和设备认证等产品上

ACL16_S 芯片是针对物联网认证、 SIM、防抄板和设备认证需求推出的高安全芯片。芯片采用 32 位 ARMCortex™-M0 系列内核&#xff0c;片内集成多种安全密码模块&#xff0c;包括 RSA/ECC DES/TDES、 SHA-1/-256、 AES-128/-192/-256 等国际安全算法&#xff0c;支持真随机数发…

松鼠目标检测数据集VOC格式1400张

松鼠是一种可爱的小型哺乳动物&#xff0c;它们属于啮齿动物目&#xff0c;是广泛分布于全球的一类动物。松鼠的外貌非常特别&#xff0c;有着精巧的身体结构和灵活的动作&#xff0c;是森林和城市公园中常见的动物之一。 松鼠通常有中等大小&#xff0c;头部相对较大&#xf…

告别 2023,迎接 2024

告别 2023&#xff0c;迎接 2024 这是 2023 年的最后一篇博客 时间过得可真快啊&#xff0c;仿佛 2023 才刚刚开始&#xff0c;一晃眼&#xff0c;便又接近尾声了 逝者如斯夫&#xff0c;不舍昼夜 现在我一个人坐在实验室中&#xff0c;回想着 2023 发生的种种事情&#xf…

06|调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

06&#xff5c;调用模型&#xff1a;使用OpenAI API还是微调开源Llama2/ChatGLM&#xff1f; 让我们带着下面的问题来开始这一节课的学习。大语言模型&#xff0c;不止 ChatGPT 一种。调用 OpenAI 的 API&#xff0c;当然方便且高效&#xff0c;不过&#xff0c;如果我就是想用…

vue3+ts开发干货笔记

总结一下在vue3中ts的使用。当篇记录部分来自于vue官网&#xff0c;记录一下&#xff0c;算是加深印象吧。 纯干笔记&#xff0c;不断补充&#xff0c;想到什么写什么&#xff0c;水平有限&#xff0c;欢迎评论指正&#xff01; 类型标注 props <script setup lang"…

【算法】数论---约数

约数里面的一个重要性质&#xff1a;一个数的约数都是成对存在的(以sqrt(x)为分界线) 一、求一个数的所有约数---试除法 int x; cin>>x; int yue[10000]{0},idx0; for(int i1;i<x/i;i) {if(x%i0){yue[idx]i;cout<<i<<" ";} }for(int iidx-1;i&…

非科班,培训出身,怎么进大厂?

今天分享一下我是怎么进大厂的经历&#xff0c;希望能给大家带来一点点启发&#xff01; 阿七毕业于上海一所大学的管理学院&#xff0c;在读期间没写过一行 Java 代码。毕业之后二战考研失利。 回过头来看&#xff0c;也很庆幸这次考研失利&#xff0c;因为这个时候对社会一…

现实世界中的人工智能:工业制造的 4 个成功案例研究

现实世界中的人工智能&#xff1a;工业制造的 4 个成功案例研究 从抓鸡翅到建立整个虚拟工厂&#xff0c;各种规模的制造商都利用人工智能以更快的速度、更低的成本和更低的风险生产更多的产品。 我们能否让工厂变得足够聪明&#xff0c;在发生故障之前告诉我们&#xff1f;我…