网站首页 > 技术文章 正文
许多学习编程的人,包括我这名小学生[憨笑],至少都会有一些算法基础[狗头],而一提到时间复杂度,大家肯定都不陌生吧!
我们今天就来聊一聊时间复杂度。
当我们要比较哪一个算法的运行时间、效率更高时,可能要测每个算法的运行时间,但问题是,每台电脑的运行速度可不一样,如winx64和winx32,一个每次计算64位数,一个每次才32位,所以运行时间会出现很大差别。
这时,我们就要用时间复杂度来表示了!
我们先来看看这几组代码:
print("hello world")
for i in range(n):
print("hello world")
for i in range(n):
for j in range(n):
print("hello world")
请问哪组代码的运行时间长?如果n>1,肯定是第三组运行时间长。
那还有没有办法可以表示哪组运行时间长?
这就是我们今天要讲的用来表示算法效率的方式——时间复杂度
为了更好的理解它,我们先来估计做一些事件的时间:
眨一下眼睛 几毫秒
口算"39+68" 几秒
烧一壶水 几分钟
睡一觉 几小时
完成一个项目 几天/几个星期/几个月
飞船从地球飞出太阳系 几年
而毫秒、秒、小时、年我们称之为单位,时间复杂度也有单位
O(1)就是一个时间复杂度,“1”则代表单位
如
print("hello world")
我们定义这段代码的时间复杂度为O(1)
for i in range(n):
print("hello world")
因为这段代码比print("hello world")多运行了n次,所以我们定义它的时间复杂度为O(n)
for i in range(n):
for i in range(n):
print("hello world")
以此类推,这段代码比
for i in range(n):
print("hello world")
多运行了n次,所以时间复杂度为O(n2)
那么问题来了,这几组代码的时间复杂度为几呢?
print("hello world")
print("hello world")
print("hello world")
for i in range(n):
print("hello world")
for i in range(n):
print("hello world")
大家的答案可能是O(3)和O(n+n2)对不对?错了。
因为O()中的"括号里代表的是一个单位,如果写成O(3),就相当于问你一壶水烧几分钟,没有人会回答烧了几个3分钟。
所以像第一组代码一样,我们定义的单位是1,所以将O(3)写成O(1),n2+n不是一个单位,所以O(n2+n)写成O(n2),+n就被忽略了。
我们再来看看这组代码:
while n>1:
print(n)
n=n//2
这次时间复杂度又有所不同呢?
我们可以发现,代入n=64,输出为:
64,32,16,8,4,2
运行次数为6次,发现2^6=64
log2 64=6
时间复杂度就记为O(logn) ,省去了2
这种情况就是循环每次减半。
时间复杂度-小结:
1、一般来说,时间复杂度高的算法比时间复杂度低的算法慢
2、常见的时间复杂度(按速度排序):
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
3、复杂算法的时间复杂度:
O(n!)、O(2^n)、O(n^n)
今天就给大家讲到这里!
- 上一篇: 8个常见的机器学习算法的计算复杂度总结
- 下一篇: 算法从入门到精通——算法复杂度 算法的复杂度计算
猜你喜欢
- 2024-10-28 怎么判断一个算法的“好坏”程度——时间复杂度的计算
- 2024-10-28 递归算法的时间复杂度 递归算法时间复杂度计算
- 2024-10-28 从头开始学算法-算法复杂度分析 算法复杂度的方法
- 2024-10-28 「图解算法数据结构」——空间复杂度
- 2024-10-28 第002讲:算法与时间复杂度的基本概念
- 2024-10-28 算法分析:算法的评价因素、时间复杂度及空间复杂度#知识分享
- 2024-10-28 代码的圈复杂度 代码圈复杂度如何计算
- 2024-10-28 十大排序算法时空复杂度 十大排序算法时空复杂度怎么算
- 2024-10-28 二、复杂度分析 — 算法效率评估 算法复杂度的分析方法
- 2024-10-28 我们如何评估算法的复杂度 如何评价一个算法的计算复杂度?
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)