相关资料:
http://blog.csdn.net/luyuncsd123/article/details/11590861
https://www.pianshen.com/article/7412466981/
Hash
生命起源:
那么,我们开始思考:有什么方式既能够具备数组的快速查询的优点又能融合链表方便快捷的增加删除元素的优势?HASH呼之欲出。
存储结构:
所谓的hash,简单的说就是散列,即将输入的数据通过hash函数得到一个key值,输入的数据存储到数组中下标为key值的数组单元中去。
突然问题:
我们发现,不相同的数据通过hash函数得到相同的key值。这时候,就产生了hash冲突。解决hash冲突的方式有两种。
1.一种是挂链式,也叫拉链法。挂链式的思想在产生冲突的hash地址指向一个链表,将具有相同的key值的数据存放到链表中。
2.另一种是建立一个公共溢出区。将所有产生冲突的数据都存放到公共溢出区,也可以使问题解决。
增加空间:
如何实现hash的动态增加空间的效果?这和装在因子密切相关。装填因子 = 填入表中的元素个数 / 散列表的长度。当装填因子达到一定值a时,我们
就让数组增加一定的内存空间,同时rehash。
散列:
存储地址=Hash(关键码) Hash-散列函数
PS:哈希表是一个元素为链表的数组
优缺点:
hash表是基于数组的,数组创建后难以扩展。
某些hash表被基本填满时(装填因子接近1时),性能下降得非常厉害;
hash表的实质是将关键值映射为地址。当关键值空间要比地址空间大的多的时候就不可避免的会产生散列冲突问题。
查询速度最快,但是也最耗费空间