数据结构瞎聊-算法的复杂度

181 阅读3分钟

数据结构瞎聊-算法的复杂度

学习目标

了解什么是时间复杂度,什么是空间复杂度.

了解算法的时间复杂度,并能分析各种算法的复杂度.

首先,我们先讲解时间复杂度,先上概念.

时间复杂度的概念

在进行算法分析时,语句总的执行次撞 T(n)是关于问题规模 n 的函数,进而分析 T(n)随 n 的变化情况并确定T(n)的数量级别. 算法的时间复杂度.也就是算法的时间量度,记 T(n) = O(f(n)),它表示随问题规模n的增大,算法执行时间的增长率和f(n) 的增长率.和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,其中f(n)是问题规模n的某个函数.

什么是最优算法

最优算法的概念:随着n的增大,T(n)增长最慢的算法就是最优算法

如何分析一个算法的时间复杂度

方法: 推导大O阶方法 推导方式有这些:

  1. 用常数1取代时间中的所有的加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数

一般我们会称O(1)为常数阶,O(n)为线性阶,

常数阶

常数阶: 每个语句只执行一次,这样的时间复杂度都是O(1);

image.png 这样的代码就是O(1)的时间复杂度.

线性阶

线性阶: 这种算法的循环结构相对复杂一点, 需要确定特定语句或者某个语句集运行的次数.

image.png

这样的语句的算法就是O(n)

对数阶

对数阶: image.png

由于每次 a乘以2后,会更靠近n的数值,得到 2x2^{{x}} = n,得到x = log2nlog2^{{n}} ;

所以这个循环的时间复杂度为O(logn).

平方阶

平方阶:

image.png

这样的语句的时间复杂度为O(n2n^{{2}});

image.png

如果是上面的代码,它的时间复杂度为O(m*n);

所以可以总结出来:

循环的复杂度为循环体的复杂度乘上该循环运行的次数.

我们通常判断一个算法的时间复杂度是判断他最坏的那个运算情况而得来的. 如果f(n) = 1 + n 的这种情况,我们还会根据推导大O阶的方法,可以推出算法的复杂度为O(n);

空间复杂度的概念

算法的空间复杂度:主要是计算算法所需要的存储空间

简单来说,算法的空间复杂度就是占用内存,cpu等计算机资源的程度。 计算公式: S(n) = O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占用存储空间的函数.