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

时间复杂度的计算

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

相当于轨迹追踪法:设执行次数为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) 是非递归部分的时间复杂度,通常较低阶


posted @ 2024-08-12 15:59  阿臣的发际线  阅读(13)  评论(0编辑  收藏  举报