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

文章目录

    • 时间复杂度的定义
    • 时间复杂度的分类
    • 时间复杂度分析
    • 常见数据结构和算法的时间复杂度
      • 常见数据结构
      • 常见算法
    • 常见排序算法说明
      • 冒泡排序(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.mzph.cn/news/82713.shtml

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

相关文章

9_19,洛谷刷题记录

要做一株小草&#xff0c;默默努力 求细胞数量 #include<iostream> using namespace std; //对每个点进行搜索&#xff0c;dfs/bfs&#xff0c;将搜过的点标记出来&#xff0c;然后记录次数 //搜索几次&#xff0c;就有几个细胞 const int N110; int g[N][N],st[N][N]; …

平均精度(AP)

什么是平均精度(AP) 平均精度 (AP)并不是精度 (P)的平均值。 平均精度 (AP) 是按类别计算的。 mAP&#xff08;mean average precision&#xff09;是一个平均值&#xff0c;常用作目标检测中的检测精度指标mAP 指标通过对于一个平均目标来检测任务中多个目标所对应不同 AP&a…

linux中的开发工具

在刚开始使用linux的时候&#xff0c;我们需要在系统上写一些简单的代码&#xff0c;来熟悉环境以及各种指令 并且熟悉属于linux的一套开发的环境&#xff0c;而这对于c来说需要三个软件就可以进行简单的编码 和使用&#xff0c;让我们来认识一下下列工具&#xff0c;以及工具的…

【链表】反转链表 II-力扣 92 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

elasticsearch bulk 批量操作

1&#xff1a;bulk 是 elasticsearch 提供的一种批量增删改的操作API bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 &#xff0c;只能放在同一行&#xff0c;同时&#xff0c; 相邻的JSON串之间必须要有换行 &#xff08;Linux下是\n&#xff1b;Window下是\r\n&#…

避雷器雷击计数器检验

试验目的 由于密封不良&#xff0c; 放电计数器在运行中可能进入潮气或水分&#xff0c; 使内部元件锈蚀&#xff0c;导致计数器不能正确动作&#xff0c; 因此需定期试验以判断计数器是否状态良好、 能否正常动作&#xff0c; 以便总结运行经验并有助于事故分析。 带有泄漏电…

Git学习笔记6

Github分支开发&#xff1a; 第1步&#xff1a;在github上创建一个新的dev分支&#xff1a; 更新了微信的PC版本&#xff0c;发现默认的箭头比以前加粗了&#xff0c;变得更好看了。 create branch: dev from master。 切换到该分支&#xff0c;看到里面的内容跟master分支的…

Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现

Spring Boot Vue的网上商城之springsecurityjwtredis实现用户权限认证实现 在网上商城项目中&#xff0c;用户的安全性是非常重要的。为了实现用户权限认证和安全校验&#xff0c;我们可以使用Spring Security、JWT和Redis来实现。本篇博客将详细介绍后端和前台的实现过程&am…

Vue3 菜鸟入门(三)超详细:引用外部依赖、组件、路由

【学习笔记】Vue3 菜鸟入门&#xff08;三&#xff09;超详细&#xff1a;引用外部依赖、组件、路由 关键词&#xff1a;Vue 、Vue 3、Java、Spring Boot、Idea、数据库、一对一、培训、教学本文主要内容含Vue 基本框架 模板语法、指令计划1小时完成&#xff0c;请同学尽量提前…

计算机是如何工作的(上篇)

计算机发展史 世界上很多的高科技发明,来自于军事领域 计算机最初是用来计算弹道导弹轨迹的 弹道导弹 ~~国之重器,非常重要 两弹一星 原子弹,氢弹,卫星(背后的火箭发射技术) 计算弹道导弹轨迹的计算过程非常复杂,计算量也很大 ~~ 但是可以手动计算出来的(当年我国研究两弹一…

Python py文件打包成 exe文件

文章目录 安装 pyinstaller 模块pyinstaller 的使用pyinstaller 常用参数多文件打包 安装 pyinstaller 模块 pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple在 pyinstaller 模块安装成功之后&#xff0c;在 Python 的安装目录下的 Scripts 目录下会增加…

二叉树实现的相关函数

1.二叉树的创建 BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi) { if (n0||a[*pi] #){ (*pi);return NULL;}BTNode* root (BTNode*)malloc(sizeof(BTNode));root->_data a[(*pi)];root->_left BinaryTreeCreate(a, --n, pi);root->_right Binary…

解决VS Code安装远程服务器插件慢的问题

解决VS Code安装远程服务器插件慢的问题 最近想在服务器上做juypter notebook的代码运行&#xff0c;发现要给服务器安装Jupyter插件&#xff0c;但是安装速度奇慢无比&#xff08;因为服务器不连外网&#xff09;&#xff0c;一开始查看从VS Code插件市场下载插件的博客&…

ip地址怎么改网速快

在当今高度依赖互联网的时代&#xff0c;快速稳定的网络连接对于人们的生活和工作至关重要。然而&#xff0c;有时我们可能会遇到网络速度缓慢的问题。虽然更改IP地址并不能直接影响网络速度&#xff0c;但它可以成为改善网络连接的一种策略之一。虎观代理小二二将探讨如何通过…

Apache Spark 在爱奇艺的应用实践

01 Apache Spark 在爱奇艺的现状 Apache Spark 是爱奇艺大数据平台主要使用的离线计算框架&#xff0c;并支持部分流计算任务&#xff0c;用于数据处理、数据同步、数据查询分析等场景&#xff1a; 数据处理&#xff1a;在数据开发平台中支持开发者提交 Spark Jar 包任务或Spar…

Mac node nvm 切换版本,指定版本

一、Homebrew自动安装 // Homebrew安装 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" // Homebrew卸载 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)&quo…

macOS 运行xxx.command文件提示”无法执行,因为您没有正确的访问权限“解决方法

使用苹果mac电脑运行.command文件时&#xff0c;是否遇到弹出”无法执行&#xff0c;因为您没有正确的访问权限“的窗口&#xff1f;遇到这种问题怎么解决呢&#xff1f;这里小编为大家带来了详细的解决方法&#xff0c;一起来看看吧&#xff01; 解决方法&#xff1a; 方法一…

matlab 间接平差法拟合二维圆

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫自重。 一、算法原理 圆的方程为: ( x - x 0 )

PG数据恢复must be member of role “xxxx“

背景&#xff1a;有一份数据库备份文件&#xff0c;sql语句中包含了drop语句。postgresql数据中有一个模式&#xff1a;test_schema&#xff0c;owner是test_schema_onwer。有另外一个用户test_username2。test_username2具有test_schema的所有权限。 test_username2才是操作te…

GO学习之 远程过程调用(RPC)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…