一、什么是算法分析

程序和算法的区别:

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

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

算法分析的概念:

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

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

计算资源指标:

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

另一种是算法的执行时间

运行时间检测:

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增加而增加速度最快的主导部分

常见的大O数量级函数:

三、"变位词"判断问题

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'))

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'))

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'))

四、Python数据类型的性能

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

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的计时试验

#-*- 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()

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

python高斯求和_二、算法分析相关推荐

  1. python高斯求和_利用Python进行数据分析(3)- 列表、元组、字典、集合

    本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list.元组tuple.字典dict和集合set. image 索引 左边0开始,右边-1开始 通过index()函数查看索 ...

  2. python累加求和_李老师带你学Python-第二课 如何编写Python程序

    Python语言是一种解释型编程语言,它的程序结构由多条语句从上到下书写而成,每一行书写一条指令.如以下代码完成了从键盘读入两个整数,并输出它们的和. 在任何编程语言中,数据都要放置到变量中才能被指令 ...

  3. python绘制组织结构图_二、Python的程序组织结构

    1.顺序结构 注:计算机的流程控制:顺序结构.选择结构.循环结构 程序从上向下执行,直到结束. print('------程序开始------') print('1.把冰箱门打开') print('2 ...

  4. python加权求和_加权随机算法的python实现

    1 随机抽奖 本次运行环境为:win7 jupyter notebook python 3.6 1.1 随机抽取一个元素 用 random.choice() 来实现随机抽取一个元素.from rand ...

  5. python最大堆_二叉堆 及 大根堆的python实现

    Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...

  6. python高斯拟合_如何在python中拟合高斯曲线?

    有很多方法可以将高斯函数拟合到数据集.我经常在拟合数据时使用astropy,这就是为什么我想添加这个作为额外的答案. 我使用的一些数据集应该模拟高斯噪声:import numpy as np from ...

  7. python输出二进制数_二进制中1的个数(python)

    题目描述:输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析:如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1 ...

  8. python做数据分类_二分类怎么做数据分析python

    2018-11-15 回答 ipython ipython 是一个在多种编程语言之间进行交互计算的命令行 shell,最开始是用 python 开发的,提供增强的内省,富媒体,扩展的 shell 语法 ...

  9. python生成器迭代_二十、深入Python迭代器和生成器

    「@Author:Runsen」 学习python的过程中,迭代器与生成器是绕不开的话题, 什么是迭代器和生成器呢? 下面我们来了解一下什么是迭代.但在了解迭代器之前,首先需要知道什么是容器. 容器 ...

最新文章

  1. 高并发场景下的httpClient优化使用
  2. 【线索二叉树详解】数据结构06(java实现)
  3. mysql根据经纬度查询范围内数据,并根据距离排序
  4. Visual Studio Code搭建NodeJs的开发环境
  5. Python数据分析扩展库pandas的DataFrame排序方法小结
  6. “KVM is not available”的相应解决方案
  7. 微信小程序动画效果集合
  8. Json数据转化为DataTable的两种方法(vb.net)
  9. Web应用程序开发课程总结
  10. svn插件Subclipse
  11. 微信聊天记录删除了怎么恢复
  12. 高效能人士的七个习惯读后感与总结概括-(第二章)
  13. 在拉勾网对职位的数据爬取与分析
  14. 随机中文姓名 php,PHP生成随机中文姓名 阿星小栈
  15. 有料科普 | 三峡大坝怎么过船,无用但能吹牛皮的知识又增加了
  16. 大数据工程师就业前景及发展方向分析
  17. 用余弦算法做相似度匹配
  18. 多因子选选股MATLAB代码,MatlabCode 多因子模型构建。多因子模型是量化选股中最重要的一类模型 联合开发网 - pudn.com...
  19. CSS——CSS盒子模型(重点※)
  20. Oracle和MySql的布尔类型

热门文章

  1. 打开word2016总是出现很抱歉,此功能看似中断需要修复。。问题解决办法
  2. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波1 - 灰度变换和空间滤波基础、Sigmoid激活函数
  3. Jupyter notebook 不安装主题,通过修改css更改 默认字体,字体大小等
  4. golang log日志
  5. Git 分布式版本控制常用命令(1)
  6. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...
  7. 嵌入式控制系统和计算机系统
  8. Android监听事件
  9. WHENEVER SQLERROR EXIT SQL.SQLCODE
  10. DOMContentLoaded与interactive