python高斯求和_二、算法分析

一、什么是算法分析

程序和算法的区别:

算法是对问题解决的分步描述

程序是采用某种编程语言实现的算法,同一个算法通过不同的程序员采用不同的编程语言,能产生很多程序

算法分析的概念:

算法分析主要就是从计算资源消耗的角度来评判和比较算法

更高效利用计算资源,或者更少占用计算资源的算法,就是好算法

计算资源指标:

一种是算法解决问题过程中需要的存储空间或内存

另一种是算法的执行时间

运行时间检测:

1 #累计求和程序的运行时间检测

2 #迭代法

3 importtime4

5 defsum1(n):6 start =time.time()7 theSum =08 for i in range(1,n+1):9 theSum +=i10 end =time.time()11 return theSum, end -start12

13 for i in range(5):14 print('Sum is %d required %10.7f seconds'%sum1(10000))

n = 10000 时,执行5次的结果为

Sum is 50005000 required 0.0000000seconds

Sumis 50005000 required 0.0009980seconds

Sumis 50005000 required 0.0000000seconds

Sumis 50005000 required 0.0000000seconds

Sumis 50005000 required 0.0009968 seconds

n = 100000 时, 执行5次的结果为

Sum is 5000050000 required 0.0049877seconds

Sumis 5000050000 required 0.0049853seconds

Sumis 5000050000 required 0.0049860seconds

Sumis 5000050000 required 0.0049872seconds

Sumis 5000050000 required 0.0049863 seconds

n = 1000000时,执行5次的结果为

Sum is 500000500000 required 0.0528579seconds

Sumis 500000500000 required 0.0518231seconds

Sumis 500000500000 required 0.0528951seconds

Sumis 500000500000 required 0.0519009seconds

Sumis 500000500000 required 0.0527823 seconds

1 #累计求和程序的运行时间检测

2 #利用高斯求和公式的无迭代算法

3 importtime4

5 defsum2(n):6 start =time.time()7 theSum = (n * (n+1)) / 2

8 end =time.time()9 return theSum, end -start10

11 for i in range(5):12 print('Sum is %d required %10.7f seconds'%sum2(10000))

n = 10000,100000,1000000时,执行5次的结果时间均相同,为0.0000000 seconds

比较:

第一种迭代算法包含一个循环,这个循环运行次数跟累加值n有关,n增加,循环次数也会增加

第二种无迭代算法运行时间比第一种短很多,运行时间与累计对象n的大小无关

二、大O表示法

算法时间度量指标:

一个算法所实施的操作数量或步骤数可作为独立于具体程序/机器的度量指标

赋值语句是度量指标的一个合适选择,一条赋值语句同时包含了(表达式)计算和(变量)存储两个基本资源

数量级函数(Order of Magnitude)

基本操作数量函数T(n)的精确值不是特别重要,重要的是T(n)中起决定性因素的主导部分

数量级函数描述了T(n)中随着n增加而增加速度最快的主导部分

d990d0d2709207bdf2593bbfacd6f8d6.png

常见的大O数量级函数:

8c0f975ca89d8c13a35c06801d46e5cd.png

5a1abe4fbd87123b34af9635703c897b.png

86706c012190dad69670e95fc0726815.png

三、"变位词"判断问题

9007901b1ccfb79f9e23a31e9b05c3c0.png

22b72cf922f943647b2d98ef0d9c6dc7.png

5ec374be2595952cf2dfb1a7ef23b654.png

1 #解法1:逐字检查

2

3 defanagramSolution1(s1, s2):4 alist =list(s2)5 pos1 =06 stillOK =True7 while pos1 < len(s1) andstillOK:8 pos2 =09 found =False10 while pos2 < len(alist) and notfound:11 if s1[pos1] ==s2[pos2]:12 found =True13 else:14 pos2 = pos2 + 1

15 iffound:16 alist[pos2] =None17 else:18 stillOK =False19 pos1 = pos1 + 1

20 returnstillOK21

22 print(anagramSolution1('abcd','cabd'))

c9c8e8c182bc01a1c6829724491968ff.png

68f724bad5a33d9a9f6bd2ca7369ecb7.png

24ffbdb08452179e1accf77abf129c75.png

1 #解法2:排序比较

2

3 defanagramSolution2(s1, s2):4 alist1 =list(s1)5 alist2 =list(s2)6

7 alist1.sort()8 alist2.sort()9 pos =010 matches =True11 while pos < len(s1) andmatches:12 if alist1[pos] ==alist2[pos]:13 pos = pos + 1

14 else:15 matches =False16 returnmatches17

18 print(anagramSolution2('abcde','edcba'))

d3d25b88f5579714a5041adc87811627.png

335ad28bd0019809bdcb33d538feff37.png

1 #解法4:计数比较

2

3 defanagramSolution4(s1, s2):4 c1 = [0] * 26

5 c2 = [0] * 26

6 for i ins1:7 pos = ord(i) - ord('a')8 c1[pos] = c1[pos] + 1

9 for j ins2:10 pos = ord(j) - ord('a')11 c2[pos] = c2[pos] + 1

12 k =013 stillOK =True14 while k < 26 andstillOK:15 if c1[k] ==c2[k]:16 k = k + 1

17 else:18 stillOK =False19 returnstillOK20

21 print(anagramSolution4('abcde','edcba'))

d1827162e8ca682004875b3da5c75c31.png

4050aed6a60eac7240b9b38d532260ec.png

四、Python数据类型的性能

1、列表list和字典dict的对比:

4f9d3082e5efeaddbf11ed17c48df7be.png

2、4种生成前n个整数列表的方法性能比较

1 #4种生成前n个整数列表的方法性能比较

2 from timeit importTimer3

4 deftest1():5 l =[]6 for i in range(1000):7 l = l +[i]8

9 deftest2():10 l =[]11 for i in range(1000):12 l.append(i)13

14 deftest3():15 l = [i for i in range(1000)]16

17 deftest4():18 l = list(range(1000))19

20 t1 = Timer('test1()','from __main__ import test1') #创建一个Timer对象,指定需要反复运行的语句和只需要运行一次的“安装语句”

21 print('concat %f seconds\n' % t1.timeit(number=10000)) #调用Timer对象的timeit方法,其中可以指定反复运行多少次

22

23 t2 = Timer('test2()','from __main__ import test2')24 print('append %f seconds\n' % t2.timeit(number=10000))25 t3 = Timer('test3()','from __main__ import test3')26 print('comprehension %f seconds\n' % t3.timeit(number=10000))27 t4 = Timer('test4()','from __main__ import test4')28 print('list range %f seconds\n' % t4.timeit(number=10000))

concat 14.517047seconds

append0.859504seconds

comprehension0.517713seconds

list range0.127913 seconds

3、list.pop的计时试验

17a026d286879ef067552fb8f298952a.png

#-*- coding: utf-8 -*-

"""Created on Thu Oct 17 20:30:27 2019

@author: wu"""

#list.pop的计时试验,比较pop()和pop(0)两种方法

from timeit importTimerimporttimeitimportnumpy as npimportmatplotlib.pyplot as plt

pop0= timeit.Timer('x.pop(0)','from __main__ import x')

popend= timeit.Timer('x.pop()','from __main__ import x')print('pop(0) pop()')

l1=[]

l2=[]for i in range(1000000,10000001,100000):

x=list(range(i))

pt= popend.timeit(number=100)

l1.append(pt)

x=list(range(i))

pz= pop0.timeit(number=100)

l2.append(pz)print('%15.5f,%15.5f' %(pz,pt))

j= np.arange(1000000,10000001,100000)

plt.plot(j,l1,label='pop')

plt.plot(j,l2,label='pop0')

plt.xlabel('n')

plt.ylabel('time(s)')

plt.legend()

plt.show()

f32aab8ef841f9eba33d780ab7dae5d5.png

4、list和dict的in操作对比

1 #验证list中检索一个值,以及dict中检索一个值的对比

2 importtimeit3 importrandom4 importnumpy as np5 importmatplotlib.pyplot as plt6

7 l1,l2 =[],[]8 n =[]9 for i in range(10000,1000001,20000):10 t = timeit.Timer('random.randrange(%d) in x'%i,'from __main__ import random,x')11 x =list(range(i))12 lst_time = t.timeit(number=100)13 l1.append(lst_time)14 x = {j:None for j inrange(i)}15 d_time = t.timeit(number=100)16 l2.append(d_time)17 print('{},{:10.3f},{:10.3f}'.format(i,lst_time,d_time))18

19 for i in range(10000,1000001,20000):20 n.append(i)21

22 plt.plot(n,l1,'go-',label='list')23 plt.plot(n,l2,'r*-',label='dict')24 plt.xlabel('n')25 plt.ylabel('time')26 plt.legend()27 plt.show()28

25853e85684919e1d73796dc21adf339.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件:交换机基础知识

1、交换机的概念交换机&#xff08;Switch&#xff09;意为“开关”&#xff0c;是一种用于电&#xff08;光&#xff09;信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交…

硬件:宽带猫(光猫)的基础知识

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Sentinel介绍和Windows下安装Sentinel-dashboard

Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a;Sentinel 承接…

盘点物联网常用的八种通信协议

目录 1、蓝牙 2、Zigbee 3、6LoWPAN 4、Wi-Fi 6、ModBus 7、PROFINET 8、EtherCAT 1、蓝牙 兼容的蓝牙IoT传感器非常适合需要短距离连接和低功率通信的应用。蓝牙协议的有效范围为50到100米&#xff0c;支持高达1 Mbps的数据传输速率。 最近&#xff0c;物联网开发人员已经表现…

docker安装Sentinel

1:拉取镜像&#xff1a;docker pull bladex/sentinel-dashboard 2:启动 docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard 3&#xff1a;访问 http://公网ip:8858 4&#xff1a;登录,用户名和密码都是sentinel

蓝牙技术的工作原理及用途

所谓蓝牙技术就是一种全球无线通讯标准&#xff0c;在一定距离内连接设备。目前&#xff0c;蓝牙技术也已应用到各个领域中&#xff0c;并已成为接入物联网&#xff08;IOT&#xff09;的主要技术。那关于蓝牙技术的工作原理本文将进行介绍&#xff0c;并概括其特点。蓝牙技术的…

什么是BusyBox?

BusyBox 是标准 Linux 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具&#xff0c;例如 cat 和 echo&#xff0c;还包含了一些更大、更复杂的工具&#xff0c;例如 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀.简单的说BusyBox就好…

同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier

如果一个接口有2个以上不同的实现类, 那么如何Autowire一个指定的实现 1:首先,UserService接口有两个实现类 UserService1和 UserService2 UserService接口 2:以下是UserService接口的两个实现类UserService1和UserService2&#xff0c;请注意service注解的使用方式&#xff…

java类型比较_java 基本数据类型 ==和equals()比较

1.基本类型的存储Java 8种基本类型都是存储在堆栈中&#xff0c;例&#xff1a;int i 1;String str "hello world";也是存储在堆栈中。new基本类型的包装器类型和new String()都是存储在堆内存中。例Integer i new Integer(1);String str new String("hello…

嵌入式操作系统的主要特点都有哪些

嵌入式操作系统&#xff08;EOS&#xff09;是指用于嵌入式系统的操作系统。嵌入式操作系统是一种用途广泛的系统软件&#xff0c;通常包括与硬件的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式系统分为4层&#xff1a;硬件层、驱动层、…

java的继承实例_Java继承和多态实例

我们知道面向对象的三大特性是封装、继承和多态。然而我们有时候总是搞不清楚这些概念。下面对这些概念进行整理&#xff0c;为以后面向抽象的编程打下坚实的基础。封装的概念还是很容易理解的。如果你会定义类&#xff0c;那么相信你对封装的概念已经完全掌握了。下面定义的几…

【数据库】13种会导致索引失效语句写法

数据库的索引是保证数据快速查询的重中之重&#xff0c;以下13种会导致索引失效语句会导致你的SQL查询索引失效&#xff0c;具体如下&#xff1a;1、使用like关键字模糊查询时&#xff0c;% 放在前面索引不起作用&#xff0c;只有“%”不在第一个位置&#xff0c;索引才会生效&…

yii2史上最简单式安装教程,没有之一

作者&#xff1a;白狼 出处&#xff1a;www.manks.top/article/yii2_install 本文版权归作者&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;否则保留追究法律责任的权利。 最近有小伙伴私聊我&…

java static调用吗_Java中的static的使用

1.Java 中被static修饰的成员称为静态成员或类成员。它属于整个类所有&#xff0c;而不是某个对象所有&#xff0c;即被类的所有对象所共享、且优先于对象存在。静态成员可以使用类名直接访问&#xff0c;也可以使用对象名进行访问。使用 static 可以修饰变量、方法和代码块。2…

15个搞笑的程序员段子

1. 问答Q&#xff1a;你是怎么区分一个内向的程序员和一个外向的程序员的&#xff1f;A&#xff1a;外向的程序员会看着你的鞋和你说话时。Q&#xff1a;为什么程序员不能区分万圣节和圣诞节&#xff1f;A&#xff1a;这是因为 Oct 31 Dec 25&#xff01;&#xff08;八进制的…

盘点15个搞笑的程序员段子

1.车Delphi象吉普车&#xff0c;什么路上都能开&#xff0c;却在啥路上也开不好&#xff1b;PB就象卡丁车&#xff0c;只能在固定线路上开&#xff0c;到室外就有些不稳&#xff1b;VC象跑车&#xff0c;你开得起却买不 起&#xff0c;而且一旦发生故障&#xff0c;想修都找不到…

如何保证消息不被重复消费~~~~~(如何保证消息队列的幂等性)

分析&#xff1a;这个问题其实换一种问法就是&#xff0c;如何保证消息队列的幂等性&#xff1f;这个问题可以认为是消息队列领域的基本问题。换句话来说&#xff0c;是在考察你的设计能力&#xff0c;这个问题的回答可以根据具体的业务场景来答&#xff0c;没有固定的答案。 回…

SpringBoot:搭建第一个Web程序

本文简单介绍一下spingBoot搭建web程序的流程&#xff0c;希望对入门学习spingBoot的朋友有所帮助。本文采用的开发工具是IDEA。 1、打开IDEA&#xff0c;创建项目。 2、点击创建项目&#xff0c;进入下一步&#xff0c;具体按照画红框的操作。 3、点击下一步 4、点击下一步&am…