python算法表示概念扫盲教程

作者:金角大王 时间:2022-06-22 00:43:34 

本文为大家讲解了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,算法表示
0
投稿

猜你喜欢

  • Python编程中闭包的变量作用域问题解析

    2023-07-27 01:59:47
  • iframe全跨域高度自适应解决方案

    2008-12-21 16:16:00
  • 基本的页面设计元素布局比例

    2007-12-15 09:43:00
  • 对Python中内置异常层次结构详解

    2023-10-18 11:08:49
  • MSSQL 基本语法及实例操作语句

    2012-07-11 15:40:09
  • Python通过DOM和SAX方式解析XML的应用实例分享

    2023-10-15 10:46:32
  • K最近邻算法(KNN)---sklearn+python实现方式

    2023-09-14 15:29:31
  • [译]Javascript风格要素(一)

    2008-02-28 12:58:00
  • 机器学习经典算法-logistic回归代码详解

    2021-05-06 23:56:12
  • Python求解任意闭区间的所有素数

    2023-10-12 00:07:12
  • 教你快速了解公共MySQL的数据库服务器层

    2008-12-17 17:10:00
  • python实现Oracle查询分组的方法示例

    2021-03-30 10:59:54
  • perl 简明教程 perl教程集合

    2023-08-08 19:58:12
  • DSN和DSN-Less两种数据库连接方式哪一种更好?

    2009-10-28 18:26:00
  • Python操作PDF实现制作数据报告

    2022-05-09 21:41:51
  • Python 基于FIR实现Hilbert滤波器求信号包络详解

    2023-07-13 01:31:47
  • python str字符串转uuid实例

    2021-12-31 20:15:54
  • Python绘制专业的K线图 源代码解析

    2023-09-02 09:51:35
  • 如何恢复/修复MS SQL数据库的MDF文件

    2007-10-30 13:52:00
  • Python采集股票数据并制作可视化柱状图

    2023-01-10 12:34:27
  • asp之家 网络编程 m.aspxhome.com