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

news2024/11/24 2:21:10

文章目录

    • 时间复杂度的定义
    • 时间复杂度的分类
    • 时间复杂度分析
    • 常见数据结构和算法的时间复杂度
      • 常见数据结构
      • 常见算法
    • 常见排序算法说明
      • 冒泡排序(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问题中有广泛应用。

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

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

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

相关文章

centos搭建activemq5.16

下载jdk、activemq&#xff08;我这里都放在在/usr/local&#xff09;之后。。。 在/usr/local/activemq/bin/目录下有一个env文件添加JAVA_HOME 注意activemq.xml里面不能出现中文&#xff0c;注释也不行 接下来在/usr/lib/systemd/system/创建activemq.service文件 # 单元节…

天选之子C++是如何发展起来的?如何学习C++呢?

天选之子C是如何发展起来的&#xff1f;如何学习C呢? 一、什么是C二、C发展史三、C的重要性3.1 语言的使用广泛度3.2 在工作领域 四、如何学习C4.1 大佬怎么学&#xff1f;4.2 自己怎么学 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复…

【LeetCode-中等题】107. 二叉树的层序遍历 II

文章目录 题目方法一&#xff1a;队列层序迭代 题目 方法一&#xff1a;队列层序迭代 解题详情&#xff1a;【LeetCode-中等题】102. 二叉树的层序遍历 res.add(0,zres); //效果是将 zres 列表作为 res 的第一个子列表&#xff0c;并将其它原本在第一位置及之后的子列表向后移…

1979-2021年地级市空气流通系数数据

1979-2021年地级市空气流通系数数据 1、时间&#xff1a;1979-2021年 2、来源&#xff1a;整理自era-interim 3、范围&#xff1a;367个地级市 4、指标&#xff1a;10米风速、边界层高度、空气流通系数 5、指标解释&#xff1a; 空气流动系数是空气污染的常用工具变量&am…

音视频转换器 Permute 3 for mac中文

Permute 3是一款界面简洁且易于使用的媒体文件格式转换器。它具有强大的转换功能&#xff0c;无需复杂的配置&#xff0c;只需将文件拖放到界面窗口&#xff0c;就能进行媒体转换&#xff0c;非常方便。 Permute 3支持视频、音乐和图像的格式转换&#xff0c;可以通过拖拽支持…

Jetpack Compose基础组件 - Image

Image的源码参数预览 Composable fun Image(painter: Painter,contentDescription: String?,modifier: Modifier Modifier,alignment: Alignment Alignment.Center,contentScale: ContentScale ContentScale.Fit,alpha: Float DefaultAlpha,colorFilter: ColorFilter? …

个人记录--跟着同门学c#

前提&#xff1a;已安装Visual Studio ArcEngine&DotSpatial C#二次开发&#xff08;一&#xff09;之DotSpatial使用心得记录_dotspatial 开发文档_只想敲代码的研究僧的博客-CSDN博客 ArcEngine是一种用于二次开发的软件开发工具包&#xff0c;可以用来创建基于ArcGIS…

深入分析ASEMI代理的瑞萨R5F5210BBDFB#10芯片

编辑-Z 随着科技发展的不断升级&#xff0c;电子技术正变得越来越复杂。不过&#xff0c;在这个繁复的电子世界中&#xff0c;有一样东西在不断地帮助着我们简化各种复杂的任务&#xff0c;那就是微型集成电路&#xff0c;也叫做“芯片”。今天我们将会对R5F5210BBDFB#10芯片这…

改变世界的物理学方程

1.牛顿万有引力定律 艾萨克牛顿爵士的万有引力定律&#xff0c;通常简称为牛顿万有引力定律&#xff0c;是物理学的基本原理。牛顿于 1687 年在其开创性著作《Philosophi Naturalis Principia Mathematica》&#xff08;自然哲学的数学原理&#xff09;中发表了这一定律。 该定…

6个免费视频素材网站,高清无水印,赶紧收藏起来~

6个免费视频素材网站&#xff0c;高清无水印&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多&#xff0c;像风景、植物、动物、人物、…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision&#xff08;CV&#xff09;是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗&#xff0c;到更复杂的任务&#xff0c;例如用自然语言描述图像。 二、CV常见的问…

提升网站效率与SEO优化:ZBlog插件集成解决方案

在创建和管理网站的过程中&#xff0c;使用合适的工具和插件可以大幅提升效率&#xff0c;并改善搜索引擎优化&#xff08;SEO&#xff09;结果。ZBlog插件是为ZBlogCMS设计的一组工具&#xff0c;它们帮助网站管理员轻松地满足各种需求&#xff0c;从采集内容到发布、推送和SE…

基于dq0变换的三相并联有源电力滤波器模拟模型(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CSS——grid网格布局的基本使用

网格布局在实现页面自适应&#xff0c;大屏可视化中常常使用&#xff0c;在这篇博客里&#xff0c;记录一下网格布局的基本使用。 参考文档&#xff1a;网格布局_菜鸟教程 文章目录 1. 体会grid的自适应性2. grid-template-arr配置网格行列3. 网格单位fr与repeat()简写属性值4…

API(十一) 获取openresty编译信息

一 ngx.config 说明&#xff1a; 不常用,了解即可 ngx.config.subsystem 说明&#xff1a; 用的四层还是七层代理 ngx.config.debug 说明&#xff1a; 返回的是boolean类型, openresty rpm安装一般没有 --with-debug编译选项对比&#xff1a; nginx rpm 安装一般携带 --wi…

【JDK 8-集合框架】5.2 map 和 filter 函数

一、map 函数 1. 上节例子 2. DO 转 DTO 对象 Stage 1&#xff1a;创建数据库映射对象&#xff08;DO&#xff09;> User.java Stage 2&#xff1a;前端数据传输对象&#xff08;DTO&#xff09;> UserDTO.java Stage 3&#xff1a;DO 转 DTO Stage 4&#xff1a;…

Flutter的启动和渲染流程

一、Flutter的启动流程 1、Flutter启动初始化 在安卓平台上启动App时&#xff0c;会先创建应用进程&#xff0c;然后创建FlutterApplication并执行其onCreate方法。在FlutterApplication的onCreate方法中&#xff0c;会执行Flutter相关的初始化&#xff0c;主要包括Flutter编…

VB过程的递归调用,求4的阶乘

VB过程的递归调用&#xff0c;求4的阶乘 过程的递归调用&#xff0c;求4的阶乘 Private Function fact(n As Integer) As IntegerIf n 1 Thenfact 1Elsefact n * fact(n - 1)End If End Function Private Sub Command1_Click()Dim n As Integern 4Print fact(n) End Sub

【活动回顾】Rust:构建新时代基础设施的首选语言 @Qcon

以「启航 • AIGC 软件工程变革」为主题的 QCon 全球软件开发大会北京站于 9 月 5 日在北京富力万丽酒店圆满落幕&#xff01;此次大会包含向量数据库、云原生、异构计算、面向 AI 的存储、微服务架构治理、FinOps 等近 30 个精彩专题。Databend Labs 作为深耕云原生数据库领域…

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…