数据结构·复杂度讲解

1. 什么是数据结构

        数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

        数据结构是用来在内存中管理数据的,类似的,我们熟悉的文件或数据库是在硬盘中管理数据的。内存中的数据是带点存储的,内存大小一般较小(8G/16G),而硬盘中的数据是不带电存储的,大小一般(512G\1T)。带电存储就是用电信号保存数据,如果突然我们的计算机断电了,那内存中的数据就都没了。

        带电存储和不带电存储算是相辅相成的关系,内存中的数据处理好了之后,就会存到硬盘上,防止断电后丢失。

2. 算法的复杂度

        算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

        时间复杂度主要用来衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。随着如今硬件的迭代升级,内存越来越大,现在我们已经不太关注空间复杂度了。

3. 时间复杂度

3.1 时间复杂度的概念

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

        那么我们现在判断一下下面这段代码的时间复杂度

        

        首先是两层循环嵌套:F(N) = N^2

        然后是2*N次的循环:F(N) = 2 * N

        最后是10次循环:F(N) = 10

        把他们都加在一起最终结果就是:F(N) = N^2 + 2*N + 10

        但是实际上,我们并不需要把时间复杂度计算的那么精准,只需要知道大概执行次数,所以这里引进了大O的渐进表示法

3.2 大O的渐进表示法

        推导大O阶方法:

        1. 用常数1替代运行时间中所有加法常数

        2. 在修改后的运行次数函数中,只保留最高阶项

        3. 如果最高阶项存在且不为1,则去除与这个项相乘的常数

        上一道题用大O的渐进表示法的结果就是O(N^2)

        其实说白了,这个方法的核心就是去估计最差的预期的数量级有多大

3.3 例题

3.3.1 冒泡排序的时间复杂度

                

        冒泡排序的遍历 (N - 1) + (N - 2) +···+ 3 + 2 + 1 次

        很明显这是个等差数列,头加尾除二,最后结果就是 O(N^2)

3.3.2 二分查找的时间复杂度

        二分查找最开始查找区间长度是N,找一次缩小一半,就是除2,最坏的情况就是最后区间长度缩小为1,或者为-1(没找到)。

        那么除多少个2就相当于找了多少次,我们假设除了x个2

        N /2 /2 /2······/2 == 1        两边同时成 2^x

        N == 2^x

        x == \log_{2}N

        所以最后二分查找的时间复杂度就是 O(\log_{2}N),因为这个对数不好写出来,所以有时候也会简写成 O(logN) ,大家看到这种写法的时候要注意识别。如果不是以2为底的话就不能简写了

3.3.3 计算阶乘的时间复杂度(简单阶乘)

                

        我们分析一下,递出去的时候要走N-1次到头,归回来也要走N-1次,然后最后返回数值走1次,所以说精细算的话一共走2N-1次,时间复杂度为O(N)

4. 空间复杂度

        空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间的大小的量度。

        空间复杂度不是程序占用了多少Byte的空间,而是计算同一时间新开辟变量最多时的新变量个数,如果没有新开辟变量也是是O(1),因为空间是可以重复利用的。

        空间复杂度计算规则和时间复杂度类似,也使用大O渐进表示法

        其实空间复杂度和时间复杂度的判断都有一种感性的感觉,我们要去思考这个算法的思路是什么,而不是死磕代码里有几个for循环什么的

        

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

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

相关文章

鸿蒙开发系列教程(十五)--gesture 手势事件

gesture 手势事件 手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式。手势操作可以包括点击、滑动、双击、捏合等动作,用于实现不同的功能和操作。 gesture 常规手势 参考代码: Entry Component struct Test03 {build() {Column() {…

C++ map和set

1. 关联式容器 序列式容器:因为其底层为线性序列的数据结构,里面存储的是元素本身,比如:vector、list、deque 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对&#xff0…

【golang】24、go get 和 go mod:indrect 与 go mod tidy

文章目录 go get 会执行如下操作: 操作 go.mod 文件(add、update、remove)下载依赖到 $GOPATH/pkg/mod 中若已安装,则更新该包,到最新版本 试验前置准备:首先删除已下载的依赖,rm -rf $GOPATH…

STM32——LCD(1)认识

目录 一、初识LCD 1. LCD介绍 2. 像素 3. LED和OLED显示器 4. 显示器的基本参数 (1)像素 (2)分辨率 (3)色彩深度 (4)显示器尺寸 (5)点距 二、液晶…

[word] word大小写快捷键是什么? #知识分享#学习方法#笔记

word大小写快捷键是什么? word转换大小写的快捷方式是按“ShiftF3”。设置方法如下: 1、在电脑桌面找到需要转换大小写的文档,右键单击打开它。 2、打开文档之后,在文档里面选中需要转换的段落。 3、选中了之后在键盘里面找到“…

【已解决】onnx转换为rknn置信度大于1,图像出现乱框问题解决

前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx,再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1,并且图像乱框问题…

Python操作Word表格对齐、单元格对齐

通过Table的alignment可以设置表格居左对齐、居中对齐、居右对齐。通过Cell的vertical_alignment可以设置垂直位置。通过单元格里段落的alignment可以设置文本的左右对齐方式。 import docx from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT from…

李宏毅LLM——大模型+大资料的神奇力量

文章目录 大模型的重要性顿悟时刻 大资料的重要性数据预处理不一样的做法:KNN LM 对应视频P12-P14 大模型的重要性 模型参数和数据集越大,文字接龙的错误率越低 顿悟时刻 当模型超过10B-20B时,会突然顿悟 启示:不能只看最终结…

软件定义网络 SDN 简介、OpenFlow

目录 软件定义网络 SDN 简介 1 SDN 与 协议 OpenFlow 1.1 SDN 1.2 OpenFlow 1.2.1 协议 OpenFlow 1.2.2 OpenFlow 数据层面 (1)匹配 动作 (2)流表 1.流表由远程控制器管理 2.流表结构 2 SDN 体系结构 3 SDN 控制器 软…

机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧

文章目录 1.K-近邻算法思想2.K-近邻算法(KNN)概念3.电影类型分析4.KNN算法流程总结5.k近邻算法api初步使用机器学习库scikit-learn1 Scikit-learn工具介绍2.安装3.Scikit-learn包含的内容4.K-近邻算法API5.案例5.1 步骤分析5.2 代码过程 1.K-近邻算法思想 假如你有一天来到北京…

【 buuctf-后门查杀】

采用 D 盾进行扫描查杀 有一个级别为 5 的扫描结果,记事本打开,即为 flag

【保姆级教程|YOLOv8改进】【6】快速涨点,SPD-Conv助力低分辨率与小目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

Python进阶--爬取下载人生格言(基于格言网的Python3爬虫)

目录 一、此处需要安装第三方库: 二、抓包分析及Python代码 1、打开人生格言网(人生格言-人生格言大全_格言网)进行抓包分析 2、请求模块的代码 3、抓包分析人生格言界面 4、获取各种类型的人生格言链接 5、获取下一页的链接 6、获取人生格言的…

最新话费充值系统源码,附带系统安装教程

搭建教程 亲测环境:PHP7.0MySQL5.6 PHP扩展安装:sg11 数据库配置文件路径:/config/database.php 伪静态设置为thinkphp 后台地址:/admin 账号密码:admin/123456

SpringBoot源码解读与原理分析(八)ApplicationContext

文章目录 3.1.2 ApplicationContext3.1.2.1 ApplicationContext根接口3.1.2.2 ConfigurableApplicationContext3.1.2.3 EnvironmentCapable3.1.2.4 MessageSource3.1.2.5 ApplicationEventPublisher3.1.2.6 ResourcePatternResolver3.1.2.7 AbstractApplicationContext3.1.2.8 …

当我们一起走过 2023|Apache Doris 年度时刻盘点

2024 年的第一个月已经彻底过去,2023 年的回顾总结才姗姗来迟。 在过去一年的大多数时间里,我们一直处于忙碌的状态中,紧锣密鼓的代码研发、高速推进的版本迭代、行程紧密的全国之行,众多社区用户与开发者皆是见证。 越是忙碌&a…

Yearning审核平台本地安装配置并结合内网穿透实现远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…

vector类的模拟实现

实现基本的vector框架 参考的是STL的一些源码&#xff0c;实现的vector也是看起来像是一个简略版的&#xff0c;但是看完能对vector这个类一些接口函数更好的认识。 我们写写成员变量&#xff0c;先来看看STL的成元变量是那些 namespace tjl {template<class T>class …

【C语言|数据结构】数据结构顺序表

目录 一、数据结构 1.1概念 1.2总结 1.3为什么需要数据结构&#xff1f; 二、顺序表 1.顺序表的概念及结构 1.1线性表 2.顺序表分类 2.1顺序表和数组的区别 2.2顺序表的分类 2.2.1静态顺序表 2.2.1.1概念 2.2.1.2缺陷 2.2.2动态顺序表 三、动态顺序表的实现 3.1新…

Pandas文本数据处理技术指南—从查找到时间序列分析【第66篇—python:文本数据处理】

文章目录 Pandas文本数据处理技术指南引言 1. 查找文本数据2. 替换文本数据3. 拼接文本数据4. 正则表达式操作5. 虚拟变量6. 处理缺失值7. 分割文本数据8. 字符串处理方法9. 文本数据的合并与连接10. 文本数据的排序11. 文本数据的统计分析12. 文本数据的分组与聚合13. 文本数据…