python数据结构算法优势_Python数据结构与算法(一)----- 算法效率
一.引入
先来看一道题:
如果a+b+c=1000, 且a2+b2=c^2(a,b,c为自然数),如何求出所有a,b,c可能的组合?
(1) 枚举法
import time
start_time = time.time()
for a in range(0,1001):
for b in range(0,1001):
for c in range(1,1001):
if a+b+c==1000 and a**2+b**2 == c**2:
print('a,b,c:%d,%d,%d'%(a,b,c))
end_time = time.time()
print('time:%d'%(end_time-start_time))
print('finished')
##基本步骤数量T = 1000*1000*1000*2
改进代码
import time
start_time = time.time()
for a in range(0,1001):
for b in range(0,1001):
c = 1000-a-b
if a**2+b**2 == c**2:
print('a,b,c:%d,%d,%d'%(a,b,c))
##每台机器执行的总时间不同
##但执行基本运算数量大体相同
end_time = time.time()
print('time:%d'%(end_time-start_time))
print('finished')
##基本步骤数量T(n)=n*n*(1+max(1,0))=n^2
算法的概念:是独立存在的一种解决问题的方法和思想
算法的五大特征:
(1)输入:算法具有0个或多个输入
(2)输出:至少有一个或多个输出
(3)有穷性:在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内执行
(4)确切性:每一步有确切的含义
(5)可行性:每一步是可行的
二 . 算法效率
时间复杂度和“大O计法”
时间复杂度:T(n) = n^3 * 2
大O计法:不用分析很精确 T(n) = n^3
最坏时间复杂度:
[1,2,4,8,6,5,3,1]排序 n^2
[1,2,3,4,5] for i in ls: n
(1) 最优时间复杂度:价值不大,没有提供什么有用信息
(2)最坏时间复杂度:提供了一种保证
(3)平均时间复杂度:是对算法的一个全面评价,没有提供保证
因此,主要关注最坏时间复杂度,然后最优时间敷在读
2. 时间复杂度的几条基本计算规则:
(1) 基本操作,即只有常数项
(2)顺序结构,按照加法进行计算
(3)循环结构,按照乘法进行计算
(4)分支结构,时间复杂度取最大值
(5)判断一个算法的效率时,往往只需要关注操作量的最高项次,其他次要项和常数项可以忽略
(6)在没有特殊说明时,我们通常分析最坏时间复杂度
3. 常见时间复杂度:
(1)12 O(1) 常数阶
(2) 2n+1 O(n) 线性阶
(3)3n^2 O(n2) 平方阶
(4)5logn. O(long) 对数阶
(5)2n+3nlogn+19 O(n*logn) nlogn阶
(6) 6n3+2n2+3n+4 O(n3) 立方阶
(7)2n O(2n) 指数阶
关系:
O(1)
三. Python内置类型性能分析
1. timeit模块
可以用来测试一小段代码的运行速度
class time.Timer(stmt=‘pass’,setup=‘pass’,time=)
time.Timer.timeit(n=1000000)
number参数时测试代码时的测试次数
测算list
from timeit import Timer
#li1 = [1,2]
#li2 = [23,5]
#li = li1 +li2
#li = [i for i in range(10000)]
#li = list[range(10000)]
def test1():
li = []
for i in range(10000):
li.append(i)
def test2():
li = []
for i in range(10000):
li += [i]
def test3():
li = [i for i in range(10000)]
def test4():
li = list(range(10000))
def test5():
li = []
for i in range(10000):
li.extend([i])
timer1 = Timer('test1()','from __main__ import test1')
print('append:',timer1.timeit(1000))
timer2 = Timer('test2()','from __main__ import test2')
print('+:',timer2.timeit(1000))
timer3 = Timer('test3()','from __main__ import test3')
print('[i from i in range]:',timer3.timeit(1000))
timer4 = Timer('test4()','from __main__ import test4')
print('list(range()):',timer4.timeit(1000))
timer5 = Timer('test5()','from __main__ import test5')
print('list(range()):',timer5.timeit(1000))
##最快的是timer5
def test6():
li = []
for i in range(10000):
li.append(i) ##从列表尾添加
def test7():
li = []
for i in range(10000):
li.insert(0,i) ##从列表头添加
timer6 = Timer('test6()','from __main__ import test6')
print('append:',timer6.timeit(1000))
timer7 = Timer('test7()','from __main__ import test5')
print('list(extend:',timer7.timeit(1000))
##对头添加比对尾添加慢
list 内置时间复杂度
dict内置时间复杂度
四. 数据结构
数据是一个抽象的概念,将其分类后得到程序设计语言中的基本类型。
数据元素之间不是独立的,存在特点的关系,这些关系便是数据结构。
程序=算法+数据结构
算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。
抽象数据类型:指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。
常用的数据运算有五种:插入,删除,修改,查找和排序
原文链接:https://blog.csdn.net/mangogogo321/article/details/106678151
python数据结构算法优势_Python数据结构与算法(一)----- 算法效率相关推荐
- python数据结构的列表_Python数据结构之列表
一,数据结构的概念 数据结构是通过某种方式组织在一起的数据集合,这些数据元素可以是数字或者字符,甚至可以是其他的数据结构. Python中最基本的数据结构是序列(sequence).序列中的每个元素被 ...
- pythonapriori算法特点_Python --深入浅出Apriori关联分析算法(一)
在美国有这样一家奇怪的超市, 它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加 .这家超市的名字叫做沃尔玛. 你会不会觉得有些不可思议?虽 ...
- python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...
本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...
- python递归编程题_Python数据结构与算法41:递归编程练习题4:铺瓷砖
注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为8分钟. 递归编程练习题4:铺瓷砖 给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格).红瓷 ...
- python 进制转换_Python数据结构与算法——递归应用之进制转换
高考加油 在前面的文章中堆栈也用于进制转换(存放余数).而递归也可以用于进制转换,有固定模式循环,并且可以规模越来越小的问题都可以转换成递归 栈与递归之间一定有点联系 整数转换成任意进制 日常运算都是 ...
- python线性回归算法简介_Python实现的简单线性回归算法实例分析
本文实例讲述了Python实现的简单线性回归算法.分享给大家供大家参考,具体如下: 用python实现R的线性模型(lm)中一元线性回归的简单方法,使用R的women示例数据,R的运行结果: > ...
- 基于python的贝叶斯分类算法预测_python机器学习:朴素贝叶斯分类算法
大数据挖掘DT机器学习 公众号: datayx 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.这 ...
- python如何计算超大整数_Python 实现大整数乘法算法
介绍原理 karatsuba 算法要求乘数与被乘数要满足以下几个条件,第一,乘数与被乘数的位数相同:第二,乘数与被乘数的位数应为 2 次幂,即为 2 ^ 2, 2 ^ 3, 2 ^ 4, 2 ^ ...
- python链表的创建_python数据结构之链表的实例讲解
在程序中,经常需要将组(通常是同为某个类型的)数据元素作为整体 管理和使,需要创建这种元素组,变量记录它们,传进传出函数等. 组数据中包含的元素个数可能发变化(可以增加或删除元素). 对于这种需求,最 ...
最新文章
- 美团点评APP在移动网络性能优化的实践,通用流行框架大全
- ANTLR VS FLEXBISON
- 基于JavaSwing+mysql的图书管理系统设计和实现
- 通过配置hosts.allow和hosts.deny文件允许或禁止ssh或telnet操作
- pyinstaller打包总结
- 支持rotate和大小限制的golang log库
- 第二百五十一节,Bootstrap项目实战--响应式轮播图
- matlab晶格图,科学网-MATLAB软件绘制一维双原子晶格的格波色散曲线-李金磊的博文...
- 小米cc9出厂线刷包_小米cc9 pro刷机教程,线刷升级更新官方系统包
- 基于Java毕业设计高考志愿智能辅助填报系统源码+系统+mysql+lw文档+部署软件
- php faker,PHP Faker 教程
- 【C语言初阶】——简易版·扫雷(9*9)【运行逻辑思维导图+细节讲解+源码】【初级】
- 语音转文字软件哪个好?快来看看这几个软件
- grep搜索特定文件
- IEEE754 浮点数的表示方法
- 2022暑期项目实训(一)
- chdir改变当前目录
- android x86耗电,X86挑战ARM 29项测试揭秘鲜为人知的功耗
- Flutter编程之BoxDecoration用法详解
- A. Boredom(线性dp基础题)
热门文章
- JS_Java_Oracle_MySQL截取字符串的函数
- java 实例对象拷贝,实例详解java对象拷贝
- python实现api接口的脚本_Zabbix批量添加主机,Python调用api接口方式【脚本定制】...
- java 消息队列服务_ActiveMQ 消息队列服务
- python自动解析json_Python语言解析JSON详解
- AppScan api登录接口 postman_如何通过Postman调用EDI系统的API?
- html如何在画布上加层,在Canvas中嵌套Html
- 纯净pe工具_微PE工具箱2.0
- 解决Windows 10 CPU占用高风扇吵问题
- 【渝粤教育】国家开放大学2018年春季 3818-22T燃气工程施工 参考试题