记录学习——算法时间复杂度求法
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
- 用常数1取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
- 得到的最后结果就是大O阶。
常数阶
先举了例子,如下所示。
1 int sum = 0,n = 100; //执行一次 2 sum = (1+n)*n/2; //执行一次 3 sum = (1+n)*n/2; //执行二次 4 sum = (1+n)*n/2; //执行三次 5 sum = (1+n)*n/2; //执行四次 6 printf(sum); //执行一次
上面算法的运行的次数的函数为f(n)=3,根据推导大O阶的规则1,我们需要将常数3改为1,则这个算法的时间复杂度为O(1)。如果sum = (1+n)*n/2这条语句再执行10遍,因为这与问题大小n的值并没有关系,所以这个算法的时间复杂度仍旧是O(1),我们可以称之为常数阶。
线性阶
线性阶主要要分析循环结构的运行情况,如下所示。
1 for(int i=0;i<n;i++){ 2 //时间复杂度为O(1)的算法 3 ... 4 }
上面算法循环体中的代码执行了n次,因此时间复杂度为O(n)。
对数阶
接着看如下代码:
1 int number=1; 2 while(number<n){ 3 number=number*2; 4 //时间复杂度为O(1)的算法 5 ... 6 }
可以看出上面的代码,随着number每次乘以2后,都会越来越接近n,当number不小于n时就会退出循环。假设循环的次数为X,则由2^x=n得出x=log₂n,因此得出这个算法的时间复杂度为O(logn)。
平方阶
下面的代码是循环嵌套:
1 for(int i=0;i<n;i++){ 2 for(int j=0;j<n;i++){ 3 //复杂度为O(1)的算法 4 ... 5 } 6 }
内层循环的时间复杂度在讲到线性阶时就已经得知是O(n),现在经过外层循环n次,那么这段算法的时间复杂度则为O(n²)。
其他常见复杂度
除了常数阶、线性阶、平方阶、对数阶,还有如下时间复杂度:
f(n)=nlogn时,时间复杂度为O(nlogn),可以称为nlogn阶。
f(n)=n³时,时间复杂度为O(n³),可以称为立方阶。
f(n)=2ⁿ时,时间复杂度为O(2ⁿ),可以称为指数阶。
f(n)=n!时,时间复杂度为O(n!),可以称为阶乘阶。
f(n)=(√n时,时间复杂度为O(√n),可以称为平方根阶。
一个进阶实例:
1 int num1, num2; 2 for(int i=0; i<n; i++){ 3 num1 += 1; 4 for(int j=1; j<=n; j++){ 5 num2 += num1; 6 } 7 }
分析:
语句int num1, num2;的频度为1;
语句i=0;的频度为1;
语句i<n; i++; num1+=1; j=1; 的频度为n;
语句j<=n; j++; num2+=num1;的频度为n*n;
T(n) = 2 + 4n + 3n*n
所以时间复杂度是:n^2
转载于:https://www.cnblogs.com/Da4er/p/11174106.html
记录学习——算法时间复杂度求法相关推荐
- LeetCode0:学习算法必备知识:时间复杂度与空间复杂度的计算
算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.算法是大厂.外企面试的必备项,也是每个高级程序员的必备技能.针对同一问题,可以有很多种算法来解决,但不同的算法在效率和占用存储空间上 ...
- 集成学习-Boosting集成学习算法LightGBM
在2017年年1月微软在GitHub的上开源了一个新的升压工具LightGBM(Light Gradient Boosting Machine ).它是一种优秀的机器学习算法框架,与XGBoost算法 ...
- fifo算法模拟_我是怎样学习算法的?(V1.0)
我相信很多人都是因为找工作才去看数据结构与算法,我自己也是出于这个目的.我自己在学习数据结构和算法上走了很多弯路,原因就是没有系统地的去学习.看了很多书,刷了很多题,浪费了不少时间,所以希望看到这篇文 ...
- 学习算法第一天:算法初步
一.学习算法必要性why: 应用:机器学习.数据挖掘.自然语言处理.密码学.计算机图形学等 找工作:贪心.分治.动态规划.树.图等. 二.怎么做how? 穷举法(万能算法) 求N个数的全排列 8皇后问 ...
- Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。
数据结构与算法入门 问题1:为什么要学习数据结构 如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...
- 《趣学算法(第2版)》读书笔记 Part 1 :如何高效学习算法
14天阅读挑战赛 系列笔记链接 <趣学算法(第2版)>读书笔记 Part 1 :如何高效学习算法 <趣学算法(第2版)>读书笔记 Part 2 :算法入门 <趣学算法(第 ...
- 新手如何学习算法?算法如何入门以及零基础入门算法应该学些什么?
搬运工,看到一篇关于算法学习之路的总结,希望对你有帮助. 原文链接:zh.lucida.me/blog/on-le 我的算法学习之路 MAY 4TH, 2014 | COMMENTS 关于 严格来说 ...
- 新手收入学习算法?算法如何入门以及零基础入门算法应该学些什么?学习路线是什么...
作者:周末 链接:https://www.zhihu.com/question/27984119/answer/39116336 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- 机器学习 | 基础通俗讲解集成学习算法!
来源:Datawhale 本文约6000字,建议阅读10+分钟 本文以图文的形式对模型算法中的集成学习,以及对集中学习在深度学习中的应用进行了详细解读. 标签:机器学习 数据及背景 阿里天池-零基础入 ...
最新文章
- CentOS 修改/etc/resolv.conf 重启network后又恢复到原来的状态
- 求1+2!+3!+......+20!的和
- 智能会议系统(3)---Android VoIP系统实现原理
- 保密检查便携式计算机,Lyaept关于便携式计算机和移动存储介质保密管理制度.doc...
- pythonATM,购物车项目实战5-数据处理层
- linux命令行安装qq,在Linux上使用mojoqq来实现命令行QQ
- Docker安装Jenkins教程
- 计算机基础知识——计算机概述
- Halcon教程七:简单的回形针识别案例
- Linux日文教程,在Deepin/Ubuntu下安装fcitx-Anthy以输入日语(日文)
- 计算机设备管理器无com,计算机无设备管理器的方法
- NodeJS必知基础知识(非巨详细)
- 在macOS上运行bitcoin客户端
- mysql rpl_MySQL半同步复制rpl_semi_sync_master_timeout测试
- 微信小程序—火车票查询
- OPC:服务器开发(一)如何开发OPC Server
- ARM7(LPC2xxx)芯片的小总结
- catia v5r18 百度云_catia v5r18 64位免费版 附带安装教程
- 基于Layui自定义内容轮播插件
- 【5G核心网】free5GC UPF源码分析