看这一小节的时候,最好先去弄明白哈希函数,最好先把数据结构 C、Python 和 LeetCode 相关的题刷几道。
1. 简介
2. 使事物更快
3. 练习:测量速度
4. 秒表
5. 自旋循环
6. 练习:预测运行时间
7. 制作大索引
8. 练习:索引大小 VS 时间
9. 练习:查找时间
10. 练习:最坏的情况
11. 练习:足够快
12. 使查找更快
13. 练习:哈希表
14. 哈希函数
15. 模数运算符
16. 练习:模数练习
17. 练习:等效表达式
18. 练习:坏哈希
19. 练习:更好的哈希函数
题目:
# Define a function, hash_string,
# that takes as inputs a keyword
# (string) and a number of buckets,
# and returns a number representing
# the bucket for that keyword.
def hash_string(keyword,buckets):
#print hash_string('a',12)
#>>> 1
#print hash_string('b',12)
#>>> 2
#print hash_string('a',13)
#>>> 6
#print hash_string('au',12)
#>>> 10
#print hash_string('udacity',12)
#>>> 11
我的答案:
def hash_string(keyword,buckets):
s = 0
for char in keyword:
s += ord(char)
return s % buckets
视频给出的答案:
def hash_string(keyword, buckets):
s = 0
for char in keyword:
s = (s + ord(char)) % buckets
return s
(视频给出的答案更好,我的答案的缺点在于,是先将 keyword 字符串中的每 1 个字符的 hash 值累加到 s 中,这样,如果原始的 keyword 是 1 个非常长的字符串,那么, s 会非常大。
而 Dave 的答案,在每次循环时,均将 s 求余,这种情况下,即使 s 是很长的字符串,最后 1 次需要计算的除数 s 也不会非常大。)
20. 测试哈希函数
21. 练习:关键字和存储桶
22. 练习:实现哈希表
23. 练习:空哈希表
24. 练习:困难的方式
(
这一小节值得一看,为什么
def hashtable_NOT(nbuckets):
return [[]] * nbuckets
不行,因为这里,返回的 [[], [], []]
中的每一个空列表 []
指向的是同一个空列表,如果修改其中的 1 个列表,会修改指向的原始列表,进而修改其他列表,造成错误发生。例如:
table[1].append(...)
表面上只修改了第 1 个空列表,但是,实际上另外两个列表也跟着改变了。
有个截图一目了然,但是图片上传失败,最好去看下视频的解释,比较详细。
)
25. 练习:查找存储桶
(这一小节没怎么看懂,后续再细看!!)
26. 练习:添加关键字
(这一小节没怎么看懂,后续再细看!!)
27. 练习:查找
(这一小节没怎么看懂,后续再细看!!)
28. 练习:更新
(这一小节没怎么看懂,后续再细看!!)
29. 字典
有关 Python 中的哈希表的更多信息,请参阅 Python dictionary implementation
30. 使用字典
31. 练习:人口
32. 惰性气体
33. 练习:修改搜索引擎
(这一小节没怎么看懂,后续再细看!!)
34. 练习:更改查找
(这一小节没怎么看懂,后续再细看!!)