【笔记】Python算法教程(1)

来源:互联网 发布:淘宝开放平台api 授权 编辑:程序博客网 时间:2024/06/05 10:00

1、关于list

Python里的list不是单(双)向链表,是顺序表,是一整块单一连续的内存区块----我们通常称之为数组(array)。这样做的好处有两点:这样按照既定索引值对某元素进行直接访问时更方便;append是在列表末尾添加,insert必须移动插入点右边所有的数据,故方便用append。

2、关于复杂度

任何多项式级算法的复杂度都要高于对数级;任何指数级算法的复杂度都要高于多项式级算法。

3、range 函数

>>>range(1,5)#代表从1到5(不包含5)
[1,2,3,4]
>>>range(1,5,2)#代表从1到5,间隔2(不包含5)
[1,3]
>>>range(5)#代表从0到5(不包含5)
[0,1,2,3,4]
4、运行时间既与输入规模有关,又与输入的实际内容有关。

5、使用timeit模块来计时。

import timeittimeit.timeit("x=2+2")
6、通过profiler来运行程序:

import cProfilecProfile.run('main()')

这样就应该能打印出程序中各函数的计时结果。

7、可通过trace模块来完成这部分测试

8、图G=(V,E)。V是节点,E是边。

9、散列hashing,会涉及一些经由某既定对象计算而来的整数值。(而且乍看之下像是随机的)

假设你有这样一个函数:  

hash(name) 


该函数根据输入的名字,通过一些计算法则返回区间[1,N]中的某个数值,那么为什么不将名字和电话号码存储在表的第 hash(name)位置呢。 


注意哈希函数有点小奇特,它必须是完全确定性的。按理说就是对于你输入的同一名字,哈希函数始终返回相同的数值,而每个不同的名字则应返回不同的固定值。正如你所料这种特性并不总是能满足的。 


使用这种方案,在表中查找名字,实际仅就是计算 hash(name)的值,然后在这个值标识的 表中的那个位置 去看看你要查的名字是不是存储在那了。 


是的,这就是关于hash的全部,尽管还有一些其他的实用细节,但其核心思想就是 用 hash(name)来确定名字在表中的存储地址。

10、表示图的结构方法:

邻接集(  { }  )、邻接列表(list[])、邻接矩阵(检查矩阵单元N[a][b]是否为真)表示法。N(v)代表的是v的邻居节点集。

较为稀疏的时候比较适合邻接列表,较为稠密的时候比较适合邻接集。

11、集合set。python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.      sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。

12、可以直接利用类似直觉,将其各个子树组织成一个子树列表。