python算法表示概念扫盲教程


Posted in Python onApril 13, 2017

本文为大家讲解了python算法表示概念,供大家参考,具体内容如下

常数阶O(1)

常数又称定数,是指一个数值不变的常量,与之相反的是变量

为什么下面算法的时间复杂度不是O(3),而是O(1)。

int sum = 0,n = 100; /*执行一次*/ 
sum = (1+n)*n/2; /*执行一次*/ 
printf("%d", sum); /*行次*/

这个算法的运行次数函数是f(n)=3。根据我们推导大O阶的方法,第一步就是把常数项3改为1。在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时间复杂度为O(1)。

另外,我们试想一下,如果这个算法当中的语句sum=(1+n)*n/2有10句,即:

int sum = 0, n = 100; /*执行1次*/ 
sum = (1+n)*n/2; /*执行第1次*/ 
sum = (1+n)*n/2; /*执行第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次*/ 
sum = (1+n)*n/2; /*执行第7次*/ 
sum = (1+n)*n/2; /*执行第8次*/ 
sum = (1+n)*n/2; /*执行第9次*/ 
sum = (1+n)*n/2; /*执行第10次*/ 
printf("%d",sum); /*执行1次*/

事实上无论n为多少,上面的两段代码就是3次和12次执行的差异。这种与问题的大小无关(n的多少),执行时间恒定的算法,我们称之为具有O(1)的时间复杂度,又叫常数阶。

注意:不管这个常数是多少,我们都记作O(1),而不能是O(3)、O(12)等其他任何数字,这是初学者常常犯的错误。 

推导大O阶方法

1.用常数1取代运行时间中的所有加法常数

2.在修改后的运行次数函数中,只保留最高阶项

3.如果最高阶项存在且不是1,则去除与这个项相乘的常数

对数阶O(log2n) 

对数

如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN, 。其中,a叫做对数的底数,N叫做真数。
5^2 = 25 , 记作 2= log5 25
对数是一种运算,与指数是互逆的运算。例如

① 3^2=9 <==> 2=log<3>9;

② 4^(3/2)=8 <==> 3/2=log<4>8;

③ 10^n=35 <==> n=lg35。为了使用方便,人们逐渐把以10为底的常用对数记作lgN

对数阶

int count = 1; 
while (count < n) 
{  
count = count * 2; /* 时间复杂度为O(1)的程序步骤序列 */ 
}

由于每次count乘以2之后,就距离n更近了一分。

也就是说,有多少个2相乘后大于n,则会退出循环。

由2^x=n得到x=log2n。所以这个循环的时间复杂度为O(logn)。 

线性阶O(n)  

执行时间随问题规模增长呈正比例增长

data = [ 8,3,67,77,78,22,6,3,88,21,2]
find_num = 22
for i in data:
  if i == 22:
    print("find",find_num,i )

线性对数阶O(nlog2n)

平方阶O(n^2)

for i in range(100):
 
  for k in range(100):
    print(i,k)

立方阶O(n^3)
k次方阶O(n^k),
指数阶O(2^n)。

随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

 python算法表示概念扫盲教程

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常见文件操作的函数示例代码
Nov 15 Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
对python判断是否回文数的实例详解
Feb 08 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
Python如何将模块打包并发布
Aug 30 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 Python
解决python 输出到csv 出现多空行的情况
Mar 24 Python
Python常用算法学习基础教程
Apr 13 #Python
视觉直观感受若干常用排序算法
Apr 13 #Python
python常见排序算法基础教程
Apr 13 #Python
python编程实现希尔排序
Apr 13 #Python
python实现解数独程序代码
Apr 12 #Python
python访问抓取网页常用命令总结
Apr 11 #Python
Python 登录网站详解及实例
Apr 11 #Python
You might like
自己动手做一个SQL解释器
2006/10/09 PHP
php ignore_user_abort与register_shutdown_function 使用方法
2009/06/14 PHP
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
php 文件上传类代码
2011/08/06 PHP
页面中js执行顺序
2009/11/09 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
实例浅析js的this
2016/12/11 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
python中查看变量内存地址的方法
2015/05/05 Python
python安装twisted的问题解析
2018/08/21 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
类如何去实现接口
2013/12/19 面试题
大四毕业生学习总结的自我评价
2013/10/31 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
调解协议书
2014/04/16 职场文书
微笑服务演讲稿
2014/05/13 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书