简介时间复杂度

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

时间复杂度的含义

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

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

举例解释时间复杂度

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

       大家可以先来看一下这个比较简单的时间复杂度计算题。如果你觉得不能一眼看出来时间复杂度并且还是在前期的时候我们就带值进去计算一下。比如说我们上面我们给的例题,我们先带一个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.mzph.cn/diannao/42452.shtml

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

相关文章

【全面讲解下iPhone新机官网验机流程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

MybatisPlus实现插入/修改数据自动设置时间

引言 插入数据时自动设置当前时间,更新数据时自动修改日期为修改时的日期。 使用MybatisPlus的扩展接口MetaObjectHandler 步骤 实现接口 实体类加注解 实现接口 package com.example.vueelementson.common;import com.baomidou.mybatisplus.core.handlers.M…

C++ 模版进阶

目录 前言 1. 非类型模版参数 1.1 概念与讲解 1.2 array容器 2. 模版的特化 2.1 概念 2.2 函数模版特化 2.3 类模版特化 2.3.1 全特化 2.3.2 偏特化 3.模版的编译分离 3.1 什么是分离编译 3.2 模版的分离编译 3.3 解决方法 4. 模版总结 总结 前言 本篇文章主要…

包/final/权限修饰符/代码块

包package 1、包的作用 包用来管理不同的类。 2、包名 包名要全部小写,一般是域名反写,如com.liu。在Java中,java解释器会将package中的.解释为目录分隔符/,也就是说该文件的目录结构为:...com/liu/... 3、全类名…

1.pwn的汇编基础(提及第一个溢出:整数溢出)

汇编掌握程度 能看懂就行,绝大多数情况不需要真正的编程(shellcode题除外) 其实有时候也不需要读汇编,ida F5 通常都是分析gadget,知道怎么用, 调试程序也不需要分析每一条汇编指令,单步执行然后查看寄存器状态即可 但…

实现多数相加,但是传的参不固定

一、情景 一般实现的加法和减法等简单的相加减函数的话。一般都是写好固定传的参数。比如: function add(a,b) {return a b;} 这是固定的传入俩个,如果是三个呢,有人说当然好办! 这样写不就行了! function add(a…

vue中自定义设置多语言(包括使用vue-i18n),并且运行js脚本自动生成多语言文件

在项目中需要进行多个国家语言的切换时,可以用到下面方法其中一个 一、自定义设置多语言 方法一: 可以自己编写一个设置多语言文件 在项目新建js文件,命名为:language.js,代码如下 // language.js 文档 let languagePage {CN…

聊一下Maven打包的问题(jar要发布)

文章目录 一、问题和现象二、解决方法(1)方法一、maven-jar-pluginmaven-dependency-plugin(2)方法二、maven-assembly-plugin 一、问题和现象 现在的开发一直都是用spring boot,突然有一天,要自己开发一个…

Django之项目开发(二)

目录 一、安装和使用uWSGI 1.1、安装 1.2、配置文件 1.3、启动与停止uwsgi 二、安装nginx 三、Nginx 配置uWSGI 四、Nginx配置静态文件 五、Nginx配置负载均衡 一、安装和使用uWSGI uWSGI 是一个 Web 服务器,可以用来部署 Python Web 应用。它是一个高性能的通用的 We…

味蕾与理解:应对自闭症儿童挑食的策略与理解

在星贝育园自闭症康复学校,我们深知饮食习惯对孩子们的成长至关重要,而自闭症儿童的挑食问题往往比同龄儿童更为突出,给家长和照顾者带来了额外的挑战。今天,作为这里的老师,我想与大家分享一些应对自闭症儿童挑食的策…

(南京观海微电子)——电阻应用及选取

什么是电阻? 电阻是描述导体导电性能的物理量,用R表示。 电阻由导体两端的电压U与通过导体的电流I的比值来定义,即: 所以,当导体两端的电压一定时,电阻愈大,通过的电流就愈小;反之&…

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台,无需编程基础即可快速搭建基于大模型的 Bot,并发布到各个渠道。平台优势包括无限拓展的能力集(内置和自定义插件)、丰富的数据源(支持多种数据格式和上传方式)、持…

[Unity入门01] Unity基本操作

参考的傅老师的教程学了一下Unity的基础操作: [傅老師/Unity教學] Unity3D基礎入門 [華梵大學] 遊戲引擎應用基礎(Unity版本) Class#01 移动:鼠标中键旋转:鼠标右键放大:鼠标滚轮飞行模式:右键WASDQEFocus模式&…

算法设计与分析 实验5 并查集法求图论桥问题

目录 一、实验目的 二、问题描述 三、实验要求 四、实验内容 (一)基准算法 (二)高效算法 五、实验结论 一、实验目的 1. 掌握图的连通性。 2. 掌握并查集的基本原理和应用。 二、问题描述 在图论中,一条边被称…

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录,注册、首页、订餐、购物车,我的。 用户注册后,登陆客户端即可完成订餐、浏览菜谱等功能,点餐,加入购物车,结算,以及删减…

【学习笔记】操作系统--万字长文

计算机操作系统 文章目录 计算机操作系统引言 操作系统基本概念第一章 引论目标和作用操作系统发展历程单道批处理系统多道批处理系统分时系统实时系统 基本特征并发共享虚拟异步性(不确定性) 操作系统主要功能处理机管理内存管理设备管理文件管理 第二章…

工程化:Commitlint / 规范化Git提交消息格式

一、理解Commitlint Commitlint是一个用于规范化Git提交消息格式的工具。它基于Node.js,通过一系列的规则来检查Git提交信息的格式,确保它们遵循预定义的标准。 1.1、Commitlint的核心功能 代码规则检查:Commitlint基于代码规则进行检查&a…

汇聚荣拼多多电商的技巧有哪些?

在电商平台上,汇聚荣拼多多以其独特的商业模式和创新的营销策略吸引了大量消费者。那么,如何在这样一个竞争激烈的平台上脱颖而出,成为销售佼佼者呢?本文将深入探讨汇聚荣拼多多电商的成功技巧。 一、精准定位目标客户群体 首先,…

绝区肆--2024 年AI安全状况

前言 随着人工智能系统变得越来越强大和普及,与之相关的安全问题也越来越多。让我们来看看 2024 年人工智能安全的现状——评估威胁、分析漏洞、审查有前景的防御策略,并推测这一关键领域的未来可能如何。 主要的人工智能安全威胁 人工智能系统和应用程…

C-11 三角剖分的调研

C-11 三角剖分算法 三角剖分就是将输入的多边形,分割成一系列互不重叠的三角形,其重要性就在这不多赘述。这个是一个别人总结的链接:http://vterrain.org/Implementation/Libs/triangulate.html 图片链接:http://www-cgrl.cs.m…