Num01–>看下面案例两种算法比较

问题:如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),
如何求出所有a、b、c可能的组合?

#第一种计算解法:
import timestart_time = time.time()
for a in range(1001):for b in range(1001):for c in range(1001):if 1000 == a + b + c and a ** 2 + b ** 2 == c ** 2:print("a,b,c", (a, b, c))
end_time = time.time()
cast_time = end_time - start_time
print("花费时间:%d" % cast_time)
# 结果是:
# a,b,c (0, 500, 500)
# a,b,c (200, 375, 425)
# a,b,c (375, 200, 425)
# a,b,c (500, 0, 500)
# 花费时间:178秒
# 本案例共计计算步数为:1000*1000*1000*2
# 采用问题规模N来标记:  N  *  N *  N *2 = 2 * N^3
# 采用时间复杂度T(N)标记:T(N)=2 * N^3
# 最终用大O记法为:O(N^3)
 #第二种计算解法import timestart_time = time.time()for a in range(1001):for b in range(1001):c = 1000 - a - bif a ** 2 + b ** 2 == c ** 2:print("a,b,c", (a, b, c))end_time = time.time()cast_time = end_time - start_timeprint("花费时间:%d" % cast_time)
# 结果是:
# a,b,c (0, 500, 500)
# a,b,c (200, 375, 425)
# a,b,c (375, 200, 425)
# a,b,c (500, 0, 500)
# 花费时间:秒
# 本案例共计计算步数为:1000*1000*3
# 采用问题规模N来标记:  N  *  N * 3 = 3 * N^2
# 采用时间复杂度T(N)标记:T(N)=3 * N^2
# 最终用大O记法为:O(N^2)

Num02–>定义

    我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。显然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率。对于算法的时间效率,我们可以用“大O记法”来表示。“大O记法”:对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数(忽略常数),记为f(n)=O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。时间复杂度:假设存在函数g,使得算法A处理规模为n的问题示例,所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)

Num03–>如何理解大O记法

    对于算法进行特别具体的细致分析虽然很好,但在实践中的实际价值有限。对于算法的时间性质和空间性质,最重要的是其数量级和趋势,这些是分析算法效率的主要部分。而计量算法基本操作数量的规模函数中那些常量因子可以忽略不计。例如,可以认为3n^2和100n^2属于同一个量级,如果两个算法处理同样规模实例的代价分别为这两个函数,就认为它们的效率“差不多”,都为n^2级。

Num04–>最坏时间复杂度

分析算法时,存在几种可能的考虑:算法完成工作最少需要多少基本操作,即最优时间复杂度
算法完成工作最多需要多少基本操作,即最坏时间复杂度
算法完成工作平均需要多少基本操作,即平均时间复杂度对于最优时间复杂度,其价值不大,因为它没有提供什么有用信息,其反映的只是最乐观最理想的情况,没有参考价值。对于最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作。对于平均时间复杂度,是对算法的一个全面评价,因此它完整全面的反映了这个算法的性质。但另一方面,这种衡量并没有保证,不是每个计算都能在这个基本操作内完成。而且,对于平均情况的计算,也会因为应用算法的实例分布可能并不均匀而难以计算。因此,我们主要关注算法的最坏情况,亦即最坏时间复杂度。

Num05–>时间复杂度的几条基本计算规则

1、基本操作,即只有常数项,认为其时间复杂度为O(1)2、顺序结构,时间复杂度按加法进行计算3、循环结构,时间复杂度按乘法进行计算4、分支结构,时间复杂度取最大值5、判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略6、在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度

Num06–>空间复杂度

类似于时间复杂度的讨论,一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度。算法的时间复杂度和空间复杂度合称为算法的复杂度。
------------------------

Num07–>常见时间复杂度

Num08–>常见时间复杂度之间的关系

Num09–>Python内置类型性能分析

timeit模块timeit模块可以用来测试一小段Python代码的执行速度。class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)Timer是测量小段代码执行速度的类。stmt参数是要测试的代码语句(statment);setup参数是运行代码时需要的设置;timer参数是一个定时器函数,与平台有关。timeit.Timer.timeit(number=1000000)Timer类中测试语句执行速度的对象方法。number参数是测试代码时的测试次数,默认为1000000次。方法返回执行代码的平均耗时,一个float类型的秒数。

使用案例说明timeit模块的作用

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : xiaoke# python内置类型性能分析模块
import timeit# 以下采用五种list列表生成的函数,分析列表效率
# 采用相加的方法,[]+[]
def t1():list_test = []for i in range(1001):list_test = list_test + [i]# 采用尾部添加
def t2():list_test = []for i in range(1001):list_test.append(i)# 采用插入指定的位置
def t3():list_test = []for i in range(1001):list_test.insert(0, i)# 采用列表生成式
def t4():list_test = [x for x in range(1001)]# 采用list()函数
def t5():list_test = list(range(1001))# 构造
timeit1 = timeit.Timer("t1()", "from __main__ import t1")
timeit2 = timeit.Timer("t2()", "from __main__ import t2")
timeit3 = timeit.Timer("t3()", "from __main__ import t3")
timeit4 = timeit.Timer("t4()", "from __main__ import t4")
timeit5 = timeit.Timer("t5()", "from __main__ import t5")# 测试
print("[]+[]: %f" % timeit1.timeit(number=1000))
print("append: %f" % timeit2.timeit(number=1000))
print("insert_start: %f" % timeit3.timeit(number=1000))
print("列表生成式: %f" % timeit4.timeit(number=1000))
print("list(): %f" % timeit5.timeit(number=1000))# 结果为:
# []+[]: 1.662782
# append: 0.118913
# insert_start: 0.430096
# 列表生成式: 0.039850
# list(): 0.028044

Num10–>Python中list内置操作的时间复杂度

Num11–>Python中dict内置操作的时间复杂度

时间复杂度与大O记法的理解相关推荐

  1. 时间复杂度分析-大O表示法

    开篇词 | 从今天起,跨过"数据结构与算法"这道坎 你好,我是王争,毕业于西安交通大学计算机专业.现在回想起来,本科毕业的时候,我的编程水平其实是很差的.直到读研究生的时候,一个师 ...

  2. 【算法基础】时间复杂度:大O阶方法

    前言: 数据结构与算法中,数据结构就像一个厨房(有食材,有餐具,各种炊具),而算法就像厨师脑海中的菜谱,只有好的食材(数据),整洁有序的厨房(数据组织),简洁明了的菜谱(算法),厨师才能做出美味(程序 ...

  3. 什么是大数据,怎么理解和应对大数据时代

    什么是大数据,怎么理解和应对大数据时代 在大数据与深度学习中蝶化的人工智能.当代人工智能离不开大数据和深度学习算法.我们先来了解什么是大数据,大数据的本质是什么,在大数据时代我们应该如何应对? 当我们 ...

  4. 专栏:谈谈我对当下大数据整顿的理解与风控建议

    FAL金科应用研究院 专栏:谈谈我对当下大数据整顿的理解与风控建议 最近大数据行业爬虫业务监管调查风波刚稍有平息,又有P2P行业疑是被传"全军覆没",国家年前的整治力度可不谓不大. ...

  5. 分布式计算、云计算与大数据概论心得理解

    分布式计算.云计算与大数据概论心得理解 第一章 分布式计算概述 分布式计算的概念 分布式计算与其相关计算的发展趋势 集中计算(单机计算) 串行运算与并行运算简介 各种计算简介 网络计算 网格计算 分布 ...

  6. 大模型系统和应用——基于大模型的文本理解与生成

    引言 最近在公众号中了解到了刘知远团队退出的视频课程<大模型交叉研讨课>,看了目录觉得不错,因此拜读一下. 观看地址: https://www.bilibili.com/video/BV1 ...

  7. 简单时间复杂度大O记法

    import org.junit.Test;/*** 时间复杂度计算* 算法摘抄自书籍和网络,这玩意,做多了就有感觉了,^.^* @author RippleChan* @date 2018-01-2 ...

  8. a*算法的时间复杂度_算法的时间复杂度:大O表示法

    本文讨论一下算法的时间复杂度问题,用到的素材取自<算法图解>一书,强烈推荐, 如有不妥,请联系我! 二分查找 随便想一个1-100的数字. 你的目标是以最少的次数猜到这个数字.你每次猜测后 ...

  9. 算法时间复杂度分析——大O、大Ω、大θ、小o,小ω

    最近开始转战传统算法分析的研究工作了,重新拾起以前学过的一些内容. 目录 一.概述 二.对常见的Ο和Ω进行分析 2.1 大O表示法 2.2 大Ω表示法 三.P问题,NP问题,NP-hard问题,NPC ...

最新文章

  1. Python Tricks 若干
  2. 连续特征离散化方法介绍
  3. linux 运行c b停止,以下Linux命令中,用于终止某个进程的命令是()。A.deadB.killC.quitD.exit...
  4. [20171130]关于rman的一些总结.txt
  5. 串口通讯编程一日通3(COMMTIMEOUTS DCB整理)
  6. LInux:shell 命令:字符串截取
  7. 使用 JWT 来保护你的 SpringBoot 应用
  8. 接收字节流_Java中的IO流之输入流|乐字节
  9. numpy基础笔记02
  10. 灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断
  11. java读二进制bin文件内容_利用Java读取二进制文件示例详细解说
  12. .Net程序猿玩转Android开发---(11)页面跳转
  13. 获取编译学习笔记 (十一年)—— 内的中间
  14. zepto 操作 cookie
  15. 杜绝网络黑手,谁来保障企业数据安全
  16. 手机谷歌浏览器设置不阻止弹窗弹出
  17. 怎么在笔记本电脑上弄html,笔记本电脑怎么设置wifi,小编教你笔记本电脑如何设置WIFI热点...
  18. vue - 比较两个日期大小、比较同一天两个时间大小(判断两个日期时间的大小)JS 解决方法
  19. 北京理工大学计算机学院研究生孙灿,吴心筱_北京理工大学计算机学院
  20. 【Java面试】Java 内存溢出 栈溢出的原因与排查方法

热门文章

  1. python拼接、剪辑视频
  2. 英语中的 姓氏/Surname
  3. 麻将番型计算(二人麻将)
  4. PHP生成(支持多模板)二维码海报代码
  5. vue从数据库获取图片地址,为什么图片地址为变量时找不到图片?
  6. 乌镇发布六大榜单,解读大数据产业全景 !(附2018中国大数据产业地图、企业榜单)...
  7. FUTEX_SWAP补丁分析-SwitchTo 如何大幅度提升切换性能?
  8. 智慧井盖解决方案-最新全套文件
  9. 数学图形之单叶双曲面
  10. 安卓手机卸载系统应用(免root,非adb命令)==亲测有效==简单易操作