L1VzZXJzL2xpdXBlbmdoYW8vTGlicmFyeS9DYWNoZXMvY29tLmFsaWJhYmEuRGluZ1RhbGtNYWMvdGh1bWJuYWlscy8zOTE0MEJFQS03NzY1LTRCMzgtOUZDNy0yQjYzRjFCMjI2RjEuZ2lm.gif

1. 基础属性

1.1 时间复杂度

描述:总执行时间基本执行时间的关系;
函数表达示例:T(n) = 5n;

渐进时间复杂度

为了更好的解决时间分析的问题,有了渐进时间复杂度;

官方定义如下:

若存在函数fn),使得当n趋近于无穷大时,Tn)/fn)的极限值为不等于零的常数,则称fn)是Tn)的同数量级函数。记作Tn)=Ofn)),称为Ofn)),O为算法的渐进时间复杂度,简称为时间复杂度

因为渐进时间复杂度用大写O来表示,所以也被称为O表示法

直白地讲,时间复杂度就是把程序的相对执行时间函数Tn)简化为一个数量级,这个数量级可以是n、_n_2、_n_3等。

如何推导出时间复杂度呢?有如下几个原则:

  • 如果运行时间是常量级,则用常数1表示;
  • 只保留时间函数中的高阶项;
  • 如果高阶项存在,则省区高阶项前面的系数;

示例场景复杂度分析:

场景1:
T(n) = 3n,
最高阶项为3n, 剩去系数3,则转化的时间复杂度为:
T(n) = O(n);

场景2:
T(n)=5logn
最高阶项为5logn,省去系数5,则转化的时间复杂度为:
T(n)=O(logn)

场景3
T(n)=2,
只有常数量级,则转化的时间复杂度为:
T(n)=O(1)。

场景4
T(n)=0.5n_2+0.5_n
最高阶项为0.5n2,省去系数0.5,则转化的时间复杂度为:
T(n)=O(n2)。

1.2 空间复杂度

运行一段程序过程中,临时存储的中间数据所占用的空间大小;

示例:
给出1列数据,其中有两个元素是重复的,找出重复的元素;
image.png
算法1:双重for循环,找出重复元素;
时间复杂度:O(n2);
空间复杂度:O(1);
算法2:将数据存入字典中,找出重复元素;
时间复杂度:O(n)
空间复杂度:O(n)

常见空间复杂度有下面几种情况;

1).常量空间
当算法的存储空间大小固定,和输入规模没有直接的关系时,空间复杂度记作O(1)。例如下面这段程序:

  1. void fun1(int n){
  2. i = 3;
  3. // do something;
  4. }

2).线性空间
当算法分配的空间是一个线性的集合(如列表),并且集合大小和输入规模n成正比时,空间复杂度记作O(n)。例如下面这段程序:

  1. void fun2(int n){
  2. int [] array = new int [n];
  3. // do something;
  4. }

3).二维空间
当算法分配的空间是一个二维列表集合,并且集合的长度和宽度都与输入规模n成正比时,空间复杂度记作O(n2)。例如下面这段程序:

  1. void fun3(int n){
  2. int [][] array = new int [n][n];
  3. // do something;
  4. }

4).递归空间
递归是一个比较特殊的场景。虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“函数调用栈”。

下面这段程序是一个标准的递归程序:

  1. void fun4(int n){
  2. if(n > 0){
  3. fun4(n-1);
  4. }
  5. // do something;
  6. }

空间复杂度就是O(n);

1.3 小结

啥是算法?

一系列程序指令的集合,处理特定的运算和逻辑问题;衡量算法优劣的主要标准是时间复杂度和空间复杂度;

啥是数据结构?

数据结构是数据的组织、管理和存储格式,目的是高效的访问和修改数据;
数据结构包含数组、链表这些线性结构;也包含树、图这样的复杂结构;

啥是时间复杂度?

对一个算法运行时间长度的度量;用大O标识,记作 T(n) = O(f(n)) ;

常见的时间复杂度按照从低到高的顺序,包括:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)等;

啥是空间复杂度?

空间复杂度是对一个算法在运行过程中临时占用空间的度量;用大O表示,记作 S(n) = O(f(n));

常见的时间复杂度按照从低到高的顺序,包括O(1)、O(n)、O(n2)等,其中递归算法的空间复杂度和递归深度成正比;

参见

📚书籍—【漫画算法:小灰的算法之旅(Python篇)】

算法入门 - 图3