算法中的复杂度(先做个铺垫)

文章目录

  • 定义与分类
  • 时间复杂度
    • 概念
    • 大O的渐进表示法
    • 举例
    • 情况
    • 注意
    • 内涵
  • 空间复杂度
  • 最优解

定义与分类

复杂度:衡量算法效率的标准
时间效率:衡量这个算法的运行速度,也就是我们常说的时间复杂度
空间效率:衡量这个算法所需要的额外空间,也就是我们常说的空间复杂度

时间复杂度

概念

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

大O的渐进表示法

一般我们用大O的渐进法来表示时间复杂度,并给出了一个问题的规模,这个规模我们统称为N
推导方法

  1. 用常数1取代运行时间中的所有加法函数
  2. 在修改后的运行次数函数中,只保留最高阶限
  3. 如果最高阶存在且不是1,去掉最高项的系数

得到的结果就是大O阶
简单的说时间复杂度就是一个和数据量有关,只要高阶项,不要低阶项,不要常数项的操作次数表达式

举例

1.选择排序

public void selectSort(){int[] arr = {1,5,9,6,3};for (int i = 0; i < arr.length -1; i++) {for (int j = i; j < arr.length -1; j++) {if (arr[i] >arr[j+1]){int temp = arr[i];arr[i] = arr[j+1];arr[j+1] = temp;}}}
}

第一次:索引从0到N-1过一遍选出最小值,循环次数为N
第二次:索引从1到N-1过一遍选出最小值,循环次数为N-1
第三次:索引从2到N-1过一遍选出最小值,循环次数为N-2
依次类推…
第N次:索引从N-1到N-1过一遍选出最小值,循环次数为1
循环次数为(N+N-1+N-2+…+1),为等差数列
我们知道等差数列最后的结果为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
根据推导方法我们得出选择排序的时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2.插入排序
这里插入一个知识点:严格固定流程的算法,一定强调最差情况!
插入排序中,被进行排序的数组可以是有序数组,也可以是无序数组。
有序数组中,数组插入一次,进行比大小,不需要换位置,所以最后的时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传;在无序数组中,可以是随机无序,最坏的情况就是一个降序数组,但是你需要一个升序的数组,数组插入一次,就要与前面交换位置,前面几个元素就要交换几次,时间复杂度为1+2+3+…+N为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传,那最后插入排序的时间复杂度到极为多少呢?
遇到这种情况,因为插入排序的代码是固定的,所以称为固定流程的算法,我们要用最差情况来计算时间复杂度,所以插入排序的时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

情况

  1. 算法流程上利用随机行为作为重要部分的,要看平均或者期望的时间复杂度,因为最差的时间复杂度无意义(生成相邻值不同的数组)
  2. 时间复杂度的均摊,(动态数组,N个数的时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传,那么一个数的时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传)

注意

  1. 不要用代码结构来判断时间复杂度,比如只有一个while循环的冒泡排序,时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  2. 不要用代码结构来判断时间复杂度,比如N/1+N/2+…+N/N,这个流程的时间复杂度为外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传调和级数
  3. 时间复杂度只能是对算法流程充分理解才能分析出来的,而不是简单的看代码结构!
  4. 时间复杂度很重要,可以直接判断某个方法能不能通过一个题目,根据数据量猜解法

内涵

描述算法运行时间和数据量的关系,而且当数据量很大很大时,关系相当的本质,排除了常熟时间的干扰

空间复杂度

实现该算法所需的额外空间

最优解

先满足时间复杂度最优,然后尽量少用空间的解

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

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

相关文章

分布式结构化数据表Bigtable

文章目录 设计动机与目标数据模型行列时间戳 系统架构主服务器Chubby作用子表服务器SSTable结构子表实际组成子表地址组成子表数据存储及读/写操作数据压缩 性能优化局部性群组&#xff08;Locality groups&#xff09;压缩布隆过滤器 Bigtable是Google开发的基于GFS和Chubby的…

云计算:Linux 部署 OVN 集群

目录 一、实验 1.环境 2.Linux 部署 OVN 集群&#xff08;中心端&#xff09; 3.Linux 部署 OVN 集群&#xff08;业务端1&#xff09; 4.Linux 部署 OVN 集群&#xff08;业务端2&#xff09; 4.OVN 中心端 连接数据库 5.OVN 业务端1 加⼊控制器 6.OVN 业务端2 加⼊控…

强大的压缩和解压缩工具 Keka for Mac

Keka for Mac是一款功能强大的压缩和解压缩工具&#xff0c;专为Mac用户设计。它支持多种压缩格式&#xff0c;包括7z、Zip、Tar、Gzip和Bzip2等&#xff0c;无论是发送电子邮件、备份文件还是节省磁盘空间&#xff0c;Keka都能轻松满足用户需求。 这款软件的操作简单直观&…

Tesserocr 的安装步骤

Tesserocr 的安装 OCR&#xff0c;即 Optical Character Recognition&#xff0c;光学字符识别。是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。那么对于图形验证码来说&#xff0c;它都是一些不规则的字符&#xff0c;但是这些字符确实是由字符稍加扭…

数据结构与算法——20.B-树

这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前&#xff0c;我们回顾一下我们学的树。 首先是二叉树&#xff0c;这个不用多说&#xff…

Linux的文件操作中的静态库的制作

Linux操作系统支持的函数库分为&#xff1a; 静态库&#xff0c;libxxx.a&#xff0c;在编译时就将库编译进可执行程序中。 优点&#xff1a;程序的运行环境中不需要外部的函数库。 缺点&#xff1a;可执行程序大 &#xff08;因为需要 编译&#xff09; 动态库&#xff0c…

Spring Cloud学习笔记:Eureka集群搭建样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、项目架构2、Dependency3、项目启动类4、application.yml5、启动项目 1、项目架构 因为这是单机模拟集群搭建&#xff0c;为了方便管理就都放在了一个项目中。这次准备搭建三个项目server1, server2, server3 …

常见的垃圾回收算法

文章目录 1. 标记清除算法2. 复制算法3. 标记整理算法4. 分代垃圾回收算法 1. 标记清除算法 核心思想&#xff1a; 标记阶段&#xff0c;将所有存活的对象进行标记。Java中使用可达性分析算法&#xff0c;从GC Root开始通过引用链遍历出所有存活对象。清除阶段&#xff0c;从…

webrtc中的Track,MediaChannel,MediaStream

文章目录 Track,MediaChannel,MediaStream的关系MediaStream的创建流程创建VideoChannel的堆栈创建VideoStream的堆栈 sdp中媒体参数信息的映射sdp中媒体信息参数设置体系参数设置流程参数映射体系 Track,MediaChannel,MediaStream的关系 Audio/Video track&#xff0c;MediaC…

[每周一更]-第93期:探索大型生成式聊天工具:从ChatGPT到未来

随着人工智能技术的不断进步&#xff0c;生成式聊天工具正逐渐成为人们日常生活中的一部分。这些工具利用深度学习技术和大规模语言模型的强大能力&#xff0c;能够与用户进行自然、流畅的对话&#xff0c;为我们提供了更加智能和个性化的交流体验。 ChatGPT&#xff1a;开启生…

基于RT-Thread(RTT)的BMP280气压计驱动(I2C通信)

前言 本文基于RTT操作系统使用STM32F401RET6驱动BMP280气压计模块&#xff0c;使用I2C协议通信 一、新建工程 二、添加软件包 三、添加这个包 四、打开CubeMX 五、配置时钟源&#xff0c;使用外部晶振 六、配置串行下载口 七、打开I2C&#xff0c;我这里使用的是I2C2&#x…

LabVIEW直流稳定电源自动化校准系统

LabVIEW直流稳定电源自动化校准系统 直流稳定电源正向着智能化、高精度、多通道、宽量程的方向发展。基于LabVIEW开发环境&#xff0c;设计并实现了一种直流稳定电源自动化校准系统&#xff0c;以提升校准过程的整体效能&#xff0c;实现自动化设备替代人工进行电源校准工作。…

【opencv】示例-stiching.cpp 图像拼接

#include "opencv2/imgcodecs.hpp" // 导入opencv图像编码功能库 #include "opencv2/highgui.hpp" // 导入opencv高层用户界面功能库 #include "opencv2/stitching.hpp" // 导入opencv图像拼接功能库#include <iostream> // 导入输入输出…

PyQt5

Qt是基于C实现的GUI,而PyQt就是用python调用Qt. PyQt中有很多的功能模块,开发最常用的模块功能主要有3个 1) QtCore:包含核心的非GHI的功能,主要和时间,文件与文件夹,各种数据,流,URLs,进程与线程一起使用 2) QtGUi:包含窗口系统,事件处理,2D图像,基本绘画,字体和文字类 3)…

详解构造函数

前言 希望这篇文章是有意义的&#xff0c;能够帮助初学者理清构造函数的概念&#xff0c;关系及误区。首先定义一个日期类&#xff0c;借助日期类讲解构造函数。 class Date {public:void Init(int year, int month, int day) //初始化数据的方法{_year year;_month month…

Ubuntu快捷安装MySQL

更新包列表 sudo apt update 安装mysql sudo apt install mysql-server 启动mysql // 启动mysql sudo service mysql start// 关闭mysql sudo service mysql stop// 重启mysql sudo service mysql restart 连接mysql // 初始安装无密码&#xff0c;直接连接即可&#xf…

【opencv】示例-train_HOG.cpp 训练和测试基于支持向量机(SVM)的行人检测器

#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理头文件 #include "opencv2/highgui.hpp" // 包含OpenCV高层GUI&#xff08;图形用户界面&#xff09;头文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块头文件 #includ…

数据结构初阶:二叉树(二)

二叉树链式结构的实现 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在对二叉树结构掌握还不够深入&#xff0c;为了降低学习成本&#xff0c;此处手动快速创建一棵简单的二叉树&#xff0c;快速进入二…

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue Blueprint(user, __name__)# 首页 可以写两个路由&#xff0c;都是访问同一个函数 blue.route(/) b…

【数据结构】泛型(分享重点)

什么是泛型&#xff1f; 泛型就是适用于许多许多类型&#xff0c;对类型参数化。 怎么创建一个泛型呢 class 泛型类名称<类型形参列表> { // 这里可以使用类型参数 } class ClassName<T1, T2, ..., Tn> { } class 泛型类名称<类型形参列表> extends 继承类…