当前位置: 首页 > news >正文

深入理解算法的时间复杂度

文章目录

    • 时间复杂度的定义
    • 时间复杂度的分类
    • 时间复杂度分析
    • 常见数据结构和算法的时间复杂度
      • 常见数据结构
      • 常见算法
    • 常见排序算法说明
      • 冒泡排序(Bubble Sort)
      • 快速排序(Quick Sort)
      • 归并排序(Merge Sort)
      • 堆排序(Heap Sort)

时间复杂度的定义

时间复杂度就是一种用来描述算法在输入规模增长时所需执行时间的度量,即描述算法运行时间随问题规模增加而增长的速度,它是对算法执行时间的上界估计,通常通过O符号表示。时间复杂度描述了算法的效率和执行速度,可以用来对比不同算法的性能。

备注:
1.时间复杂度描述的是算法在最坏情况下的运行时间。这是因为最坏情况下的时间复杂度是对算法性能的上界估计,能够保证算法在任何情况下都能在该时间范围内完成。
2.在实际的算法分析中,通常还考虑最好情况和平均情况下的时间复杂度。最好情况是指在最理想的输入情况下的时间复杂度,平均情况是对所有可能输入情况下的平均时间复杂度的估计。

时间复杂度的分类

时间复杂度粗略的分为两类: 多项式量级和非多项式量级
非多项式量级只有两个
O ( 2 n ) 和 O ( n ! ) O(2^n) 和 O(n!) O(2n)O(n!)

非多项式量级算法的执行时间会随着输入规模的增加急剧增长,是非常低效的算法。
多项式量级的复杂度常见的并不多,从低阶到高阶有(越高阶的时间复杂度,执行效率越低):

O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)

对应的曲线图如下图所示:
在这里插入图片描述

时间复杂度分析

1.我们在分析一个算法、一段代码的时间复杂度的时候,只需关注循环执行次数最多的那一段代码就可以了,它就代表着这个算法的时间复杂度。
2.加法法则:多个算法顺序追加使用的时候,总复杂度等于量级最大的那段代码的复杂度
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

常见数据结构和算法的时间复杂度

常见数据结构

1.数组(Array)

  • 索引访问: O(1)
  • 查找: O(n)
  • 插入/删除(末尾): O(1)
  • 插入/删除(中间或开头): O(n)

2.链表(Linked List)

  • 访问: O(n)
  • 查找: O(n)
  • 插入/删除(在头部进行): O(1)
  • 插入/删除(在中间或末尾进行): O(1)(如果已知位置),O(n)(如果需要搜索位置)

3.栈(Stack)

  • 插入/删除(在顶部): O(1)
  • 访问,查找: O(n)

4.队列(Queue)

  • 插入/删除(在头部或尾部进行): O(1)
  • 访问: O(n)

5.哈希表(Hash Table):

  • 插入/删除/访问(平均情况): O(1)
  • 最坏情况下可能是O(n),取决于哈希冲突的数量

常见算法

1.线性搜索

  • 时间复杂度:O(n)

2.二分查找

  • 时间复杂度:O(logn)

3.冒泡排序

  • 平均情况和最坏情况: O(n^2)

4.快速排序(Quick Sort)

  • 平均情况: O(nlogn)
  • 最坏情况: O(n^2)

5.归并排序(Merge Sort)

  • 最好情况、平均情况和最坏情况: O(nlogn)

6.堆排序(Heap Sort)

  • 平均情况和最坏情况: O(nlogn)

常见排序算法说明

注: 排序算法的稳定性是指在排序过程中,具有相等键值的元素在排序后的结果中,相对顺序保持不变的性质。稳定性是排序算法中一个重要的性质,因为在某些应用场景中,我们希望保持相等元素的相对顺序不变。稳定性的好处是可以确保排序算法在特定情况下的正确性,特别是在应对某些有依赖顺序的问题时。但是,并不是所有的排序算法都是稳定的,一些排序算法可能会改变具有相等键值的元素的相对顺序。因此,在选择排序算法时,需要根据具体的应用场景考虑排序算法的稳定性需求。

冒泡排序(Bubble Sort)

原理: 冒泡排序通过多次遍历数组,比较相邻元素的大小并交换位置,直到排序完毕。每一次遍历都会将最大的元素"冒泡"到末尾。
特点: 冒泡排序是一种比较简单的排序算法,实现起来容易理解,但效率较低。它的时间复杂度为O(n^2),适用于小规模的数据排序。
适合解决的问题:冒泡排序适合用于排序较小规模的数据,而不适合处理大规模的数据。

快速排序(Quick Sort)

原理: 快速排序是基于分治法的思想。它首先选择一个基准元素(通常是数组中的某个元素),然后将数组分割成两个子序列,其中一个子序列的元素都小于等于基准元素,另一个子序列的元素都大于等于基准元素。然后递归地对这两个子序列进行快速排序。
特点: 快速排序是一种基于比较的排序算法,它的平均时间复杂度为O(nlogn)。它具有原地排序和不稳定性的特点。
适合解决的问题:快速排序适用于大规模数据的排序,速度较快。它在实践中广泛应用于各种排序场景。

归并排序(Merge Sort)

原理: 归并排序也是基于分治法的思想。它将数组不断地分割成较小的子数组,然后将这些子数组逐个合并,直到排序完成。
特点: 归并排序的时间复杂度为O(nlogn),具有稳定性和可靠性的特点。它需要额外的空间来存储临时的中间结果数组。
适合解决的问题:归并排序适用于大规模数据的排序,稳定性和可靠性使其适用于需要保持相同元素顺序的场景。

堆排序(Heap Sort)

原理: 堆排序基于完全二叉堆结构。它将待排序的数组构建成一个最大堆(或最小堆),然后不断地从最大堆中取出堆顶元素并调整堆,直到所有元素有序。
特点: 堆排序的时间复杂度为O(nlogn),它是一种原地排序算法,不需要额外的空间。但堆排序不是稳定的排序算法。
适合解决的问题: 堆排序适用于大规模数据的排序,特别适用于需要只保留部分最大(或最小)元素的场景。它在优先队列和求TopK问题中有广泛应用。

这些排序算法在实际应用中都有各自的应用场景和限制,选择正确的排序算法取决于数据规模、稳定性要求、空间复杂度要求和性能需求等因素。
冒泡排序由于性能很差,在实际工程中应用较少。
在对速度和空间复杂度有要求但对稳定性没要求的时候排序算法选用快速排序;
对稳定性有要求,但是对空间复杂度没有要求的时候排序算法选用归并排序;
在只需要保留最大/最小元素的应用场景下选用堆排序。

相关文章:

深入理解算法的时间复杂度

文章目录 时间复杂度的定义时间复杂度的分类时间复杂度分析常见数据结构和算法的时间复杂度常见数据结构常见算法 常见排序算法说明冒泡排序(Bubble Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort) 时间复杂度的定义 时间复杂度就是一种用来描述算法在输入规…...

2023年度教育部人文社会科学研究一般项目评审结果,已公布!

【SciencePub学术】 9月15日&#xff0c;教育部社科司公示了2023年度教育部人文社会科学研究一般项目评审结果&#xff0c;共3482项。 其中&#xff0c;规划基金、青年基金、自筹经费项目共3029项通过专家评审&#xff1b;西部和边疆地区项目200项&#xff0c;新疆项目20项&a…...

十一、MySql的事务(上)

文章目录 一、引入&#xff08;一&#xff09;CURD不加控制&#xff0c;会有什么问题&#xff1f;&#xff08;二&#xff09;CURD满足什么属性&#xff0c;能解决上述问题&#xff1f; 二、什么是事务&#xff1f;三、事务的特性&#xff08;一&#xff09;原子性&#xff1a;…...

时间序列分析1--生成和导出时间序列数据

时间序列数据的生成 直接录入 1.行录入 ts.(price,startc(2015,1),frequency 12) # price为时间序列变量&#xff0c;start为起始读入时间 frequncy指定每年读入的数据的频率&#xff0c;frequncy4为季度数据、frequncy52为星期数据 2.列录入 scan() 1:101 ....6:7 7:…...

HarmonyOS应用开发—资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…...

C++中的转换构造函数

在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a = 6;a = 7.5 + a; 编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换…...

JSP ssm 特殊人群防走失系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 特殊人群防走失系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源 代码和数据库&#xff0c;系统主要…...

怎么实现一个登录时需要输入验证码的功能

今天给项目换了一个登录页面&#xff0c;而这个登录页面设计了验证码&#xff0c;于是想着把这个验证码功能实现一下吧。 这篇文章就如何实现登录时的验证码的验证功能结合代码进行详细地介绍&#xff0c;以及介绍功能实现的思路。 目录 页面效果 实现思路 生成验证码的控制…...

在android工程中新建Android模块报错

复制了复制正常的build.gradle文件&#xff0c;然后把theme里面的东西改成了下面这个样就好了 <resources xmlns:tools"http://schemas.android.com/tools"><!-- Base application theme. --><style name"Theme.JiQuan" parent"Theme…...

电脑桌面的复选框如何取消

电脑桌面图标的复选框如何取消 1. 概述2. 去掉图标的复选框方法结束语 1. 概述 当你拿到新的电脑开机后&#xff0c;发现桌面上软件应用的图标左上角有个小框&#xff0c;每次点击图标都会显示&#xff0c;并且点击图标时&#xff0c;小框还会打上√&#xff1b; 这个小框的…...

【Unity每日一记】资源加载相关和检测相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

文章目录 堆的概念性质图解 向上调整算法算法分析代码整体实现 向下调整算法算法分析整体代码实现 堆的接口实现初始化堆销毁堆插入元素删除元素打印元素判断是否为空取首元素实现堆 堆排序创建堆调整堆整合步骤 TopK问题 堆的概念 堆就是将一组数据所有元素按完全二叉树的顺序…...

DAQ高频量化平台:引领Ai高频量化交易模式变革

近年来&#xff0c;数字货币投资市场掀起了一股热潮&#xff0c;以&#xff08;BTC&#xff09;为代表的区块链技术带来了巨大的商业变革。数字资产的特点&#xff0c;如无国界、无阶级、无门槛、高流动性和高透明度&#xff0c;吸引了越来越多的人们的关注和认可&#xff0c;创…...

vue3 element plus获取el-cascader级联选择器选中的当前结点的label值 附vue2获取当前label

各位大佬&#xff0c;有时我们在处理级联选择组件数据时&#xff0c;不仅需要拿到id,还需要拿到label名称&#xff0c;但是通常组件直接绑定的是id,所以就需要我们用别的方法去拿到label,此处官方是有这个方法的&#xff0c;具体根据不同的element 版本进行分别处理。 VUE3 e…...

Spring Boot常见面试题

Spring Boot简介 Spring Boot 是由 Pivotal 团队提供&#xff0c;用来简化 Spring 应用创建、开发、部署的框架。它提供了丰富的Spring模块化支持&#xff0c;可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能&#xff0c;降低了复杂性&#xff0c;同…...

分块矩阵求逆

另可参考Block matrix on Wikipedia2018.4.3 补充补充两个参考文献&#xff0c;都是对工科很实用的矩阵手册&#xff1a;D. S. Bernstein, Matrix mathematics: Theory, facts, and formulas with application to linear systems theory. Princeton, NJ: Princeton University …...

Python 文件写入操作

视频版教程 Python3零基础7天入门实战视频教程 w模式是写入&#xff0c;通过write方法写入内容。 # 打开文件 模式w写入&#xff0c;文件不存在&#xff0c;则自动创建 f open("D:/测试3.txt", "w", encoding"UTF-8")# write写入操作 内容写入…...

【Spring Boot系列】- Spring Boot侦听器Listener

【Spring Boot系列】- Spring Boot侦听器Listener 文章目录 【Spring Boot系列】- Spring Boot侦听器Listener一、概述二、监听器Listener分类2.1 监听ServletContext的事件监听器2.2 监听HttpSeesion的事件监听器2.3 监听ServletRequest的事件监听器 三、SpringMVC中的监听器3…...

JavaScript速成课—事件处理

目录 一.事件类型 1.窗口事件 2.表单元素事件 3.图像事件 4.键盘事件 5.鼠标事件 二.JavaScript事件处理的基本机制 三.绑定事件的方法 1.DOM元素绑定 2.JavaScript代码绑定事件 3.监听事件函数绑定 四.JavaScript事件的event对象 1.获取event对象 2.鼠标坐标获取…...

【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录 一、什么是ClickHouse&#xff1f;OLAP场景的关键特征列式数据库更适合OLAP场景的原因输入/输出CPU 1.1 ClickHouse的定义与发展历程1.2 ClickHouse的版本介绍 二、ClickHouse的主要特性2.1 高性能的列式存储2.2 实时的分析查询2.3 高度可扩展性2.4 数据压缩2.5 SQL支…...

【C++ Exceptions】异常处理的成本

最低成本 exception是C的一部分&#xff0c;编译器必须支持。即使从未使用任何异常处理机制&#xff0c;也必须付出一些空间放置某些数据结构&#xff0c;付出一些时间随时保持那些数据结构的正确性。 第二种成本&#xff1a;来自try语句块 避免非必要的try语句块。 粗略估计&a…...

API接口:原理、实现及应用

API&#xff08;Application Programming Interface&#xff09;接口是现代软件开发中不可或缺的一部分。它们提供了一种机制&#xff0c;使得不同的应用程序和服务可以相互通信&#xff0c;共享数据和功能。在这篇文章中&#xff0c;我们将探讨API接口的原理、实现及应用&…...

SpringBoot学习笔记(项目创建,yaml,多环境开发,整合mybatis SMM)

一、SpringBoot入门 1.1 SpringBoot概述 SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。 Spring程序缺点&#xff1a;配置繁琐&#xff0c;依赖设置繁琐。SpringBoot程序优点&#xff1a;自动装配&#xff0c…...

Linux内核分析:输入输出,字符与块设备 31-35

CPU 并不直接和设备打交道,它们中间有一个叫作设备控制器(Device Control Unit)的组件,例如硬盘有磁盘控制器、USB 有 USB 控制器、显示器有视频控制器等。这些控制器就像代理商一样,它们知道如何应对硬盘、鼠标、键盘、显示器的行为。 输入输出设备我们大致可以分为两类…...

Linux抓包工具tcpdump

一、介绍 tcpdump是一个抓包工具&#xff0c;用于实时捕获和分析网络流量。它通常在unix和linux操作系统上使用。tcpdump能够捕获流经网络接口的数据包&#xff0c;并显示或保存它们以供进一步分析。它提供有关每个数据包的详细信息&#xff0c;包括源IP地址、目标IP地址、使用…...

Qt消息机制和事件

事件 事件是由Qt或者系统在不同时刻发出的,当敲下鼠标,或者按下键盘,或者当窗口需要重新绘制的时候,就会发出一个相应的事件,一些操作由用户的操作发出,一些则由系统自动发出,如系统定时器事件等。 Qt 中所有事件类都继承于 QEvent。 在事件对象创建完毕后, Qt 将这个…...

LeetCode-739-每日温度-单调栈

题目描述&#xff1a;给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 题目…...

MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办

方法1&#xff1a; 在mybatis核心配置文件中指定&#xff0c;springboot加载mybatis核心配置文件 springboot项目的一个特点就是0配置&#xff0c;本来就省掉了mybatis的核心配置文件&#xff0c;现在又加回去算什么事&#xff0c;总之这种方式可行但没人这样用 具体操作&…...

Flutter框架和原理剖析

Flutter是Google推出并开源的跨平台开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过Dart语言开发Flutter应用&#xff0c;一套代码同时运行在ios和Android平台。不仅如此&#xff0c;flutter还支持web、桌面、嵌入应用的开发。flutter提供了丰富的组件、接口&…...

NFS:使用 Ansible 自动化配置 NFS 客户端服务端

考试顺便整理博文内容整理涉及使用 Ansible 部署 NFS 客户端和服务端理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃…...

山西建设公司网站/百度官方客户端

接口技术——8086/8088cpu含有14个16位寄存器详解1、分类2、14个寄存器——8个通用寄存器2.1 14个寄存器——8个通用寄存器——4个数据寄存器2.2 14个寄存器——8个通用寄存器——2个地址寄存器2.3 14个寄存器——8个通用寄存器——2个变址寄存器3、14个寄存器——2个控制寄存器…...

可信的昆明网站建设/东莞市优速网络科技有限公司

pyltp的简介 语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广&#xff0c; 是国内外最具影响力的中文处理基础平台。它提供的功能包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等。 pyltp 是 LTP 的 Python 封装&#xff0…...

有多少专门做兼职的网站/营销网络是啥意思

写在前面的话&#xff1a; AMD安装MAC是一件很蛋疼的事情&#xff0c; 我这里主要是面向需要学习苹果平台的开发的同学&#xff0c;不想浪费太多时间去折腾的同学可以参考我的做法。 我的建议是安装mac os x 10.6.3,对应的xcode版本是3.2.2 如果想升级到更高版本的话&#xff0…...

泗水网站建设ys178/百度首页排名优化价格

整理来源|网络背调&#xff0c;可以很精准的检验应聘者简历中所写和所讲的是否属实&#xff0c;已经成为招聘企业检验员工是否合格的重要手段之一&#xff0c;也是应聘者在面试过程中十分反感的一点。我们经常会看到有人在网络上吐槽自己因为背调错失了高薪offer&#xff0c;而…...

武汉seo结算/seo岗位工资

http://acm.hdu.edu.cn/showproblem.php?pid1575http://acm.hdu.edu.cn/showproblem.php?pid1757赤裸裸的两道http://acm.hdu.edu.cn/showproblem.php?pid2256这题正解不是矩阵,不过如果推出公式来的话可以用矩阵解http://acm.hdu.edu.cn/showproblem.php?pid2604推公式吧,…...

wordpress修改固定连接404/宁波如何做seo排名优化

1.重启之前最好先看一下节点信息和运行状态 可以通过srvctl status database -d 数据库名 //查看节点信息 Crs_stat //查看节点状态 可以看到数据节点它由两个实例组成一个数据库&#xff0c;分别运行不同的节点&#xff0c;且状态ok 2.首先关闭数据库 Srvctl stop database -d…...