当前位置: 首页 > 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支…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...