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