当前位置: 首页 > news >正文

Python算法性能分析-时间复杂度

时间复杂度:

算法的运行时间。

什么是大O:

大O用来表示上界的。

数据规模:

在这里插入图片描述

在决定使用哪些算法的时候,不是时间复杂越低的越好(因为简化后的时间复杂度忽略了常数项等等),要考虑数据规模,如果数据规模很小甚至可以用O(n^2)的算法比O(n)的更合适(在有常数项的时候)。

就像上图中 O(5n^2) 和 O(100n) 在n为20之前, 很明显 ,

O(5n^2)是更优的,所花费的时间也是最少的。

那为什么在计算时间复杂度的时候要忽略常数项系数呢,也就说O(100n) 就是O(n)的时间复杂度,
O(5n^2) 就是
O(n^2)
的时间复杂度,而且要默认O(n) 优于O(n^2) 呢 ?
这里就又涉及到大O的定义,因为大O就是数据量级突破一个点且数据量级非常大的情况下所表现出的时间复杂度,这个数据量也就是常数项系数已经不起决定性作用的数据量。

所以我们说的时间复杂度都是省略常数项系数的,是因为一般情况下都是默认数据规模足够的大,基于这样的事实,给出的算法时间复杂的的一个排行如下所示:

在这里插入图片描述

复杂表达式的化简

1、去掉运行时间中的加法常数项 (因为常数项并不会因为n的增大而增加计算机的操作次数)。
2、去掉常数系数(上文中已经详细讲过为什么可以去掉常数项的原因)。
3、只保留最高项,去掉数量级小一级的n (因为n^2 的数据规模远大于n),最终简化为:
例如:

O(2*n^2 + 10*n + 1000)

去掉运行时间中的加法常数项:

O(2*n^2 + 10*n)

去掉常数系数:

O(n^2 + n)

去掉数量级小一级的n:

O(n^2)

如果这一步理解有困难,那也可以做提取n的操作,变成O(n(n+1)) ,省略加法常数项后也就别变成了:

O(n^2)

O(logn)中的log是以什么为底?

平时说这个算法的时间复杂度是logn的,那么一定是log 以2为底n的对数么?

其实不然,也可以是以10为底n的对数,也可以是以20为底n的对数,但我们统一说 logn,也就是忽略底数的描述。

为什么可以这么做呢?如下图所示:
在这里插入图片描述
假如有两个算法的时间复杂度,分别是log以2为底n的对数和log以10为底n的对数,那么这里如果还记得高中数学的话,应该不难理解以2为底n的对数 = 以2为底10的对数 * 以10为底n的对数

而以2为底10的对数是一个常数,在上文已经讲述了我们计算时间复杂度是忽略常数项系数的。

抽象一下就是在时间复杂度的计算过程中,log以i为底n的对数等于log 以j为底n的对数,所以忽略了i,直接说是logn。

这样就应该不难理解为什么忽略底数了。

算法超时:

在这里插入图片描述
在这里插入图片描述
来源链接: link

相关文章:

  • java 基本微信小程序的心理咨询服务系统 uniapp 小程序
  • JQ----事件
  • FPGA 20个例程篇:16.HDMI显示彩色风景图
  • 【云原生之Docker实战】使用Docker部署NPS内网穿透工具
  • 应对过载- go-zero源码阅读
  • Python 的“self“参数是什么?
  • 模拟前端ADC芯片LH001-91,用于开发心电、脑电医疗设备
  • CAPL 封装了的SeedKey解锁函数,高复用性
  • 异常数据处理——3σ原则、箱线图
  • vue3.0 + tsx 构建el-button
  • 基于JAVA的TCP网络QQ聊天工具系统
  • 【WLAN】【调试】netsh wlan常用命令使用说明
  • 教程图文详解 - 网络安全(第八章)
  • Python数据分析案例08——预测泰坦尼克号乘员的生存(机器学习全流程)
  • 计算机四级——操作系统原理常用知识点个人总结(上)
  • Angular 4.x 动态创建组件
  • Effective Java 笔记(一)
  • EOS是什么
  • git 常用命令
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java多态
  • JDK 6和JDK 7中的substring()方法
  • linux安装openssl、swoole等扩展的具体步骤
  • SOFAMosn配置模型
  • spring + angular 实现导出excel
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Zepto.js源码学习之二
  • 阿里云Kubernetes容器服务上体验Knative
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 理清楚Vue的结构
  • 如何使用 JavaScript 解析 URL
  • 时间复杂度与空间复杂度分析
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 选择阿里云数据库HBase版十大理由
  • (12)目标检测_SSD基于pytorch搭建代码
  • (c语言)strcpy函数用法
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十一)c52学习之旅-动态数码管
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)插入排序
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转) Android中ViewStub组件使用
  • (转)socket Aio demo
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net 知识杂记
  • .Net6使用WebSocket与前端进行通信
  • .NET值类型变量“活”在哪?
  • 。Net下Windows服务程序开发疑惑
  • @Transactional类内部访问失效原因详解
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限