Temporal Frequency& Time Complexity& Space Complexity

  • 计算算法执行时间
    • 时间复杂度(Time Complexity)
      • 常数阶O(1)
      • 对数阶O(log2n)
      • 线性阶O(n)
      • 线性对数阶O(nlog2n)
      • 平方阶O(n2)
      • 立方阶O(n^3)
      • k次方阶O(n^k)
      • 指数阶O(2^n)
  • 空间复杂度(Space Complexity)

计算算法执行时间

  • 时间频度(Temporal Frequency): 一个算法所花费的时间与算法中语句的执行次数成正比. 算法中的语句执行次数称为语句频度或时间频度. 通过 T(n)来表示时间频度
  • 计算1-100的所有数字之和, 通过两种算法计算:

int total = 0;
int end = 100;# 使用 for循环计算
for (i = 1; i <= end; i++) {total += i;
}
- 以上算法的时间频度是 T(n)=n+1# 不通过循环, 而直接计算
total = (1 + end) * end / 2;
- 以上算法的时间频度是 T(n)=1
  • 随着 n的变大有3个特点(3种可以忽略的项):
  1. 常数项

(1) 2n+20和2n随着 n的变大, 执行时间间隔无限接近, 所以20可以忽略
(2) 3n+10和3n随着 n的变大, 执行时间间隔无限接近, 所以10可以忽略

  1. 低次项

(1) 2n2+3n+10和2n2随着 n的变大, 执行时间间隔无限接近, 所以可以忽略3n+10
(2) n2+5n+20和n2随着 n的变大, 执行时间间隔无限接近, 可以忽略5n+20

  1. 系数

(1) 随着 n的变大 5n^2+7n和 3n^2+2n的执行时间间隔无限接近, 此时可以忽略5和3
(2) 然而 n^3+5n和 6n^3+4n的执行时间间隔会分离, 可以发现多少次方是关键

时间复杂度(Time Complexity)

  • 算法执行速度, 主要看时间复杂度
  1. 一般情况下, 算法中的基本操作语句的重复执行次数是问题规模 n的某个函数, 用 T(n)表示, 若有某个辅助函数 f(n), 使得当 n趋近于无穷大时, T(n)/f(n)的极限值为不等于零的常数, 则称 f(n)是T(n)的同数量级函数. 记作 T(n)=O(f(n)), O(f(n))为算法的渐进时间复杂度, 简称时间复杂度
  • 例: T(n)=n2+7n+6与 T(n)=3n2+2n+2, 它们的 T(n)不同, 但时间复杂度相同. 都为 O(n2)
  • 计算方式:
    (1) 用常数1代替运行时间中的所有加法常数 T(n)=n2+7n+6 → T(n)=n2+7n+1
    (2) 修改后的运行次数函数中, 只保留最高阶项 T(n)=n2+7n+1 → T(n)=n2
    (3) 去除最高阶项的系数 T(n)=n2 → T(n)=n2 → O(n2)
  • 8种常见的时间复杂度, 由小到大依次为:
  1. 常数阶O(1)
  2. 对数阶O(log2n)
  3. 线性阶O(n)
  4. 线性对数阶O(nlog2n)
  5. 平方阶O(n^2)
  6. 立方阶O(n^3)
  7. k次方阶O(n^k)
  8. 指数阶O(2^n)
  • 随着 n的不断增大, 上述时间复杂度不断增大, 算法的执行效率会越来越低

常数阶O(1)

  • 无论是多少行代码, 只要是没有循环等复杂结构, 那这个代码的时间复杂度就都为 O(1)

int a = 1;
int b = 2;
++a;
b++;
int c = a + b;
  • 上述代码在执行的时候, 所消耗的时间, 并不是随着某个变量的增长而增长, 所以无论这类代码有多少行, 都可以用 O(1)来表示时间复杂度

对数阶O(log2n)


int a = 1;
while (a < n) {a = a * 2;
}
  • 上述代码的 while每次循环都将 a乘以 2, 再将结果赋值给 a. 因此会越来越逼近 n大小. 假设循环 x次之后, a大于或等于 n了, 此时结束循环, 也就是2的 x次方等于 n(x=log2n), 也就是循环了 log2n次后结束循环
  • O(log2n)中2为底数, n为真数, 底数可以改变 若将2改为3 a = a * 3, 则可以标识为 O(log3n)

线性阶O(n)


for (int i = 1; i <= n; ++i) {i++;
}
  • 上述代码中 for循环内的代码会执行 n遍, 因此它消耗的时间是随着 n的变化而变化的, 因此这类代码都可以用 O(n)来表示

线性对数阶O(nlog2n)

  • 线性对数阶 O(nlogN)是将时间复杂度为 O(logn)的代码循环了 N遍的算法, 也就是线性阶和对数阶的嵌套 n*O(logN)

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

平方阶O(n2)

  • 平方阶就是嵌套了2层n循环, 也就是2层线性阶, 即 O(n²). 如果将其中一层循环的 n改成m, 那它的时间复杂度为 O(mn)

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

立方阶O(n^3)

  • 立方阶是嵌套了3层n循环

k次方阶O(n^k)

  • k次方阶是嵌套了 k层n循环

指数阶O(2^n)


public int abc(int n) {if (n <= 1) {return 1;} else {return abc(n - 1) + abc(n - 2);}
}
  • T(n)=T(n-1)+T(n-2)+1, 其中加1为算一次执行
  • T(n)=T(n-1)+T(n-2)是一个斐波那契数列(Fibonacci sequence, 黄金分割数列), 通过归纳证明法(Mathematical Induction, MI)可以证明. 即可以标识为 O((5/3)^n), 简化后为 O(2^n)

空间复杂度(Space Complexity)

  • 空间复杂度是一个算法在运行过程中临时所占用存储空间大小的量度, 有些算法是随着 n的变大, 随之占用更多的存储空间 如快速排序, 归并排序等
    * 目前趋势上, 算法主要关注的是时间复杂度. 还有市面上的 如 缓存系统, 基数排序算法等也都是空间换了时间, 提升了程序的执行速度

如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!

算法-时间频度 时间复杂度 空间复杂度相关推荐

  1. day001:数据结构和算法-时间频度和时间复杂度

    1.初识数据结构和算法 简单认识中:ArrayList的查询快点,插入慢.LinkedList查询慢,插入快.但是结论是将数据的大小为基础前提,相对的. -1^n 计算问题 编程问题:求(-1)^0 ...

  2. PHP复杂度,php 算法复杂度 时间复杂度 空间复杂度

    算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...

  3. 频度 java_JAVA中算法丨时间频度与时间复杂度

    时间频度 时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境都会造成不同的执行时间. 算法的执行时间和语句的执行次数成正比,因此通过计算执行测试来推断执行 ...

  4. 时间频度和时间复杂度

    时间频度/语句频度 时间频度也叫语句频度.时间频度表示代码运行的次数,代码运行的次数与时间正正比 小明去小红家,我们都知道两点直接线段最短.假设小明每走一步相当于,运行一次代码.则如果小明绕路走的话, ...

  5. 算法复杂度(时间频度,时间复杂度介绍计算,空间复杂度)

    算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 事后统计的方法(直接运行看花了多长时间) 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序:二是所得 ...

  6. 算法时间复杂度lg是多少_算法时间复杂度空间复杂度(附github)

    (*useful)标记:目前觉得有用的函数 //FIXME 标记:待补充 基本初等函数: 幂函数: 一般地,形如y=xα(α为有理数)的函数,即以底数为自变量,幂为因变量,指数为常数的函数称为幂函数. ...

  7. 8.时间频度和时间复杂度

    度量一个程序算法执行时间的两种方法 事后统计法: 直白就是把程序跑一边,统计程序从开始到结束花费的时间.缺点在于需要将程序跑一边,如果越到耗时程序的时候效率不高,而且要求计算机的硬件软件的环境一致,保 ...

  8. 数据结构与算法一:时间频度和时间复杂度

    数据结构系列博客涉及内容: 一.初识数据结构和算法: 1.数据结构: 数据结构:是相互之间存在一种或多种关系的数据元素的集合 研究什么:数据的逻辑结构与物理结构以及它们之间的相互关系 数据结构包括:线 ...

  9. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

最新文章

  1. 基于JavaWeb实现在线租房系统
  2. OpenCV下设置灰度直方图的阈值来对图像进行查找(查表)变换的源码
  3. 机器学习如何改变大数据管理
  4. tinymce vue 部分工具不显示_2018年编程工具发展趋势
  5. 文档生成工具Sandcastle Help File Builder
  6. JZOJ 5354. 【NOIP2017提高A组模拟9.9】导弹拦截
  7. VTK:IO之ConvertFile
  8. 钰群USB3.0音视频信号采集
  9. 【机器学习】Kmeans聚类
  10. Could not obtain connection metadata
  11. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库 总览
  12. Jack Dorsey二度卸任推特CEO,原CTO接棒,立即生效!
  13. 05.SQL Server大数据群集小试牛刀--HDFS查询
  14. 网友调侃特斯拉股价要冲向火星 马斯克:疯狂的时代
  15. git 查看修改明细_git查看某个文件的修改历史
  16. ftp匿名登录_flashfxp4,flashfxp4简介及好用的FTP工具
  17. 冈萨雷斯数字图像处理开篇
  18. c语言编程软件有哪些 Win7下用哪种C语言编译器
  19. 【Linux系列文章】Shell开发
  20. 【使用Unity开发Windows Phone上的2D游戏】(1)千里之行始于足下

热门文章

  1. 2014-2022年4月全国空气质量数据分析
  2. 我的世界java边境之地_我的世界:MC人迹罕至的6种“边境之地”,最后1种让人后背发凉!...
  3. Qbo’s concept and design
  4. Macbook上打开多个终端的方法
  5. MySQL图形化用户界面客户端的安装与介绍(SQLyog)
  6. 一个简单的密码登陆界面。C语言
  7. 无人机云台电机用的是哪种?
  8. 使用GridSearchCV对CatBoostClassifier分类器调参
  9. 工作流之Camunda开发记录(一)----常用API与流程
  10. SVG公众号排版『大尺寸背景图重复安卓不显示』解决方法