【算法学习】算法时间复杂度

news/2024/9/20 13:51:33/文章来源:https://www.cnblogs.com/SaturnRing/p/18355137

时间复杂度的计算

时间复杂度简单计算(一层、两层、多层循环)

相当于轨迹追踪法:设执行次数为k,按照循环条件

image-20230530085749739

image-20230530085814900

image-20230530085959529

img

阿布算法课

学习链接

01 区别算法(Algorithm)和程序(Program)


image-20230530094414979

算法程序
设计阶段 实施阶段
相关领域知识 程序员
任何语言、伪代码 编程语言
独立于硬件/操作系统 与硬件/操作系统有关
算法分析 程序测试

02 事前分析和事后测试

image-20230530094503082

事前分析事后测试
算法 程序
独立于语言 有赖于语言
独立于硬件/操作系统 与硬件/操作系统有关
时间/空间 复杂度函数 运行时间/占用字节

03 算法的性质

image-20230531110336615

  • 一个或多个输入

  • 至少有一个输出

  • 可定义性

  • 有限性

  • 高效性

04 算法的表示和分析

怎么表示一个算法:需要看得懂,没有固定形式(伪代码)

如何分析一个算法?

  • Time:时间消耗

  • Space:内存消耗

  • N/W:数据传输和网络消耗

  • Power:能耗

  • CPU Registers:占用CPU多少寄存器(底层驱动、操作系统)

时间复杂度分析 image-20230530100626462

image-20230530101100153 时间复杂度函数 f(n) = 3

  • 算法时间复杂度分析,不需要考虑每个陈述语句形式。

  • 算法时间复杂度看的是常数操作总次数

05 频数分析法求时间间复杂度

一层循环 image-20230530150458437

两层循环 image-20230530151453960

多层循环 image-20230530151221152

06 轨迹追踪法求时间复杂度

设执行次数为k,按照循环条件,得出执行次数k与问题规模n的关系,从而得时间复杂度 image-20230531093157591

07 时间复杂度分析示例

image-20230531094351683

logn为小数,执行次数要向上取整

image-20230729174259316

image-20230531095047155

image-20230531100024461

image-20230729174549492

image-20230729174745754

image-20230729174844300

常见for循环时间复杂度总结:

image-20230531110108500

08 while循环、if条件的时间复杂度分析

由于while循环可以和for循环相互转换,while循环实际上和for循环分析方法一样

if 语句分析时间复杂度可能有最坏、最好情况

image-20230729180257132 image-20230531112251026

image-20230729180526275

09 时间复杂度的分类

image-20230729181417244

10 函数复杂度的比较和分析

image-20230529220533633

增长速度:常<对<幂<指数

11函数的渐近符号

image-20230529215813204

image-20230529215850457

image-20230730144546461

上界有很多,尽量使用最接近的那个上界表示f(n)

image-20230529215933551

image-20230730144850423

当下界有很多时,尽量使用最接近的那个下界表示f(n)

image-20230529220003277

image-20230730145050590

平均界只有一种表示方式表示f(n)


最好、最坏、平均情况的时间复杂度

  • 算法的时间复杂度,会随着排序集合的有序性而改变。我们需要分析不同算法在不同数据下的表现

    • 最好时间复杂度:在完全有序的情况下的时间复杂度

    • 最坏时间复杂度:在最坏情况下的时间复杂度

    • 平均复杂度:平均情况下的时间复杂度

注意:并不是最坏时间复杂度就用O(n),最好情况就是\Omega(n),平均情况就是\theta(n)O()\Omega()\theta()只是表示函数渐近的符号,都可以使用任何情况的时间复杂度衡量上。

最好、最坏、平均情况时间复杂度分析

线性搜索

image-20230730194151540

image-20230730194328240

image-20230730194454552

二叉搜索树(二叉排序树)(二分搜索)

image-20230730203426113

12深入学习函数渐近符号

image-20230730150255092

image-20230730150443483

image-20230730150628896

阶乘形式的f(n)没有精确的平均界表示,只能通过上、下界表示

logn! = O(nlogn) = Ω(1)

13 渐近符号的性质

image-20230730151125219

image-20230730151544708

14 函数的比较

image-20230730151736923

image-20230730151857022

image-20230730152021321


15 递归算法的时间复杂度

  • 整个递归算法的时间复杂度函数用 T(n)表示

  • 如何求得递归算法得时间复杂度函数T(n):

    • 递归追踪树,求得T(n)表达式

    • 由T(n)的递推关系,推导出T(n)

    • 根据master公式得出T(n)的渐近表示

例1

image-20230730154209599

例2

image-20230730154922868

追踪递归树求T(n)

image-20230730155239105

递归推导求T(n)

image-20230730155416624

常见T(n)递归关系对应的时间复杂度

image-20230531155318804 image-20230531155742957

16 master公式

减法的master公式

Masters Theorem Decreasing Function

image-20230531160610777

除法的master公式

Masters Theorem in Algorithms for Dividing Function image-20230531162017499


左神求递归复杂度:(以上的p=0的情况)

image-20230524092133794 N^d*logN 即 N^dlogN

其中:

  • T(N) 是问题规模为 N 时递归算法的时间复杂度

  • a(a>0)是子问题数量,子问题的规模相同,每一个子问题约耗时 T(N/b)

  • b 是问题规模缩减的程度,通常 b > 1

  • O(n^d) 是非递归部分的时间复杂度,通常较低阶


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

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

相关文章

《数据资产管理核心技术与应用》读书笔记-第三章:数据血缘

数据资产管理核心技术与应用《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书,全书共分10章,第1章主要让读者认识数据资产,了解数据资产相关的基础概念,以及数据资产的发展情况。第2~8章主要介绍大数据时代数据资产管理所涉及的核心技术,内容包括元数据的采…

【办公软件学习】如何交叉引用多个参考文献[x-x]

参考文献 第一步:点击交叉引用将[24]、[27]这两个文献插入。 第二步:右键刚插入的文献序号,然后点击切换域代码 第三步:在代码块中添加代码\#"[0"和\#"0]"第四步:右键刚编辑的代码块,并更新域。 第五步:在[4547]之间添加-,之后按"ctrl"+…

【办公软件学习】如何将Word格式转换为Markdown格式

一键!将 Word 转换为 Markdown 参考链接1:https://zhuanlan.zhihu.com/p/30891168 参考链接2:https://blog.csdn.net/qq15035899256/article/details/125547483 参考链接3:https://word2md.com/ 方法一:Writage + Pandoc — 双剑合璧!下载并安装 Writage,下载地址:http…

全连接层详解

全连接层详解 该博客仅是笔者对于全连接层的浅薄理解。如果存在问题,请务必告知我,谢谢。 前言 全连接层是常见的神经网络层,可以作为模型的分类器(可理解为将特征维度映射到类别维度上),也可以作为特征提取。不过,对于初学者,可以直接认为全连接层是模型的分类器。毕竟…

[Java/SQL] 自动去除SQL注释

0 引言 在数据连接(池)框架、数据服务/Data to API等中间平台中,因部分数据库不允许SQL中存在注释信息(如:Redis、Open Gemini等;当然,MYSQL、INFLUXDB等数据库是支持的),故存在这样一个需求:在提交到数据库的SQL,需对原始SQL的注释信息予以去除。以 OpenGemini V1.2.…

Java基础-学习笔记08

类变量、类方法、main方法、代码块01 类变量、类方法、main方法、代码块 类变量(静态变量) 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。关于静态变…

ABC366D 题解

第一眼是想写 \(kd-tree\) 的。 然后发现这就是一道三维前缀和的板子题。 三维前缀和 要想学习三维前缀和,我们首先得了解前缀和的概念,并且学会一维、二维前缀和。 什么是前缀和 前缀和是容斥原理的典型应用。这种优化方式可以使求和操作的时间复杂度降低到 \(O(1)\)(但是需…

C# 如何防止WinForm程序多次运行

[C# 开发技巧]如何防止程序多次运行 - Learning hard - 博客园 (cnblogs.com) 一、引言 最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,如: http://social.msdn.microsoft.com/Forums/zh-CN/6398fb10-ecc2-4c03-ab25-d03544f5fcc9, 所以这里就记录下来,希望给遇到…

lwIP——带操作系统(FreeRTOS)移植

1. lwIP前期准备 在程序工程中,我们在工程文件夹下创建了一个名为 “lwip”的子文件夹。在“lwip”文件夹下,我们又创建了一个子文件夹:arch 。arch 文件夹用于存放 lwIP 系统的配置文件;2. 添加lwIP源文件3. 添加网卡驱动程序/* Includes -------------------------------…

Less is richness,基于less is more的博客园宽屏主题魔改

写在前面 之前做过很多个人博客,都是做着玩的,资源托管在免费或低价的服务器上,也不经常维护,所以就一直不长久,最终还是选择了博客园。发现博客园可以自定义样式,于是试着给博客换了一个又一个主题。个人比较喜欢宽屏的样式,感觉LessIsMore主题布局比较好、也比较简洁,…

5 大场景上手通义灵码企业知识库 RAG

大家好,我是通义灵码,你的智能编程助手!最近我又升级啦,智能问答功能全面升级至 Qwen2,新版本在各个方面的性能和准确性都得到了显著提升。此外,行间代码补全效果也全面优化,多种编程语言生成性能及准确性大幅提升,如前端、Java、Go、Python、C++ 等。此外,灵码新增代…

2024 年了,IT 运维监控系统都有哪些推荐?

大浪淘沙,2024 年的今天,市面上很多监控系统慢慢淡出了大家的视野,而一些新的监控系统也逐渐崭露头角。今天我们就来看看 2024 年的当下,哪些 IT 运维监控系统最值得关注。 Prometheus毫无疑问,Prometheus 是最值得关注的监控系统,因为 Prometheus 的规范和生态都非常厉害…