时间复杂度讲解(数据结构)

news2024/12/23 13:05:49

目录

引言       

        

什么是数据,结构和算法

时间复杂度的概念

如何计算时间复杂度

   总结


引言       

        

        hello大家好,我是boooooom君家宝。在前期的博客中博主呢对c语言的一些重要知识点进行了讲解,接下来博主的博客内容将为大家呈现的是数据结构算法的知识讲解,纯c语言版本。由于c语言对于数据结构和算法的进阶知识不是非常的契合,所以暂时只用c语言呈现初阶的数据结构算法内容,后续博主将会讲解c++的知识点,然后就是我们进阶的数据结构内容了。

什么是数据,结构和算法

        既然开始学习数据结构,那么到底什么是数据结构呢?数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

        那什么又是算法呢?算法就是定义良好的计算过程,它取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法那就是一系列的计算步骤,用来将输入数据转化成输出结果。

时间复杂度的概念

        算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。一个算法的好坏就是看一个算法的效率怎么样,而判定一个算法的效率是否高效,就是他的算法复杂度决定的,分为时间复杂度和空间复杂度。今天博主为大家带来的就是时间复杂度的知识点讲解。

        有的小伙伴就会说,是不是电脑算得越快这个算法就更好呢?这个说法是不准确的,例如我的电脑配置很一般,我跑一个qsort快速排序比我一个朋友最顶级的电脑配置跑一个冒泡排序使用的时间还要长一些,那难道就可以说,快速排序这个算法比不上冒泡排序吗?所以评判一个算法的好坏还是得去计算复杂度。

        什么是时间复杂度?在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,一个算法执行所耗费的时间,从理论上说,是不能算出的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这样很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例。算法中的基本操作的执行次数,为算法的时间复杂度。

        即:找到某条算法语句与问题规划N之间的数学表达式,就是算出了该算法的时间复杂度。

       

如何计算时间复杂度

                时间复杂度的计算,相当于计算算法到底处于什么量级,什么level。现在博主举几个实例,然后分别去计算它们的时间复杂度是多少

Func1:

       这个例子中,上面两层for循环会执行n*n的次数,第三个for循环的执行次数是2n,while循环里的执行次数是10次。所以这个例子的总执行次数就是n^2+2n+10。这个相比大家应该都能算出来,那么他的时间复杂度的表示方法应该写成O(N^2)。这个复杂度不需要你去算得非常的精确,而是去算一个渐进表达法,就是谁对这个表达式起决定性的意义,也就是变化速度最快的那一项。毫无疑问,在这一个表达式当中,取决定性的那一项就是N^2,所以时间复杂度就是O(N^2)。

Func2:

        这个例子依然很简单,很轻松的就能算出来准确的计算次数是2n+10.那么他的时间复杂度是不是就是取决定性的那项也就是2n,所以复杂度就是O(2n)呢?答案是不对的,按照时间复杂的一个计算规则来看,实际上他的复杂度应该是O(N).他的变化量级就是在n的一次方这个量级,所以我们以后遇到什么2n,3n,5n,6n+1之类的,他们复杂度都是O(N)。

Func3:

        这个例子的时间复杂度就是O(M+N),因为我们并不能很明确的区分M,N这俩到底谁对这个结果的影响更大,除非题目明确说明谁远大于谁,那我们才会舍弃掉其中一个。那如果他还有几个常数项的加减呢,那我们是否要去掉这个常数项?答案是肯定的。

Func4:

        在这个例子中,我们计算出来答案应该是100,是一个常数,那他的时间复杂度我们就应该写成O(1)。换句话说,只要是计算结果为常数项,那他的时间复杂度就都是O(1)。请注意,这个O(1)的意思不是说只有一次,而是代表常数次。

Func5:

        首先,strchr是一个库函数,相当于是在一个字符数组中查找一个字符,那么这个时间复杂度是多少呢?答案是O(N)。为什么是O(N)呢,这个算法他有很多种情况,最好的情况就是我们第一次查找就找到了,最坏的结果就是最后一个才找到或者说根本找不到,那么我们应该以哪一种情况来定义复杂度呢?那肯定是以最坏的情况来定义嘛,所以这道题目,最好的情况就是1次,最差的结果是N次。所以时间复杂度就是O(N)。时间复杂度预算,是一个稳健保守预期。

Func6:

        这个例子呢是一个冒泡排序,就是从(n-1),(n-2),(n-3)...一直加在一起嘛,所以就是一个等差数列的求和,算下来就是(n-1)*n/2,所以他的时间复杂度就是O(N^2).

Func7:二分查找

        这是一个二分查找,我们先回复一下二分查找的思想,二分查找的前提是这个数列是有序的,我们先从这个数列的中间部分查找,如果需要查找的数比中间值大,我们就定位到左边区域,接下来再直接找到左边那一半区域的中间,去和需要查找的数进行对比,以此反复不断折半缩小范围直到最后找到目标或者确定目标数不在数列里。如图:

        同理,这个也会有很多情况,那我们直接定位到什么时候是最坏的情况,也就是将区间缩放到只剩一个值时是最坏情况。要么这一个值就是目标值,要么就确定目标值不在数列里。那这个最坏情况我们不妨设它查找了X次,那么2^X=N, X=log以2为底N的对数。但是各位也能看得出来博主对这样的一个情况实在不方便用键盘打印出来,所以我们会把这样以2为底的一种情况的复杂度记为O(logN),那有些朋友就要疑问了,如果是以3为底或者以4为底呢?那样的话就只能老老实实写出来了,不过这种复杂度的算法很少很少,例如以3为底的有后续博主会讲到的b树,其他的基本是没有看到过其他底数的复杂度了。

   总结

        算法有无数多种类,博主也不能一一列举出来然后计算出它的时间复杂度,例如AVL树,红黑树等,不过从这几种情况大概我们已经回去计算所有的算法复杂度了,而且博主的建议就是在我们计算过某些常用的算法,例如冒泡排序,快速排序,二分查找等,我们可以把它记住他的复杂度是多少,以后面试的时候做一些oj类的题目他们会要求复杂度得控制在一定的范围之类,所以我们就需要先确定好复杂度之后再去敲代码。

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

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

相关文章

JavaScript:二进制数组【笔记】

二进制数组【ArrayBuffer对象、Type的Array视图和DataView视图】JavaScript操作二进制数据的一个接口。 这些接口原本是和WebGL有关【WebGL是浏览器与显卡之间的通信接口】,为了满足JavaScript与显卡之间大量、实时数据交换,那么JavaScript和显卡之间的…

认识面向对象-PHP8知识详解

面向对象编程,也叫面向对象程序设计,是在面向过程程序设计的基础上发展而来的,它比面向过程编程具有更强的灵活性和扩展性。 它用类、对象、关系、属性等一系列东西来提高编程的效率,其主要的特性是可封装性、可继承性和多态性。…

2024届河南硕士暑期实习经验分享---招商银行篇

本期的实习经验分享,采访到了我的一位优秀的师弟,师弟于今年成功被郑州招商银行信息技术岗录取进行实习,下面他将使用第一人称的方式分享自己寻找实习过程中的一些经验、需要避的坑和在招商银行实习过程中的一些经历,为后续师弟师…

2023.9.11 关于传输层协议 UDP和TCP 详解

目录 UDP协议 TCP协议 TCP十大核心机制 确认应答 超时重传 连接管理(三次握手 四次挥手) 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP 中的异常处理 经典面试题 对比 TCP 和 UDP 如何使用 UDP 实现可靠传…

l8-d19 广播与组播

一、广播 1.概念 数据包发送方式只有一个接受方,称为单播 如果同时发给局域网中的所有主机,称为广播 只有用户数据报(使用UDP协议)套接字才能广播 广播地址 一个网络内主机号全为1的IP地址为广播地址 发到该地址的数据包被所有的主机接收 255.25…

Linux学习第14天:Linux设备树(一):枝繁叶茂见晴天

本节笔记主要学习了Linux设备树相关知识点,由于内容较多,打算分两天进行总结。今天着重学习Linux设备树,主要包括前三节内容,分别是概念、格式和语法。 本节思维导图内容如下: 一、什么是设备树 设备树可以用一个图来进…

HJ61 放苹果

题目&#xff1a; HJ61 放苹果 题解&#xff1a;递归 f(m,n)表示将m个苹果放在n个盘子中所有的放法。 当n > m时&#xff0c;一定有盘子空着&#xff0c;等效于将m个苹果放到m个盘子中&#xff0c;即f(m,n) f(m,m)当 n < m时&#xff0c; 没有空盘子&#xff0c;那么…

LinkedList 源码分析

LinkedList 是一个基于双向链表实现的集合类。 LinkedList 插入和删除元素的时间复杂度 头部插入/删除&#xff1a;只需要修改头结点的指针即可完成插入/删除操作&#xff0c;因此时间复杂度为 O(1)。尾部插入/删除&#xff1a;只需要修改尾结点的指针即可完成插入/删除操作…

【玩玩Vue】通过vue-store实现枚举管理,用于下拉选项和中英文翻译等

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、store基础用法1.在src下新建store文件夹&#xff0c;在store下新建module文件夹2.在module下新建enums.js文件3.在store下新建getters.js…

Mybatis学习笔记3 在Web中应用Mybatis

Mybatis学习笔记2 增删改查及核心配置文件详解_biubiubiu0706的博客-CSDN博客 技术栈:HTMLServletMybatis 学习目标: 掌握mybatis在web应用中如何使用 Mybatis三大对对象的作用域和生命周期 关于Mybatis中三大对象的作用域和生命周期、 官网说明 ThreadLocal原理及使用 巩…

【古诗文网登录】

文章目录 古诗文网简介python登录 古诗文网简介 古诗文网登录界面 模拟登录两大难点 __VIEWSTATE、__VIEWSTATEGENERATOR两个动态参数验证码 python登录 1、解析登录界面&#xff0c;获取__VIEWSTATE、__VIEWSTATEGENERATOR参数2、获取登陆界面验证码图片&#xff0c;输入…

爬虫 — 自动化爬虫 Selenium

目录 一、介绍二、对比三、安装四、简单使用五、定位元素1、By.ID2、By.CLASS_NAME3、By.NAME4、By.TAG_NAM5、By.XPATH 六、操作元素1、在输入框输入内容并搜索2、打开网站搜索音乐并播放 七、Cookie 操作1、获取所有的 Cookie2、根据 Cookie 的 name 获取 Cookie3、删除某个 …

《低代码指南》——低代码+AI,驱动企业数字资产保值增值

各位嘉宾,大家上午好!非常荣幸能借助钛媒体数字价值峰会这个平台跟大家交流。 了解奥哲的朋友知道,奥哲是国内第一家官宣聚焦低代码领域,并且以低代码定位获得融资的数字化企业。 过去两三年,低代码得到了飞速发展,我在此想跟各位分享下我们在过去实践过程中的一些发现,…

Java“牵手”速卖通商品列表页数据采集+速卖通商品价格数据排序,速卖通API接口申请指南

速卖通是阿里巴巴旗下的面向国际市场打造的跨境电商平台&#xff0c;被称为国际版淘宝&#xff0c;速卖通面向海外买家客户&#xff0c;通过支付宝国际账户进行担保交易&#xff0c;并使用国际物流渠道运输发货&#xff0c;是全球第三大英文在线购物网站。 速卖通商品列表数据…

【资源监视器】设备占用,强制弹出移动硬盘

设备占用&#xff0c;强制弹出移动硬盘 任务管理器中找到资源监视器 资源监视器&#xff1a;找到CPU 输入磁盘&#xff1a;如H: , 点击旁边的刷新 结束句柄 右键

CorelDRAW 2023怎么把图片转化为手绘素描风 简单几步轻松搞定

CorelDRAW 2023是一款非常好用的设计类软件&#xff0c;软件拥有非常多强大又好用的功能&#xff0c;可以帮助设计师快速创造出想要的效果&#xff0c;今天我们就来给大家介绍一下CDR的“素描”艺术笔触。它可以帮助用户快速将普通的图片快速转换成类似素描的风格&#xff0c;在…

AMD GPU 内核驱动分析(二)-gpu_sched

AMDGPU驱动模块的依赖关系如下图,gpu_sched.ko位于GPU驱动架构的中间层&#xff0c;主要负责对应用发送下来的渲染和计算等命令进行调度&#xff1a; 编译gpu_sched.ko 模块源码位于linux-x.x.xx/drivers/gpu/drm/scheduler下&#xff0c;通过CONFIG_DRM_SCHED项配置编译。从M…

更新至2021年,互联网相关指标数据

更新至2021年&#xff0c;互联网相关指标数据 1、来源&#xff1a;国家统计J和各省NJ 2、指标&#xff1a;域名数、网站数、网页数、互联网宽带接入端口、互联网宽带接入用户、城市宽带接入用户、移动互联网用户、移动互联网接入流量、联网上网人数 3、范围&#xff1a;31省…

四、日志编写 —— TinyWebServer

日志编写 —— TinyWebServer 一、 前言 上期已经写完lock类的编写。这期是日志的编写。 对于日志需要弄懂几个基本概念才可以更好的理解和编写日志。 什么是日志&#xff1f;常用的日志级别有哪些&#xff1f;日志的基本格式是什么&#xff1f;异步日志类刷新缓冲区的作用同…

虚幻4学习笔记(12)操控导入的角色、动画蓝图、播放蒙太奇和打包、角色重定向

虚幻4学习笔记 操控导入的角色设置鼠标旋转关掉动态模糊 动画蓝图、播放蒙太奇和打包角色走路奔跑动画shift 奔跑F 跳舞移动打断 跳舞 打包角色重定向姿势调整解决跑步 腿分太开隐藏剑 B站UP谌嘉诚课程&#xff1a;https://www.bilibili.com/video/BV164411Y732 操控导入的角色…