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用ConfigObj读写配置文件的实现代码
Mar 04 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
在Python的Django框架中编写编译函数
Jul 20 Python
使用Python将数组的元素导出到变量中(unpacking)
Oct 27 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
python实现自动打卡的示例代码
Oct 10 Python
PyCharm+Miniconda3安装配置教程详解
Feb 16 Python
python re模块和正则表达式
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
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
php 类自动载入的方法
2015/06/03 PHP
PHP代码加密的方法总结
2020/03/13 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
Python实现的递归神经网络简单示例
2017/08/11 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
python读取与处理netcdf数据方式
2020/02/14 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
企业门卫岗位职责
2013/12/12 职场文书
文化活动实施方案
2014/03/28 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
2014年领班工作总结
2014/11/25 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
小学语文教师研修日志
2015/11/13 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python