Python Algorithms – chapter2 基础知识
一、渐进记法
三个重要的记号
Ο、Ω、Θ,Ο记法表示渐进上界,Ω记法表示渐进下界,Θ记法同时提供了函数的上下界
几种常见的渐进运行时间实例
三种重要情况
最好的情况,最坏的情况,平均情况
最坏的情况通常是最有用的情况,可以对算法效率做出最佳保证
实证式算法评估
Tip1:If possible, don’t worry about it.
Tip2:用timeit模块进行计时
import timeit
timeit.timeit("x = 2+2") #0.003288868749876883
timeit.timeit("x = sum(range(10))") #0.003288868749897271
Tip3:用profiler找出瓶颈
使用cProfiler获取运行情况的内容,打印出程序中各函数的计时结果,如果python版本中没有cProfiler可以使用profiler代替
import cProfile
cProfile.run("helloworld()")
Tip4:绘制出结果
可以使用matplotlib绘制出结果,可参考http://www.cnblogs.com/huangqiancun/p/8379502.html
Tip5:在根据计时比对结果做出判断时要小心仔细
Tip6:通过相关实验对渐进时间做出判断时要小心仔细
二、图与树
1 图的实现
邻接表
邻接集
a, b, c, d, e, f, g, h = range(8)
N = [
{b, c, d, e, f}, # a
{c, e}, # b
{d}, # c
{e}, # d
{f}, # e
{c, g, h}, # f
{f, h}, # g
{f, g} # h
]
b in N[a] # True
len(N[f]) #
邻接列表
a, b, c, d, e, f, g, h = range(8)
N = [
[b,c,d,e,f], #a
[c,e], #b
[d], #c
[e], #d
[f], #e
[c,g,h], #f
[f,h], #g
[f,g] #h
]
加权邻接字典
a, b, c, d, e, f, g, h = range(8)
N = [
{b:2, c:1, d:3, e:9, f:4}, # a
{c:4, e:3}, # b
{d:8}, # c
{e:7}, # d
{f:5}, # e
{c:2, g:2, h:2}, # f
{f:1, h:6}, # g
{f:9, g:8} # h
]
b in N[a] # True
len(N[f]) #
N[a][b] #
邻接集的字典表示法
N = {
'a': set('bcdef'),
'b': set('ce'),
'c': set('d'),
'd': set('e'),
'e': set('f'),
'f': set('cgh'),
'g': set('fh'),
'h': set('fg')
}
邻接矩阵
a, b, c, d, e, f, g, h = range(8)
N = [[0,1,1,1,1,1,0,0], # a
[0,0,1,0,1,0,0,0], # b
[0,0,0,1,0,0,0,0], # c
[0,0,0,0,1,0,0,0], # d
[0,0,0,0,0,1,0,0], # e
[0,0,1,0,0,0,1,1], # f
[0,0,0,0,0,1,0,1], # g
[0,0,0,0,0,1,1,0]] # h N[a][b] # Neighborhood membership -> 1
sum(N[f]) # Degree -> 3
对不存在的边赋予无限大权值的加权矩阵
a, b, c, d, e, f, g, h = range(8)
_ = float('inf') W = [[0,2,1,3,9,4,_,_], # a
[_,0,4,_,3,_,_,_], # b
[_,_,0,8,_,_,_,_], # c
[_,_,_,0,7,_,_,_], # d
[_,_,_,_,0,5,_,_], # e
[_,_,2,_,_,0,2,2], # f
[_,_,_,_,_,1,0,6], # g
[_,_,_,_,_,9,8,0]] # h W[a][b] < inf # True
sum(1 for w in W[a] if w < inf) - 1 #
注意:在对度值求和时务必要记得从中减1,因为我们不想把对角线也计算在内
Numpy库中的专用数组
N = [[0]*10 for i in range(10)]
import numpy as np
N = np.zeros([10,10])
更多内容可参考http://www.cnblogs.com/huangqiancun/p/8379241.html
2 树的实现
T = [["a", "b"], ["c"], ["d", ["e","f"]]]
T[0][1] # 'b'
T[2][1][0] # 'e'
二叉树类
class Tree:
def __init__(self, left, right):
self.left = left
self.right = right t = Tree(Tree("a", "b"), Tree("c", "d"))
t.right.left # 'c'
多路搜索树类(左孩子,右兄弟)
class Tree:
def __init__(self, kids, next=None):
self.kids = self.val = kids
self.next = next
return Tree t = Tree(Tree("a", Tree("b", Tree("c", Tree("d")))))
t.kids.next.next.val # 'c'
Bunch模式
bunch类
class Bunch(dict):
def __init__(self, *args, **kwds):
super(Bunch, self).__init__(*args, **kwds)
self.__dict__ = self
x = Bunch(name = "Jayne Cobb", position = "Public Relations")
x.name #'Jayne Cobb'
T = Bunch
t = T(left = T(left = "a",right = "b"), right = T(left = "c"))
t.left # {'right': 'b', 'left': 'a'}
t.left.right #' b'
"left" in t.right # True
三、黑盒子
1 隐性平方级操作
from random import randrange
L = [randrange(10000) for i in range(1000)]
42 in L # False
S = set(L)
42 in S #False
看起来使用set毫无意义,但是成员查询在list中是线性级的,在set中则是常数级的
lists = [[1,2], [3,4,5], [6]]
sum(lists, []) #[1, 2, 3, 4, 5, 6]
res = []
for lst in lists:
res.extend(lst)
# [1, 2, 3, 4, 5, 6]
sum函数是平方级的运行时间,第二个为更好的选择,当list的长度很短时,他们之间没有太大差距,但一旦超出某个长度,sum版本就会彻底完败
2 浮点运算的麻烦
sum(0.1 for i in range(10)) == 1.0 #False
def almost_equal(x, y, places=7):
return round(abs(x-y), places) == 0 almost_equal(sum(0.1 for i in range(10)), 1.0) # True
from decimal import *
sum(Decimal("0.1") for i in range(10)) == Decimal("1.0") #True
Python Algorithms – chapter2 基础知识的更多相关文章
- Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现
Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: 程序就是一堆文件 什么是进程: 进程就是一个正在 ...
- Python开发(一):Python介绍与基础知识
Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...
- 基于Python的Flask基础知识
Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...
- Python第一章-基础知识
第一章:基础知识 1.1 安装python. 直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...
- Python音频处理基础知识,这不是轻轻松松~~~
大家好鸭,我是小熊猫 咱今天来讲一讲音频处理的基础知识上才艺~~~ 1.声音的基础 2.python读取.wav音频 欢迎加入白嫖Q群:660193417### import wave import ...
- python这不是有手就行?——python音频处理基础知识
大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...
- Python之进程 基础知识 上
阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和mu ...
- Python开发——1.基础知识
一.开发 开发语言分为高级语言和低级语言 高级语言:Python.Java.PHP.C++.C#.GO.Ruby等:低级语言:C.汇编语言. 高级语言对应的是字节码,是将代码编译成字节码,然后交给机器 ...
- Python程序设计1——基础知识
1 Python脚本设计简介 1.1 输出"Hello World" 和一般的语言一样,运行python程序有两种方式,一种是GUI交互式命令,一种是通过脚本文件,前者适合小型简单 ...
随机推荐
- [转]2017年最具价值的十大开源项目!GitHub 年度报告~
<GitHub 2017 年度报告>GitHub 每年都会在年度盛会中推出数据报告,其中列出了一些年度的数据,包括其网站中最受欢迎的编程语言.开源项目等.那么今年哪些开源项目最具价值呢?我 ...
- SpringBoot 使用Thymeleaf解决静态页面跳转问题
参考:springboot配置跳转html页面 1,首先在pom文件中引入模板引擎jar包 <dependency> <groupId>org.springframework. ...
- C++ leetcode Longest Palindromic Substring
明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...
- Ubuntu 16 修改时区!
网上大部分解决办法是命令tzselect,然后选择亚洲-->中国->上海,但很遗憾,一点效果没有:后找到解决办法,运行命令dpkg-reconfigure tzdata,选择Asia--& ...
- Java获取路径(getResource)
package com.zhi.test; public class PathTest { public static void main(String[] args) { System.out.pr ...
- killl prefix out macro mis mal micro -m
1● macro 宏大,规模大 2● mis 错误,坏 3● mal 坏,错误 4● micro 小,微小
- mysql迁移到ubuntu遇到到问题
1.表名大小写敏感,linux下到mysql: 数据库名与表名是严格区分大小写的: 表的别名是严格区分大小写的: 列名与列的别名在所有的情况下均是忽略大小写的: 变量名也是严格区分大小写的. 修改方法 ...
- Oracle.练习题
2018-07-31 ---练习3 ---创建sporter表 create table sporter( sporterid ) constraint sport_id primary key, s ...
- html 多媒体使用
HTML插件 辅助应用程序(helper application)是由浏览器启动的程序,辅助应用程序也称为插件. 辅助应用程序可用于播放音频和视频(或其他 ).辅助程序是使用<Object> ...
- json模块&xml
json模块将数据修改成字符串,方便其他语言进行识别. 只认双引号,不认单引号.使用json.dumps的操作步骤 先将单引号修改成单引号 将变量使用单引号引起来 将数据类型编程json字符串 jso ...