美文网首页
算法的时间复杂度分析

算法的时间复杂度分析

作者: huyongming | 来源:发表于2020-10-04 16:19 被阅读0次

1. 时间复杂度是什么

时间复杂度表示的是算法执行时间与数据规模变化趋势之间的一种关系。它表示的并不是算法的实际执行时间

2. 时间复杂度的计算

假设有如下的一段代码

int sum(int []array,int n){
    int sum = 0;
    for(int i = 0;i<n;i++){
        sum+=array[i];
    }
    return sum;
}

由于时间复杂度只是估算算法执行时间与数据规模增长之间的一种关系,并不是算法的实际执行时间,我们可以粗略的认为每一行代码的的执行时间都是一样的,记为1个单位,则上面这个函数的执行时间就是

int sum = 0;//执行时间为1

for(int i = 0;i<n;i++){//for循环的执行时间为2n
    sum+array[i];
}

所以T(n)=2n+1;

3. 时间复杂度的表示

时间复杂度用大O来表示,由于时间复杂度表示只是一种变换趋势,所以我们可以忽略常量,低阶知识和高阶指数的系数。上面这个函数的时间复杂度(T(n)=2n+1)可以表示为O(n)。

4. 常见时间复杂度和其计算

常见的时间复杂度有O(1),O(logn),O(n),O(nlogn),O(n^2)。

4.1 O(1)

O(1)表示常量级时间复杂度,只要代码的执行时间不随n的增大而变化,无论执行多少行代码,则我们都认为这个时间复杂度是常量级的,记为O(1)

int add(int a,int b){
    return a+b;
}

4.2 O(logn)

O(logn)表示对数阶时间复杂度,什么样的代码是对数阶时间复杂度呢?

void log(int n){
    int i = 1;
    while(i<=n){
        i=i*2;
    }
}

这里的while循环会执行多少次呢?while执行的次数也就是当2^k>=n的时候,k=log2(n)(2为底,n的对数),也就是时间复杂度为O(logn)。当代码为

while(i<=n){
    i=i*3;//或者其它值是,复杂度也是O(logn)
}

根据对数转换公式

log3(n)=log3(2)*log2(n),

而我们计算时间复杂度的时候可以忽略高阶的系数,所以当i= i*3时也是O(logn)

4.3 O(n)

O(n)的示例比较简单

int sum(int []array,int n){
    int sum = 0;
    for(int i = 0;i<n;i++){
        sum+=array[i];
    }
    return sum;
}

4.4 O(nlogn)

O(nlogn)的示例,这里的示例并没有实际意义

int demo(int n){
    for(int i = 0;i<n;i++){
        int k = 1;
        while(k<=n){
              k=k*2;
        }
    }
}

其中

 int k = 1;
 while(k<=n){
      k=k*2;
 }

的时间复杂度为O(logn),上面已经分析过了,这段代码需要循环执行n边,所以整个这个函数的时间复杂度就是O(nlogn)

4.5 O(n^2)

示例

int demo(int n){
    int num = 0;
    for(int i = 0;i<n;i++){
        for(int j = 0;j<n;j++){
            num = num+j;
        }
    }
    return num;
}

两个for循环嵌套,里面的for循环要执行n*n边,所以时间复杂度就是O(n^2)

5. 最好、最差、平均时间复杂度

5.1 什么是最好情况时间复杂度

就是在最理想的情况下,代码执行的时间复杂度

5.2 什么是最坏情况时间复杂

就是在最糟糕的情况下,代码执行的时间复杂度

5.3 什么是平局情况时间复杂度

代码执行在各种可能的情况下的时间复杂的加权平均值,也叫加权平均时间复杂度

三种时间复杂度计算实例

以在数组中查找某个值的位置为例来说明三种时间复杂度的计算

int find(int[]array,int n,int x){
    int pos = -1;
    for(int i = 0;i<n;i++){
        if(array[i]==x){
            pos = i;
            break;
        }
    }
    return pos;
}

最理想的情况,就是要查找的数据就是数组的第一个,for循环只用执行一次就找到了数据对应的位置,这是的复杂度是O(1),也就是最好时间复杂度是O(1)

最差的情况是,数据不在数组中,遍历完整个数组都没有找到对应的数据。for循环要执行n次,这时的时间复杂度是O(n),也就是最差时间复杂度为O(n)

平均时间复杂的分析,平均复杂度要更具各种情况的概念和对应情况下的时间复杂度来求平均值

  1. 数据在和不在数组中的概率是1:1
  2. 数据在[0,n-1]的位置上的概率各是1/n

所以平均时间复杂的计算就是

(1+2+3+……+n)/2n+1/2=(n+1)*n/4n+1/2=(3n+1)/4

根据时间复杂度的大O表示法,去掉系数,常量,所以这个算法的平均时间复杂度就是O(n)

相关文章

  • 算法复杂度

    算法复杂度 算法复杂度的目的:分析代码执行的时间成本。我们从五个方面来介绍算法复杂度:时间复杂度、时间复杂度分类、...

  • 数据结构与算法-复杂度分析

    时间、空间复杂度:衡量算法执行小路的指标,数据结构与算法离不开时间、空间复杂度分析,复杂度分析是算法的精髓。 为什...

  • 时间复杂度和空间复杂度笔记

    复杂度分析笔记 复杂度主要分为时间和空间复杂度 时间复杂度:算法(程序)执行的时间变化趋势 空间复杂度:算法(程序...

  • 算法

    重拾算法:算法效率分析(一)(空间复杂度和时间复杂度) 详解算法的各种复杂度的差别有多大(带图) 算法复杂度 选择...

  • 软件设计师考试 | 第八章 算法设计与分析 | 算法分析基础

    (一)时间复杂度 算法的时间复杂度分析主要是分析算法的运行时间,即算法执行所需要的基本操作数。 不同规模的输入所需...

  • 第14章 深度优先搜索

    1、中国象棋 算法分析 bfs 时间复杂度 Java代码 2、踏青 算法分析 flood fill 算法 时间复杂...

  • 【3】时间复杂度

    算法时间复杂度 算法时间复杂度的定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T...

  • map:169.求众数(投票算法)

    求众数 哈希Map 复杂度分析 时间复杂度:O(N) 空间复杂度: O(N) 投票算法 复杂度分析

  • 常用java算法理解时间复杂度与空间复杂度

    常用的算法的时间复杂度和空间复杂度: 排序法 最差时间分析 = 平均时间复杂度 = 稳定...

  • 数据结构和算法分析(二)

    算法分析 算法时间复杂度 算法时间复杂度来度量算法的执行时间长短。 比较算法随着输入规模的增长量时,可以有以下规则...

网友评论

      本文标题:算法的时间复杂度分析

      本文链接:https://www.haomeiwen.com/subject/npynuktx.html