网站首页 > 技术文章 正文
1什么是算法复杂度
身为程序员的我们都知道程序=数据结构+算法 算法=逻辑+控制。当我们要解决一个问题的时候,必然会经过以下几个步骤
问题的理解
数据结构设计
算法设计
算法分析
程序实现与测试
所谓时间复杂度就是衡量一个算法效率的手段
2如何比较算法的效率呢?
也就是比较算法的所用时间,但是一个算法所需要的时间和一下3个因素有关,规模 输入 算法本身,举一个例子:现在需要把1-10的乱序扑克牌从小到大排列。
10就是规模 ,输入就是乱序1-10的数字,算法就是看采取什么样的排序算法,就是上面说的算法设计。
抛开软件因素和硬件因素,算法是由一组语句构成,一个算法的效率就是一个语句执行了多少次,次数越少时间越少,算法效率更高。所以一个算法的基本操作次数和规模有一定的函数关系,这里算法的时间复杂度表达式为
3渐进分析
我们计算时间复杂度并不是要一个准确的值,而是一个相对近似的计算,大概知道所耗费的时间就行,所以就得用到渐进分析。
上界符号O
就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都不会大于g(n)。
图像表示如下:
下界符号Ω
这个刚好和上一个概念相反,上一个理解了这个也就理解了,
就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都大于等于g(n)。
也就是上图最右侧部分。
紧渐进符号Θ
这个也很好理解,就是时间复杂度函数值f(n)的值在两个函数之间,也就是上图最左侧部分。
非紧上界封号o
这种情况就是(上界符号O)的情况去掉等于的情况。
非紧下界封号w
这种情况就是(下界符号Ω)的情况去掉等于的情况。
于是我们就可以这样近似记忆
在渐进分析的基础之上,我们会经常遇到以下几种情况。
绘制成图像就是这样。
我们在分析时间复杂度的时候,都是找出循环次数最多的语句。计算出相关表达式,常用的表达式有以下几种。
了解了上面的东西我们来解释如何利用上面的知识进行计算。
求解算法的时间复杂度的具体步骤是:
⑴ 找出算法中的基本语句;
算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。
⑵ 计算基本语句的执行次数的数量级;
只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。
⑶ 用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:
案例1
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。
案例2
for (i=1;i<n;i++)
{
y=y+1; ①
for (j=0;j<=(2*n);j++)
x++; ②
}
解: 语句1的频度是n-1
语句2的频度是(n-1)*(2n+1)=2n2-n-1
f(n)=2n2-n-1+(n-1)=2n2-2;
又Θ(2n2-2)=n2
Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到
时间复杂度T(n)=O(n2).
再来看一个比较常见的log相关的
i=1; ①
while (i<=n)
i=i*2; ②
解: 语句1的频度是1,
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)=log2n,
T(n)=O(log2n )
以上就是算法的时间复杂度了,面试的时候就不用担心被问这个问题了,以后的文章我会分析leetcode等相关算法,每个题目分析时间复杂度,也就相当于是对知识的应用了。
持续分享编程数据结构与算法相关知识。
- 上一篇: 人工智能:怎样进行算法的复杂度分析?
- 下一篇: 算法复杂度 算法复杂度主要包括时间复杂度和空间复杂度
猜你喜欢
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)