python数据结构与算法学习自修第二天【时间复杂度与大O表示法】
#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_
from Queue import Queue
import time
que = Queue()
time_begin = time.time()
# 如果a+b+c=1000, 且a^2+b^2=c^2,a,b,c为自然数,求出a,b,c所有的组合
# 使用枚举法计算结果
for a in range(1001):
for b in range(1001):
for c in range(1001):
if a + b + c == 1000 and a**2 + b**2 == c**2:
que.put({'a':a, 'b':b, 'c':c})
time_end = time.time()
print "运行的时间为 %d, 求解的结果如下:" % (time_end-time_begin)
for item in range(que.qsize()):
print que.get()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day1/abc.py
运行的时间为 124, 求解的结果如下:
{'a': 0, 'c': 500, 'b': 500}
{'a': 200, 'c': 425, 'b': 375}
{'a': 375, 'c': 425, 'b': 200}
{'a': 500, 'c': 500, 'b': 0}
Process finished with exit code 0
同样的问题,采用不同的算法,运行时间大大降低,如下:
#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_
from Queue import Queue
import time
que = Queue()
time_begin = time.time()
# 如果a+b+c=1000, 且a^2+b^2=c^2,a,b,c为自然数,求出a,b,c所有的组合
# 使用枚举法计算结果
for a in range(1001):
for b in range(1001):
c = 1000 - a - b
if a**2 + b**2 == c**2:
que.put({'a':a, 'b':b, 'c':c})
time_end = time.time()
print "运行的时间为 %d, 求解的结果如下:" % (time_end-time_begin)
for item in range(que.qsize()):
print que.get()
结果:
/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day1/abc2.py
运行的时间为 0, 求解的结果如下:
{'a': 0, 'c': 500, 'b': 500}
{'a': 200, 'c': 425, 'b': 375}
{'a': 375, 'c': 425, 'b': 200}
{'a': 500, 'c': 500, 'b': 0}
Process finished with exit code 0
同样的问题,发现第一种算法用的时间为124S,第二种方法用的时间为不到1S;这就需要对不同的算法衡量运行效率;
如何衡量效率呢?运行效率不仅和运行时间有关,还和计算机的运行环境有关,同样的算法,在不同的计算机上执行,执行时间也是不一样的。
所以,运行效率应该用执行步骤相关,将执行步骤成为时间复杂度。
在第一种算法中:T(n) = n^3 * 2
在第二种算法中:T(n) = n^2 * 3
若不考虑系统和偏置项,则为渐进函数,使用渐进函数表示即为大O表示法:
在第一种算法中:T(n) = O(n^3)
在第二种算法中:T(n) = O(n^2)
python数据结构与算法学习自修第二天【时间复杂度与大O表示法】的更多相关文章
- python数据结构与算法第三天【时间复杂度计算方法】
最优时间复杂度(不可靠) 最坏时间复杂度(保证) 平均时间复杂度(平均状况) 不同语句的时间复杂度: (1)顺序语句:使用加法 (2)循环语句:使用乘法 (3)分支语句:使用坏时间复杂度 例如:如下代 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- 算法图解学习笔记01:二分查找&大O表示法
二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...
- 1. 时间复杂度(大O表示法)以及使用python实现栈
1.时间复杂度(大O表示法): O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n! ...
随机推荐
- Unexpected end of JSON input while parsing near
运行 npm cache clean --force 即可解决pm install出现”Unexpected end of JSON input while parsing near”错误.
- Python+Pycharm—学习—pip
1.pip是干什么的? 2.pip怎么安装? 3.pip怎么用?
- jupyter notebook 代码补全插件工具-nbextensions(并修改默认的工作目录)
# conda install -c conda-forge jupyter_contrib_nbextensionsCollecting package metadata: doneSolving ...
- Luogu P4169 [Violet]天使玩偶/SJY摆棋子
传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...
- Luogu P3379 【模板】最近公共祖先(LCA)
qwq 预处理出从$x$节点向上跳2i个节点的序号$p[x][i]$及节点深度$dpth[x]$, 寻找$lca$时,从$Max$(可能的最大深度)到0枚举$i$, 首先把较深的一个节点向上跳至深度相 ...
- [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
1.实验目的: 学习在PC机系统中扩展简单I/O 接口的方法 学习TurnipBit拼插编程 了解直流电机的工作原理 学习L298N的工作原理 学习TurnipBit扩展板L298N和按键模块的接线方 ...
- item 23: 理解std::move和std::forward
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 根据std::move和std::forward不 ...
- face recognition[Euclidean-distance-based loss][FaceNet]
本文来自<FaceNet: A Unified Embedding for Face Recognition and Clustering>.时间线为2015年6月.是谷歌的作品. 0 引 ...
- FineUIMvc随笔(7)扩展通知对话框(显示多个不重叠)
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 这篇文章我们将改造 FineUIMvc 默认的通知对话框,使得同时显示多个也不会重叠.并提前出一个公共的JS文件,供大家使用. ...
- SpringBoot整合Mybatis使用注解或XML的方式开发
2018-6-4 补充mybatis-spring-boot注解的使用 1.导包 只需要再导入mysql+mybatis两个包 <dependency> <groupId>or ...