哈希表
哈希,hash,也叫散列,杂凑。
按我的理解:
散列函数,就是对于指定的值,经过这个函数计算,可以得到一个结果。
哈希表,就是这么一个表:将数据存放在按照散列函数计算结果位置上,或者发现该位置已被占用,即有冲突的情况下,按照一定规则,制止找到一个新位置存放为止。那么反过来,利用这个哈希表,给出指定值,按照散列函数和规则,就能找到存放于其中的数据。
所以说,哈希表就是用来加快查找的一种表。是一种专门用来处理数据有冲突的一种表。
因此,哈希表最适合用在高并发的场合。
以前读书的时候,有教《数据结构》,但根本不清楚为什么要搞这么个哈希表。工作以后,也时不时撞见哈希哈希什么的,但还是不理解。都说IT从业门槛低,别的专业,甚至上几天培训班的也来跟我们计算机专业出身的抢饭吃,而且还很抢得很凶。一方面说明计算机技术是比较简单的技术,只要是个人,自学几天就能上手;另一方面,是我这种资质平庸又不争气的计算机专业学生读书不求甚解的报应。学计算机,应该努力弄清楚原理,否则很容易在五花八门,一日千里的各种技术中疲于奔命。
所以,工作十几年以后,我居然回头重新学习数据结构。
常用哈希表
哈希表的关键技术之一就是要处理好元素的冲突,采用不同的冲突处理方法就可以得到不同的哈希表。
1、线性哈希表
最简单的一种哈希表。当冲突发生时,后来者循原本应在位置向前+1,直至找到一个空位置。
2、随机哈希表
当冲突发生时,后来者随机找到新位置
3、溢出哈希表
线性哈希表和随机哈希表有两个致命缺点:
1)可能会造成新的冲突
2)哈希表填满后不能再正常处理
而溢出哈希表包括哈希表和溢出表两部分。在哈希表填入过程中,如果有冲突,就将冲突的后来者填入溢出表。这样就避免了因为要处理冲突而产生新的冲突。
4、拉链哈希表
每个元素并不存储元素值本身,而是指针。有冲突的位置,会跟着一串争夺这个位置的链表。
分为外链哈希表和内链哈希表
5、指标哈希表
包括指标表和内容表两部分。
指标表就是个哈希表,可以是上述任意类型,但存储的是元素在内容表中的指针。元素存储在内容表中。
好处就是省存储空间。