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

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 timeit
timeit.timeit("x=2+2")
6、通过profiler来运行程序:

import cProfile
cProfile.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、可以直接利用类似直觉,将其各个子树组织成一个子树列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值