Hash表是什么
Hash表(哈希表)也叫散列表。散列表用的是数组支持按照下标随机访问数据的特性,如果没有数组,就没有散列表。
比如 要存储100个学生的成绩,现在有他们的学号
如M202070023,M代表是研究生,2020代表是2020年入学的,70是学院的编号,023代表是这个学生在学院的人数编号。
我们可以只取学号的后三位,对应放入相应的数组下标下,从1到100,这样在查询的时候,就可以直接通过下标来获取,时间复杂度为O(1)
只取后三位这样的操作就叫Hash函数或者散列函数,而散列函数计算得到的值就叫作散列值(或“Hash 值”“哈希值”)。
散列函数
三点散列函数设计的基本要求:
- 散列函数计算得到的散列值是一个非负整数;
- 如果 key1 = key2,那 hash(key1) == hash(key2);
- 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。
其中第三点最难达到(比如数据量很大,又没有明显的规律),所以就会存在“散列冲突”
如果解决散列冲突
常用的解决散列冲突的方法有开放寻址法(open addressing)和链表法(chaining),这里就不展开讲了。
散列表也常常和链表一起使用