一、渐进记法

三个重要的记号

Ο、Ω、Θ,Ο记法表示渐进上界,Ω记法表示渐进下界,Θ记法同时提供了函数的上下界

几种常见的渐进运行时间实例

三种重要情况

最好的情况,最坏的情况,平均情况

最坏的情况通常是最有用的情况,可以对算法效率做出最佳保证

实证式算法评估

Tip1:If possible, don’t worry about it.

Tip2:用timeit模块进行计时

  1. import timeit
  2. timeit.timeit("x = 2+2") #0.003288868749876883
  3. timeit.timeit("x = sum(range(10))") #0.003288868749897271

Tip3:用profiler找出瓶颈

使用cProfiler获取运行情况的内容,打印出程序中各函数的计时结果,如果python版本中没有cProfiler可以使用profiler代替

  1. import cProfile
  2. cProfile.run("helloworld()")

Tip4:绘制出结果

可以使用matplotlib绘制出结果,可参考http://www.cnblogs.com/huangqiancun/p/8379502.html

Tip5:在根据计时比对结果做出判断时要小心仔细

Tip6:通过相关实验对渐进时间做出判断时要小心仔细

二、图与树

1 图的实现

邻接表

邻接集

  1. a, b, c, d, e, f, g, h = range(8)
  2. N = [
  3. {b, c, d, e, f}, # a
  4. {c, e}, # b
  5. {d}, # c
  6. {e}, # d
  7. {f}, # e
  8. {c, g, h}, # f
  9. {f, h}, # g
  10. {f, g} # h
  11. ]
  1. b in N[a] # True
  2. len(N[f]) #

邻接列表

  1. a, b, c, d, e, f, g, h = range(8)
  2. N = [
  3. [b,c,d,e,f], #a
  4. [c,e], #b
  5. [d], #c
  6. [e], #d
  7. [f], #e
  8. [c,g,h], #f
  9. [f,h], #g
  10. [f,g] #h
  11. ]

加权邻接字典

  1. a, b, c, d, e, f, g, h = range(8)
  2. N = [
  3. {b:2, c:1, d:3, e:9, f:4}, # a
  4. {c:4, e:3}, # b
  5. {d:8}, # c
  6. {e:7}, # d
  7. {f:5}, # e
  8. {c:2, g:2, h:2}, # f
  9. {f:1, h:6}, # g
  10. {f:9, g:8} # h
  11. ]
  1. b in N[a] # True
  2. len(N[f]) #
  3. N[a][b] #

邻接集的字典表示法

  1. N = {
  2. 'a': set('bcdef'),
  3. 'b': set('ce'),
  4. 'c': set('d'),
  5. 'd': set('e'),
  6. 'e': set('f'),
  7. 'f': set('cgh'),
  8. 'g': set('fh'),
  9. 'h': set('fg')
  10. }

邻接矩阵

  1. a, b, c, d, e, f, g, h = range(8)
  2. N = [[0,1,1,1,1,1,0,0], # a
  3. [0,0,1,0,1,0,0,0], # b
  4. [0,0,0,1,0,0,0,0], # c
  5. [0,0,0,0,1,0,0,0], # d
  6. [0,0,0,0,0,1,0,0], # e
  7. [0,0,1,0,0,0,1,1], # f
  8. [0,0,0,0,0,1,0,1], # g
  9. [0,0,0,0,0,1,1,0]] # h
  10.  
  11. N[a][b] # Neighborhood membership -> 1
  12. sum(N[f]) # Degree -> 3

对不存在的边赋予无限大权值的加权矩阵

  1. a, b, c, d, e, f, g, h = range(8)
  2. _ = float('inf')
  3.  
  4. W = [[0,2,1,3,9,4,_,_], # a
  5. [_,0,4,_,3,_,_,_], # b
  6. [_,_,0,8,_,_,_,_], # c
  7. [_,_,_,0,7,_,_,_], # d
  8. [_,_,_,_,0,5,_,_], # e
  9. [_,_,2,_,_,0,2,2], # f
  10. [_,_,_,_,_,1,0,6], # g
  11. [_,_,_,_,_,9,8,0]] # h
  12.  
  13. W[a][b] < inf # True
  14. sum(1 for w in W[a] if w < inf) - 1 #

注意:在对度值求和时务必要记得从中减1,因为我们不想把对角线也计算在内

Numpy库中的专用数组

  1. N = [[0]*10 for i in range(10)]
  1. import numpy as np
  2. N = np.zeros([10,10])

更多内容可参考http://www.cnblogs.com/huangqiancun/p/8379241.html

2 树的实现

  1. T = [["a", "b"], ["c"], ["d", ["e","f"]]]
  2. T[0][1] # 'b'
  3. T[2][1][0] # 'e'

二叉树类

  1. class Tree:
  2. def __init__(self, left, right):
  3. self.left = left
  4. self.right = right
  5.  
  6. t = Tree(Tree("a", "b"), Tree("c", "d"))
  7. t.right.left # 'c'

多路搜索树类(左孩子,右兄弟)

  1. class Tree:
  2. def __init__(self, kids, next=None):
  3. self.kids = self.val = kids
  4. self.next = next
  5. return Tree
  6.  
  7. t = Tree(Tree("a", Tree("b", Tree("c", Tree("d")))))
  8. t.kids.next.next.val # 'c'

Bunch模式

bunch类

  1. class Bunch(dict):
  2. def __init__(self, *args, **kwds):
  3. super(Bunch, self).__init__(*args, **kwds)
  4. self.__dict__ = self
  1. x = Bunch(name = "Jayne Cobb", position = "Public Relations")
  2. x.name #'Jayne Cobb'
  1. T = Bunch
  2. t = T(left = T(left = "a",right = "b"), right = T(left = "c"))
  3. t.left # {'right': 'b', 'left': 'a'}
  4. t.left.right #' b'
  5. "left" in t.right # True

三、黑盒子

1 隐性平方级操作

  1. from random import randrange
  2. L = [randrange(10000) for i in range(1000)]
  3. 42 in L # False
  4. S = set(L)
  5. 42 in S #False

看起来使用set毫无意义,但是成员查询在list中是线性级的,在set中则是常数级的

  1. lists = [[1,2], [3,4,5], [6]]
  2. sum(lists, []) #[1, 2, 3, 4, 5, 6]
  3. res = []
  4. for lst in lists:
  5. res.extend(lst)
  6. # [1, 2, 3, 4, 5, 6]

sum函数是平方级的运行时间,第二个为更好的选择,当list的长度很短时,他们之间没有太大差距,但一旦超出某个长度,sum版本就会彻底完败

2 浮点运算的麻烦

  1. sum(0.1 for i in range(10)) == 1.0 #False
  1. def almost_equal(x, y, places=7):
  2. return round(abs(x-y), places) == 0
  3.  
  4. almost_equal(sum(0.1 for i in range(10)), 1.0) # True
  1. from decimal import *
  2. sum(Decimal("0.1") for i in range(10)) == Decimal("1.0") #True

Python Algorithms – chapter2 基础知识的更多相关文章

  1. Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现

    Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: ​   程序就是一堆文件 什么是进程: ​   进程就是一个正在 ...

  2. Python开发(一):Python介绍与基础知识

    Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...

  3. 基于Python的Flask基础知识

    Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...

  4. Python第一章-基础知识

    第一章:基础知识 1.1 安装python.     直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...

  5. Python音频处理基础知识,这不是轻轻松松~~~

    大家好鸭,我是小熊猫 咱今天来讲一讲音频处理的基础知识上才艺~~~ 1.声音的基础 2.python读取.wav音频 欢迎加入白嫖Q群:660193417### import wave import ...

  6. python这不是有手就行?——python音频处理基础知识

    大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...

  7. Python之进程 基础知识 上

    阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和mu ...

  8. Python开发——1.基础知识

    一.开发 开发语言分为高级语言和低级语言 高级语言:Python.Java.PHP.C++.C#.GO.Ruby等:低级语言:C.汇编语言. 高级语言对应的是字节码,是将代码编译成字节码,然后交给机器 ...

  9. Python程序设计1——基础知识

    1 Python脚本设计简介 1.1 输出"Hello World" 和一般的语言一样,运行python程序有两种方式,一种是GUI交互式命令,一种是通过脚本文件,前者适合小型简单 ...

随机推荐

  1. ORACLE PACKAGE中查看包的依赖关系

    SELECT dd.* FROM dba_dependencies dd WHERE NAME <> referenced_name AND referenced_type <> ...

  2. Elastic-Job 介绍

    Elastic-Job是一个分布式调度解决方案,它解决了什么问题呢? 如果你需要定时对数据进行处理,但由于数据量实在太大了,一台机器处理不过来,于是用两台机器处理,第一台处理 id 为奇数的数据,第二 ...

  3. 基于spring的PropertySource类实现配置的动态替换

    public class ConfigPropertySource extends PropertySource<Properties> implements PriorityOrdere ...

  4. win7 php nginx 启动命令

    1 php 启动命令 @echo off e: cd E:/php-/ echo "php is starting on port 9007, php_version is 7.0.6&qu ...

  5. 架构之路:nginx与IIS服务器搭建集群实现负载均衡(三)

    参考网址:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 [前言] 在<架构之路:nginx与IIS服务器搭 ...

  6. java④

    1. 一元运算符:一个表达式就可以参与运算! * ++ -- * * 二元运算符:二个表达式就可以参与运算! * + / * - % * * 三元运算符:三个表达式就可以参与运算! * 数据类型 变量 ...

  7. 使用DDMS查看设备内的文件系统

    system文件系统存储了一些系统相关的文件 system/app里面是系统自带的应用程序 system/fonts里面存放的是系统自带的字体 system/frameworks里面存放的是系统的一些 ...

  8. Java反射(一眼就看会)

    参考:(1)http://blog.csdn.net/liujiahan629629/article/details/18013523(2)https://www.zhihu.com/question ...

  9. 删除Mac OS X中Finder文件打开方式列表的重复程序或失效的

    清理列表, 可以在终端中输入下面提供的一行命令: /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices ...

  10. 堆排序,图解,C/C++实现

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...