《计算机科学导论》学习笔记(18) - 课程 18 程序怎样运行

看这一小节的时候,最好先去弄明白哈希函数,最好先把数据结构 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. 练习:更改查找

(这一小节没怎么看懂,后续再细看!!)

35. 接下来

猜你喜欢

转载自blog.csdn.net/qq_33528613/article/details/80574949
18