首页 > 编程语言 >数据结构—算法的时间复杂度

数据结构—算法的时间复杂度

时间:2022-10-14 21:37:24浏览次数:57  
标签:语句 执行 int 复杂度 算法 时间 数据结构

1、什么是时间复杂度

      一般情况下,算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度(Time complexity)

2、为什么要学习时间复杂度

     首先我们知道一道算法题可以用多种算法来实现,算法在编写成可执行程序之后,运行时则需要消耗时间资源和空间资源,那么判断一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢。

3、时间复杂度分析方法的特点

  • 不依赖具体的执行环境
  • 不用具体的测试数据
  • 在算法实现之前,在脑海中就可以评估算法的性能

4、时间复杂度的类型

1)常数阶O(1)

int x = 5;
int y = 10;
int result = x + y;
System.out.println(result);

第一行语句执行1次

第二行语句执行1次

第三行语句执行1次

第四行语句执行1次

f(n) = 4          T(n) = O(4)         T(n) = O(1)

只要你的程序执行的时间和输入数据规模n没有关系的话,即使需要成千上万行的代码,那么你的程序时间复杂度仍然是O(1)

2)对数阶O(log2n)

int i = 1;
for(;i <= n;i += i){
       System.out.println(i);
}

第一次:i = 1      即 i = 2(1-1) = 20

第二次:i = 2      即 i = 2(2-1) = 21

第三次:i = 4      即 i = 2(3-1) = 22

第四次:i = 8      即 i = 2(4-1) = 23

第五次:i = 16    即 i = 2(5-1) = 24

....................

第x次:i = 2(x-1)

因为 i <= n,所以2(x-1) <= n,得到:x = 1 + log2n

f(n) =(4 + 3log2n)       T(n) =O(4 + 3log2n)      O(n) = log2n

再一例

int i = 1;
for (; i <= n; i = i * 3){
         System.out.println(i);
}

第一次:i = 1      即 i = 3(1-1) = 30

第二次:i = 3      即 i = 3(2-1) = 31

第三次:i = 9      即 i = 3(3-1) = 32

第四次:i = 27    即 i = 3(4-1) = 33

第五次:i = 81    即 i = 3(5-1) = 34

....................

第x次:i = 3(x-1)

因为 i <= n,所以3(x-1) <= n,得到:x = 1 + log3n

f(n) =(4 + 3log3n)       T(n) =O(4 + 3log3n)      O(n) = log3n

log3n = log32 * (log2n)

O(log3n) = O(Clog2n),其中常量C = log32

O(log3n) = O(log2n)

3)线性阶O(n)

for (i = 1; i <= n; ++1)
{
     j = i;
     j++;
}

第一行语句执行1+2n次

第二行语句执行n次

第三行语句执行n次

f(n) = 1+ 4n     T(n) = O(1 + 4n)    O(n) = n

4)线性对数阶

     线性对数阶其实很好理解,就是将时间复杂度为对数阶的语句执行n遍。

5)平方阶O(n2)

for (x = 1; i <=n;x++)
{
  for(i = 1;i <=n;i++)
  {
         j = i;
         j++;
   }
}

第一行语句执行1+2n次

第二行语句执行2n次

第三行语句执行n*n次

第四行语句执行n*n次

f(n) = 1+4n+2n2      T(n) = O(1+4n+2n2)     O(n) = n2

6)立方阶O(n3)

    与平方阶类似。平方阶是双层循环嵌套,则立方阶就是三层循环嵌套。

5、时间复杂度法则

1)加法法则

private static long sum(int n){
      int sum1 = 0;
      for (int i = 1; i <= 1000; i++){
           sum1 += i;
      }
     
      int sum2 = 0;
      for (int i = 1;i <= n; i++){
           sum2 += i;
      }
 
      int sum3 = 0;
      for (int i = 1;i <= n; i++){
           for (int j = 1; j <= n; j++)
                sum3 += i;    
      }
}

第一段for循环语句时间复杂度为O(1)

第二段for循环语句时间复杂度为O(n)

第三段for循环语句时间复杂度为O(n2)

如果:T1(n) = O(f(n))   T2(n) = O(f(n))    那么:T(n) = max(T1(n),T2(n)) = max(O(f(n)),O(g(n))) = O(max(f(n),g(n)))

所以此算法的时间复杂度为O(n2)

再一例

private static long sum_1(int n,int m){
      int sum1 = 0;
      for(int i = 1; i <= 1000;i++){
           sum1 += 1;
      }
     
      int sum2 = 0;
      for (int i = 1; i <= n; i++){
         sum2 += i;
      }
  
      int sum3 = 0;
      for (int i = 1; i <= m; i++){
          sum3 += i;
      }

      return sum1 + sum2 + sum3;
}

第一段for 循环语句时间复杂度为O(1)

第二段for循环语句时间复杂度为O(n)

第三段for循环语句时间复杂度为O(m)

此算法的时间复杂度为O(n + m)

2)乘法法则

private static long sum_3(int n){
     int sum = 0;
     for (int i = 1; i <= n; i++){
             sum += sumSquare(i);
     }
     return sum;
}

private static long sumSquare(int n){
     int res = 0;
     for (int i = 1; i <= n; i++){
             res += (i * i);
     }
     return res;
}

第一段语句时间复杂度为O(n)

第二段语句时间复杂度为O(n)

如果: T1(n) = O(f(n))  T2(n) = O(g(n))   那么:T(n) = T1(n)*T(n) = O(f(n)*O(g(n))) = O(f(n)*g(n))

此算法的时间复杂度为O(n*n)

6、常用时间复杂度的排序

从小到大:O(1) < O(log2n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(3n) < O(n!) < O(nn)

 

 

标签:语句,执行,int,复杂度,算法,时间,数据结构
From: https://www.cnblogs.com/Santariki/p/16789835.html

相关文章

  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    链表的数据结构基础链表结构链表是一种通过指针串联在一起的线性结构。每一个节点由两钟部分构成,一部分是数据域,一部分是指针域,指针域存放的指针指向另一个节点。链表......
  • 深度学习算法基础
    1,基本概念1.1,余弦相似度1.2,欧式距离1.3,余弦相似度和欧氏距离的区别2,容量、欠拟合和过拟合3,正则化方法4,超参数和验证集5,估计、偏差和方差6,随机梯度下降算法......
  • 力扣-排序算法
    部分题解保存排序数组-快速排序classSolution{privatefinalstaticRandomrandom=newRandom(System.currentTimeMillis());publicint[]sortArray(in......
  • ffmpeg数据结构学习(AVpacket & AVframe)
     其中的AVBufferRef是一个AVbuffer的指针:图片来源于网络 关于AVframe:音频解码API avcodec_decode_audio4在新版中已废弃,替换为使用更为简单的avcodec_send_packet......
  • InnoDB存储引擎:索引与算法
    InnoDB存储引擎索引概述InnoDB支持以下几种常见的索引:B+树索引(传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引;B+树索引并不能找到一个给......
  • 算法第四版习题解答(1.1 Basic Programming Model)
    前言使用的是《算法》第四版英文版,主要是习题解答。书中jar包的导入请戳:算法(第四版)中algs4.jar下载和使用EXERCISES1.1.11.1.21.1.3importjava.util.Scanner;p......
  • B-神经网络模型复杂度分析
    目录结构一,模型计算量分析二,模型参数量分析三,一些概念四,参考资料前言现阶段的轻量级模型MobileNet/ShuffleNet系列、CSPNet、RepVGG、VoVNet等都必须依赖于于具......
  • 通关数据结构 day_07 -- trie
    Trie基本用法&作用快速地存储和查找字符串集合的数据结构我们在使用trie的过程中,我们使用的字符串一定是都是大写/小写,并且长度不长比分说我们有字符串:abcdefabd......
  • Python实战—基于KNN算法尾鸢花数据集分类
    KNN模型理论K最近邻分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中......
  • 1.0 Mysql索引的数据结构与算法
    索引是高效获取排序好的数据结构索引本身就是数据一部分关键信息,通过索引大大减少索引的数据量。索引信息需要额外的空间存储。创建和维护索引本身也会降低对数据的操作......