数据结构的复杂度

2023-11-18

数据结构的复杂度

在介绍复杂度之前我们现分享一个名词叫算法效率

算法效率:算法效率是指算法执行的时间,算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。

算法效率也分为两种: 一种是时间效率,一种是空间效率,也被称为时间复杂度空间复杂度

时间复杂度主要衡量的是一个算法的运行速度

空间复杂度主要衡量一个算法所需要的额外空间。(随着科学技术的发展现在的空间复杂度已经显得不这么重要了,我们现在一般更注重运行速度)

时间复杂度不计算时间,计算大概的运算次数。
空间复杂度不计算空间,计算大概定义的变量个数。

1.时间复杂度定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间. 一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度.

首先我们来看一段代码:

Func1执行的基本操作次数: F(N) = N^2 + 2*N + 10

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法

大O符号:是用于描述函数渐进行为的数学符号。

那我如何推导大O阶方法那?
基于一下三个规则
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶。

再举几个例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,这几个简单的例子都是基于以上三个规则所计算出的时间复杂度。

但是,如果我写的一个代码是一个数组,我需要在里面查找出一个数字,最好的情况就是一下子查找到,最坏的情况就是最后一个才找到,还有在中间找到的情况,循环的次数不确定怎么办?

这是我们遵循最坏运行情况:若最坏需要检索N次,则此时的时间复杂度就为O(N)

基于上面的理论,我们再来看一下耳熟能详的冒泡排序

在这里插入图片描述
实际上,我们所说的时间复杂度就是代码的运行次数。

那好,根据冒泡排序的逻辑:从第一个数字开始,和第二个数字比较,若第二个数字大于第一个数字,则交换两个数字的位置,以此类推。但我们在写代码的时候的逻辑是一趟一趟的进行循环,先交换完第一趟,然后再折返回来进行第二趟的比较交换。

我们可以知道准确的时间复杂度为:F(N) = n-1 + n-2 + … + 2 + 1,即:1到n-1的等差数列求和。用大O渐进法表示也就是O(N^2)

但实际上我们真的需要排序这么多次吗?

可以看到代码中有一个exchange,我们把它称作Flag,只有在判断if条件语句成立的时候才会将exchange置为1,否则就跳出了循环,并执行了下面的break语句。

可见,我们上面计算的时间复杂度O(N^2)是最坏的结果,而最好的结果只需要排序一次足矣,即O(N),但我们依然取最坏的结果为公认的时间复杂度。

下面,再给出几个代码,有兴趣的同学可以自己尝试下算算这几个代码的时间复杂度。

1.二分查找

2.阶乘递归

在这里插入图片描述

3.斐波那契递归

在这里插入图片描述

算过之后,是不是发现,如果仅仅依靠代码来计算时间复杂度,往往是不切实际的。

所以我们真正要做到的是根据代码的逻辑思想和所要表达出的意思,来计算时间复杂度。

下面揭晓答案:三个代码的时间复杂度分别为O(logN),O(N)O(2^N)

2.空间复杂度定义:
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没有太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法

还是那个冒泡排序:

计算一下它的空间复杂度

在这里插入图片描述
它定义的变量有:a,n,end,exchange,i五个变量

所以他的空间复杂度为O(1),为常数个变量

再看一个:

在这里插入图片描述
空间复杂度为O(N)。

以上就是全部内容了,有错误或者问题欢迎随时补充和提问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构的复杂度 的相关文章

随机推荐

  • 太好用了!Linux 服务器上必备的 4 个开源工具

    关注后回复 进群 拉你进程序员交流群 来自 开源最前线 今天和大家分享 4 个可以在 Linux 上运行的开源服务器 1 Samba Samba 是种自由软件 用来让 UNIX 系列的操作系统与微软 Windows 操作系统的 SMB CI
  • 响应式布局之REM

    REM是实现响应式布局的方案之一 除了REM之外 还有VM REM VM 今天主要来记录一下REM的实操 一 安装插件 npm install lib flexible npm install postcss plugin px2rem D
  • 第36章_瑞萨MCU零基础入门系列教程之步进电机控制实验

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do
  • 史上最详细的快速排序算法

    史上最详细的快速排序算法 最近学了快速排序算法 在csdn上找了很多篇博客 虽然代码可以执行正确 但是解释却有点 官方 有很多细节 很多需要注意的地方并没有写到 故此 我写了这篇博客 看了我这篇博客 你绝对会恍然大悟 先给大家看看清楚明了的
  • 谁说不同品牌内存无法兼容-关键调整频率和内存时序

    高手绕道 菜鸟文 当时2018年买了两根光威DDR4 8G 3000的灯条 2019年手欠又买了两根威刚DDR4 8G 3000的黄金马甲条 两组内存条都是京东上买的 当时买完两组之后插上就看看电影 跑跑虚拟机看看网页没发现啥问题 结果过了
  • 力扣题---二叉树前、中、后序遍历

    二叉树前序遍历 我们先来了解题目 输入 root 1 null 2 3 输出 1 2 3 示例 2 输入 root 输出 示例 3 输入 root 1 输出 1 从示例不难看出 题目给定树的根结点 用前序遍历的方式 把二叉树的值放入数组中
  • 言情小说通用情节[转]

    第一部分 典型开篇 一 好美好神秘的人哦 一件惊艳加钟情 眼珠掉地上滚三圈 于是非君莫娶 嫁 死缠烂打 看欧的牛皮糖超级粘人功 二 你由于某些原因 比如漂亮可爱的外表 突如其来的爆炸 或者地上一块可怜的香蕉皮 而陷入危机的时候 那勇敢的 阿
  • Java操作Excel文件

    创建一个Excel文件 public static void creatExcelFile String filepath Workbook wb new XSSFWorkbook try FileOutputStream fileOut
  • Telink BLE MESH开发

    一 前言 官网资料介绍建议采用DMA传输 串口数据的接收是放到了fifo中 但是串口发送也是采用的DMA 问题在于串口发送并没有建立缓冲器 而是判断当前DMA是否忙 如果忙数据直接丢弃 这样做显然不合理 如果发送时DMA忙应该将数据放到缓冲
  • vscode连接远程Linux服务器失败

    vscode连接远程Linux服务器失败 文章目录 vscode连接远程Linux服务器失败 解决连接失败 设置密钥免密登录 解决连接失败 问题 vscode会不断的提示你去输入密码 然后一直retry 还是失败 但是使用其它远程连接工具比
  • IMX6ULL_Pro开发板基本操作(韦东山学习笔记)

    NAT网卡 桥接网卡 配置桥接网卡 驱动 为什么编译驱动程序之前要先编译内核 1 配置编译 内核 设备树 其他驱动程序 2 放到板子上 3 编译 测试第1个驱动 IMX6ULL Pro烧写系统
  • 公司重用我独立负责一个核心系统,我该怎么设计系统的高可用架构?

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 业务场景引入 业务系统消息同步丢失 计费业务系统的计费问题 计费业务数据补偿系统设计 背景 今天给大家分享一个话题 就是对于线上跟钱有关的计费类的系统 在线上可
  • 秒杀抢购思路以及高并发下数据安全

    转载地址 https my oschina net wangjie404 blog 815455 我们通常衡量一个Web系统的吞吐率的指标是QPS Query Per Second 每秒处理请求数 解决每秒数万次的高并发场景 这个指标非常关
  • 6招玩转 Appium 自动化测试

    Appium是个什么鬼 Appium是一个移动端的自动化框架 可用于测试原生应用 移动网页应用和混合型应用 且是跨平台的 可用于IOS和Android以及firefox的操作系统 原生的应用是指用android或ios的sdk编写的应用 移
  • C++继承、构造函数和析构函数

    构造函数 与 析构函数 构造函数代表一个对象的生成 主要作用是初始化类的成员变量 可以被重载 如果没有显式构造函数 则实例化对象时 系统会自动生成一个无参的构造函数 构造函数的名称与类名相同 析构函数代表的是一个对象的销毁 不可以被重载 析
  • BFD库

    BFD库 2011 01 16 11 16 22 分类 LINUX 什么是 BFD Binary format descriptor 即二进制文件格式描述符 它是连接工具 ld 和二进制文件操作工具 bin util 实现对于目标文件操作的
  • 手机设置无密码时显示“已被管理员、加密政策或凭据存储停用”的解决办法

    前段时间手机上为了抓包安装了SSL证书 并且设置了锁屏密码 后来觉得锁屏密码很麻烦就想着关掉锁屏密码 发现无密码选项是灰色的 并且提示 已被管理员 加密政策或凭据存储停用 如下图 网上百度大多数办法就是 设置 gt 安全 gt 删除凭证 然
  • 华为手机一键刷新在哪里_华为一小步,国产系统一大步,鸿蒙OS2.0手机系统低调发布...

    12月16日上午 华为如约低调发布了鸿蒙OS 2 0的手机开发者Beta版 从发布会上展示的鸿蒙OS 2 0界面来看 似乎就是EMUI 11的翻版 华为鸿蒙OS避免了以前失败的手机系统没有生态的问题 采用了兼容安卓生态的策略 全面兼容安卓应
  • element ui 实现动态表单

    实现具体功能 对表单进行新增 删除以及验证每一个表单的字段 实现效果如图 1 实现表单的添加和删除 新增 addForm index this refs form validate valid gt if valid alert submi
  • 数据结构的复杂度

    数据结构的复杂度 在介绍复杂度之前我们现分享一个名词叫算法效率 算法效率 算法效率是指算法执行的时间 算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量 算法效率也分为两种 一种是时间效率 一种是空间效率 也被称为时间