简介时间复杂度

news2024/11/15 20:00:21

        好了,今天我们来了解一下,我们在做练习题中常出现的一个名词。时间复杂度。我相信大家如果有在练习过题目的话。对这个名词应该都不陌生吧。但是可能很少的去思考它是干什么的代表的什么意思。反正我以前练习的时候就是这样。我只知道有这么一个名词在题目里面。但是这个限制的是什么我都不知道。因为在开始的简单练习题中对时间复杂度的要求很低。大家用暴力求解法几乎都可以。但是到后来很多方面都对这个是有要求的了。不再像以前那样,暴力求解都可以解决问题的了。好,我们现在讲这么多。都只是让大家对时间复杂度稍微有一点了解。接下来我们就来详细的介绍一下时间复杂度的含义以及如何计算时间复杂度。

时间复杂度的含义

       对于时间复杂度的含义的话我们先用官方的解释来给大家过一遍:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知 道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个 分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。 这些都是比较官方的书法了我个人觉得这样的解释对于还不太了解时间复杂度的小白来说还是有点太深奥了。要是用我自己理解的白话来讲的话,大家可以想象一下。一个简单的循环。这个循环执行了多少次。然后这个次数就是我们的时间复杂度。我觉得这个解释算是通俗易懂的了。

        当然如果所有的时间复杂度都是看一个循环就能得出来的话那就太简单了。我们后面接触的需要考虑时间复杂化度的时候就有很多元素了。在开始的时候大家甚至都可以带一个值进去估算一下。有个大概结果。并且我们的时间复杂度确实不用那么准确。

举例解释时间复杂度

       如果我们光讲的话,对时间复杂度的了解肯定是不够的。所以我们还是举一些例子来帮助大家理解。当然是从简单到难得。

       大家可以先来看一下这个比较简单的时间复杂度计算题。如果你觉得不能一眼看出来时间复杂度并且还是在前期的时候我们就带值进去计算一下。比如说我们上面我们给的例题,我们先带一个10.然后计算看值是多少?然后再带100,1000分别计算一下。

        这里我已经提前计算过来。大家如果感兴趣的话可以自己再去验算一遍。但是啊。大家看。这里我们虽然计算出来了 F(N)的大小,但是大家应该发现了吧。我们平常见到的时间复杂度都是一些什么O()什么什么的吧。是吧。那我们如果照着这样写的话,是不是就很不合大众啊。那么我们也要学习如何用这个大O来表示时间复杂度吧。

大O表示法

        对于大O表示法来说咧。我们先来看看正式的解释:是用于描述函数渐进行为的数学符号。出了算法的速度有多快。当然是趋向于操作的次数,因为每种操作的方式不同所需的时间也就无法统一。大O表示法通常作为一个算法优劣的标准,越快越好,数值越小越快。对于官方解释哈。我反正是基本听不懂的。但是有人能听懂啊。所以他们给我讲的时候是这样说的括号里面的取这个公式里面对这个公式影响最大的那个。怎么说咧。例如上面的例子F(N)=N*N+2*N+10。大家可以稍微思考一下这个公式里面对于结果谁的影响是最大的。是不是N*N啊。就是N的平法嘛。因为我不知道怎么打出一模一样的,所以就这样,意思是一样的。好。大家可以理解一下。我们这里是不是n的平方在这个式子里面的影响力最大的。那么我们的大O表示法如何表示咧:O(N*N)。

       当然这个式子是固定的但是还有很多式子是无法确定的啊。例如在一个数组里面找一个数这个数一定在数组里面,那么这个式子的时间复杂度如何计算啊。最好情况:1次找到,最坏情况:N次找到,平均情况:N/2次找到。那么这个式子的时间复杂度如何写咧。所以这里我们就引出了大O表示法的另一个规则,我们取最坏的结果。大家都听过一句话,就是要做好最坏的打算。那么这里也是。我们大O表示法也是取最坏的。那么我们这个例子的时间复杂度就为O(N)

       当然有些时候,像上面这个例子直接给我们说了N是多少,比如说m=10,while(m--)。那么我们这里的时间复杂度就是是O(1)了。为什么是O(1)咧。因为我们大O表示法明确表示过。对于N为明确的数值的时候都用1。表示这样表示这个式子的计算速度就是最快的了。因为最坏的情况我们都能一眼看出来,那么这个循环或者递归都应该不是很难了。

      当然还有很多的时间复杂度表示方法,这里我就以我们上面讲过的几大排序方法来举例:

        我们后面就会很少遇见O(1)的时间复杂化度了。所以,大家可以先看一下大致有哪些时间复杂度的表示方法。

两个循环计算时间复杂度

        这里咧我们就不讲单个时间复杂度是如何计算的了。因为如果没有明确的写出循环的个数的话。大多都是O(N)。所以我们这里直接来讲讲双循环是如何计算的。

        对与这样简单的分开的两个循环来计算时间复杂度的来说。我们可以分开来看第一个循环是不是关键再与M。然后第二个循环关键在于N。然后我们计算的是++count执行了多少次。那么我们是不是就最好的情况是1+1。两个循环都是一次就结束了。但是最坏的咧。是不是每次都执行完了。那就是M+N了。我们前面也说过取最坏的情况。那么这里我们的时间复杂度是不是就是O(M+N)了。

strchr计算时间复杂度

        大家对于strchr的作用应该还没忘吧。就是在一个字符窜里面寻找一个字符。就是我们前面说过的简单的单循环计算。

       既然是简单的单循环计算了,那么时间复杂度也是简单的O(N)了吧。

冒泡排序计算时间复杂度

      冒泡排序大家肯定都没忘吧。毕竟大家还是小白的时候应该都写过这个吧。接下来我们就是来尝试计算一下冒泡排序的时间复杂度。

       我们来看看冒泡排序最好的情况就是执行n次就结束了。但是最坏的情况就是内部不是有序数列,那么就 当end=n-1的时候内部就要执行n-2次。当end=n-2的时候内部就要执行n-3次....当end=2时,内部就执行1次end=1时内部执行0次。end不能为0。那么这个循环是不是就是(1+n-1)*n/2然后我们整合一下就是(n*2)/2。那么最坏的情况下,影响最大的就是n*2了。那么冒泡排序的大O表示法就是O(n*2)。大家应该明白吧。就是稍微带值进去计算得出个大概规律。我们不需要十分准确,有个大概就是可以了。如果太精确也没啥意义其实。

递归计算时间复杂度

        讲了上面几个例子接下里我们讲讲另外一个常见的计算时间复杂度的。递归。这个也是我们前期学过的了。那么递归的时间复杂度如何计算咧。

       这个递归是很简单的。我们只需要康康n就可以了。也可能一次就结束了,也有可能要n次。那么老规矩取最坏的情况。我们就取n。所以这个递归的时间复杂度为O(N)。

递归斐波拉契数计算时间复杂度

      递归斐波拉契数的这个难度可就不是上面的那些简单就能想出来的了哦。我们建议计算这个最好是画一画图递归栈帧的二叉树讲解。反正已经学过二叉树了。我们就用起来然后帮助理解。

斐波那契数列是这样一个数列:1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765…

表达式为:
在这里插入图片描述

 

        对于Fib(5)的递归过程可知,执行次数最多不超过但接近于二叉树最多时候的节点数,可近似看为2 n − 1 2^n-12 n −1,所以时间复杂度T(n)为2 n 2^n2 n的同阶,即T ( n ) = O ( 2 n )                       T(n)=O(2^n)T(n)=O(2 n )在递归调用的过程中,除了存放程序本身所用的指令和变量,还需要另外开辟n个变量来作为辅助空间,分别对应Fib(n-1),Fib(n-2),Fib(n-3),…,Fib(0)中的n-1,n-2,n-3,…,0。因此,空间复杂度为O (n)。 

总结

      好了,当大家看到这里我想应该就对计算时间复杂度有一些了解了吧。反正我一直用的都是带几个值进去计算一下。然后就可以得出一个大概的逻辑这样得出一个大概的就可以了。那么今天的时间复杂度计算就到这里了。下一篇我们会分享一下空间复杂度的计算。

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

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

相关文章

DevOps实战:使用GitLab+Jenkins+Kubernetes(k8s)建立CI_CD解决方案

一.系统环境 本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。 服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64CI/CD解决方案架构图:CI/CD解决方案架构图描述:程序员写好代码之…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc(识别pdf中图片)4. Deepdoc(识别pdf中文字)5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行(RCE)漏洞,存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用,攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…

verilog读写文件注意事项

想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内, 可以使用 f s c a n f ( f d 1 , " 也可以使用 fscanf(fd1,"%h",rd_byte);实现 也可以使用 fscanf(fd1,"也可以使用readmemh(“./FILE/1.txt”,mem);//fe放在mem[0…

alphazero学习

AlphaGoZero是AlphaGo算法的升级版本。不需要像训练AlphaGo那样,不需要用人类棋局这些先验知识训练,用MCTS自我博弈产生实时动态产生训练样本。用MCTS来创建训练集,然后训练nnet建模的策略网络和价值网络。就是用MCTSPlayer产生的数据来训练和…

VRPTW(MATLAB):常春藤算法(IVY)求解带时间窗的车辆路径问题VRPTW,MATLAB代码

详细介绍 VRPTW(MATLAB):常春藤算法(Ivy algorithm,IVY)求解带时间窗的车辆路径问题VRPTW(提供MATLAB代码)-CSDN博客 ********************************求解结果******************…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词: http请求协议:就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行,第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

C语言 -- 深入理解指针(一)

C语言 -- 深入理解指针(一) 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符(&)​2.2 指针变量和解引用操作符(*)​​2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引…

Java语言程序设计基础篇(第10版)编程练习题13.18(使用 Rational 类)

第十三章第十八题(使用 Rational 类) 题目要求: 编写程序,使用 Rational 类计算下面的求和数列: 你将会发现输出是不正确的 ,因为整数溢出(太大了)。为了解决这个问题 ,参见编程练习題13.15。代码参考: package cha…

羊大师:小暑至,热浪涌,三伏悠长防暑忙

随着夏日的脚步悄然加速,我们迎来了小暑节气。小暑,一个预示着盛夏正式拉开序幕的时节,它携带着滚滚热浪,让大地仿佛置身于火炉之中。而随之而来的三伏天,更是长达40天的酷热考验,让人不禁感叹夏日的漫长与…

文件、文本阅读与重定向、路径与理解指令——linux指令学习(一)

前言:本节内容标题虽然为指令,但是并不只是讲指令, 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法, 很抱歉, 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的,…

记录第一次使用air热更新golang项目

下载 go install github.com/cosmtrek/airlatest 下载时提示: module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此时,需要在go.mod中加上这么一句: replace github.com/cosmtrek/air &…

VitePress美化

参考资料: https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站点信息修改 首页部分的修改基本都在.vitepress/config.mts,这个文件内修改。 title 站点名称 description 描述 top…

轻松快速上手Thekey库,实现数据加密无忧

Thekey的概述: Thekey库是一个Python库,旨在简化数据加密、解密、签名和验证的过程。它提供了一套简洁易用的接口,用于处理各种加密任务,适合需要在应用程序中实现安全数据处理的开发人员. 安装Thekey库 pip install thekey使用Thekey库进行基本加密和解密操作的…

一种一维时间序列信号变化/事件/异常检测方法(MATLAB)

随着工业物联网、大数据和人工智能的发展,传统工业正在向数字化和智能化升级,从而创造了大量的时间序列数据。通过分析这些数据,可以提供准确可靠的信息服务和决策依据,促进制造业的转型升级。工业物联网在传统工业向“工业 4.0”…

Java+ Idea+ Vue产科信息管理系统源码 什么是产科信息管理系统的门诊管理?

Java Idea Vue产科信息管理系统源码 什么是产科信息管理系统的门诊管理? 产科信息管理系统 门诊管理是现代医疗服务的重要组成部分,它借助信息技术手段,对产科门诊的各个环节进行优化和重构,以提高医疗服务效率、提升患者体验、加…

Windows安装超好用的截图工具——Snipaste

1、下载 官网:https://zh.snipaste.com/ 2、安装 (1)解压下载的压缩包 (2)选中Snipaste.exe文件,右键发送到 -- > 桌面快捷方式 (3)双击桌面Snipaste图标,桌面右下…

Qt 基础组件速学 事件过滤器

学习目标:理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示: Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

从文本到安全图像:自动提示优化防止不当内容生成

T2I生成技术已经得到了广泛关注,并见证了如GLIDE、Imagen、DALL-E 2、Stable Diffusion等大型生成模型的发展。尽管这些模型能够根据文本描述生成高质量的图像,促进了书籍插图、品牌标识设计、游戏场景创作等多种实际应用,但它们也被恶意用户…

html+js+css做的扫雷

做了个扫雷&#x1f4a3; 88大小 源代码在文章最后 界面 先点击蓝色开局按钮 然后就可以再扫雷的棋盘上玩 0代表该位置没有雷 其他数字代表周围雷的数量 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&qu…