HashTable的简单介绍
HashTable是根据关键字直接访问在内存存储的数据结构。
HashTable叫哈希表或者散列表。
它通过一个关键值的函数将所需的数据直接映射到表中的位置来访问数据,这个映射函数叫散列函数(哈希函数),存放记录的数组叫散列表(哈希表)。
比如:
给定一字符串“abckhdgubhkacdggk”找出第一次只出现一次的字符。
对于这个问题,用指针解决,用两个指针,一个指针cur指向当前字符,另一个指针next向后遍历,如果找到cur与next相同,cur指向下一个字符,next再进行遍历,直到next遍历完成所有字符,都与cur不同,则此时的cur指向的字符就是第一个只出现一次的字符。时间复杂度O(n^2)。
这种方法可以解决但是时间复杂度比较高,优化一下,在查找时红黑树和堆排序的查找时间复杂度会低一点,建红黑树然后再根据关键字进行查找。时间复杂度O(nlogn)。
能不能再优化一下?
那就是运用到哈希表,所有字符总共256个,我们可以利用字符对应的ASCII值为下标建立数组。遍历一遍字符串,将每个字符对应的下标ASCII处加1,遍历完成后就从头往后进行查找,查找时直接能找到对应的位置。所以这个时间复杂度就为O(n)。
这就是哈希表的直接定址法。
当对一组10以内的数进行排序,也可以用哈希表。比如:1、3、5、2、5、3、5、8,建立一个数组a[10],将对应的数存放在对应的下标处,出现一次加一下,打印时如果下标对应的是0就不打印,对应1就打印1次,对应的下标里存几就打印几。如下:
但是并不是所有的数都适合这种排序,如:1000、1002、1000、1005、1000、1008。最大数是1008,开1008大小的数组前1000个就浪费了,我们只需开(1008 - 1000)的大小就好,对应的下标就是(1008-1000)/1000。
这就是哈希表的除留余数法。
除此外,构造哈希表的方法还有:平方取中法、折叠法、随机数法、数学分析法
哈希冲突(哈希碰撞)
不同的关键字通过相同的哈希函数处理后可能产生相同的值哈希地址。我们称这种情况为哈希冲突或哈希碰撞。(任意的散列函数都不能避免产生