Hash Table
今天开始刷leetcode的题目,从第一个题开始,做题的时候遇到了用unordered_map<int, int>
存储数据的知识点,那么现在就学习总结一下关于散列表的知识,相关网站如下:
TwoSum
那下面切入正题吧~
Hash Table的特性
Hash Table 是一个重要的用于集合的数据结构,TR1引入了以hash table 为基础的容器群,其内的元素没有清晰明确的次序;我们可以把这个container想成一个袋子,这个袋子可以放入元素,也可以取出元素,但是在取出时,我们是以一直随机的次序进行访问元素;基于上述的特性,它相对于(multi)set和(multi)map,没有排序准则(因为它本身就是无序随机的);相比于sequence容器,我们不能把元素放到特定的位置上。
简而言之,它内部的元素是无序的,那它也不会支持关于findMin
、findMax
及线性时间排序的操作。
散列函数
散列表的大小记为TableSize
,通常习惯于让表从0到TableSize-1
变化。
每个关键字被映射到从0到TableSize-1
这个范围中的某个数,并且被放到适当的单元中,这个映射就叫做散列函数(hash function),数学表达式为:
hash(key) = addr //addr的区间便是0到TableSize-1
接下来主要的内容便是如何选择一个散列函数,决定当两个关键字散列到同一个值的时候(这里叫冲突)应该做什么以及如何确定散列表的大小。
最好的情况是选择TableSize为素数,即保证表的大小为素数,这样尽量使得关键字分配均匀
当key为整数时,则一般合理的方法为直接返回key mod TableSize
当key为字符串时,散列函数需要仔细选择
参考文献:
《数据结构与算法分析C语言描述 第四版》
《c++标准库》