Hash表以及应用
哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构。
哈希表的原理非常简单,通过一个固定的算法将Key转为一个数字,然后将该数字对数组长度取余,将取余结果作为数组下标,然后将Value存储在该数字为下标的数组里。
不过想要找到一个好的哈希表非常难。原因就是通过那个固定算法得出的数字有可能会相同。显然一个下标指向的数组空间里是没有办法存储两个元素的,只能通过一些其他方法来解决冲突。这些方法虽然能够解决冲突,但是会使得查询等操作的操作速度下降。所以一个好的哈希表这样的冲突应该是要很少的。
解决哈希冲突的常见方法有两种:
开放定址法
简单来说,通过一个固定算法得出另一个数字下标,如果该位置为空,就插入,不然就重复进行。
这个方法实现起来很复杂,至今没有去实现过。
拉链法
简单来说,就是将数组和链表结合起来。在冲突的位置拉出一条链表来。
这个方法实现比较简单,但代码我都不知道扔哪去了。
值得一提的是,开放定址法得出来的是闭散列表,拉链法得出的是开散列表。
以下是哈希表的应用
显然两个月前的我并不知道哈希表为何物,只是用了暴力法。
这里的代码没什么好说的,没必要说。
一开始我就想岔了,平方查字典,后来想想,好像根本没必要。但是又想想,能用,就留着了。
这里的思路就是,将每次'快乐'得出的数字用字典记录下来,如果这次'快乐'得出的数字已经存在在字典里了,就return False,不是return 0,return 0就错了。如果'快乐'得出的数字是1,就return True。