(原创)散列表 hash table

来源:互联网 发布:知乎乌金木和赤金檀木 编辑:程序博客网 时间:2024/05/21 11:10

一、什么是散列表

散列表是一种结合了散列函数和数组的数据结构。

二、散列函数

散列函数是一种将输入映射到数字的函数,它的执行时间为O(1)。散列函数需要满足一下要求:
a. 映射必须是一致的,即相同的输入,必须得到相同的输出。
b. 它应当尽可能的将不同的输入映射到不同的输出。
为什么是尽可能呢?后面我们会在冲突部分提到。那么,散列函数输出的数字有什么用呢?我们可以将该数字对应到数组的地址,并在该地址存放散列函数的输入对应的最终值,又因为数组的查询时间也为O(1),所以,散列表的查询运行时间为O(1)。例如,向散列函数输入"oysq",散列函数将其对应到03,那么将值"hello"存放到数组的#03位置,以后我们查询"oysq"的运行时间即为O(1)。


三、冲突和填装因子

因为数组的空间(长度)是在一开始就设定好的。假设长度为10,当有11个时,就不可避免的会有两个输入被散列函数映射到同一个位置,这种情况就叫冲突。为了避免原先的值被后来的值覆盖,我们在该位置存储了一张链表的起始位置,以后凡是映射到这个位置的值都存放在该位置对应的链表内。
注意!!
如果散列函数将所有的输入都映射到同一个位置,那么会导致什么情况呢?该位置的链表会非常的长~~~而数组的其他位置又都为空,这样和单纯的一张链表有什么区别呢?所以,散列函数非常的重要,就如上面提到的,它要尽可能的让键均匀的映射到数组的不同位置,这样的散列函数才是好函数!!
这里提一下一个概念:填装因子 = 散列表中的数组被占用的位置数 / 数组的位置总数。它度量的是散列表中的数组有多少位置是空的。
因此,换句话说,好的散列表,需要有:
a. 较低的填装因子
b. 好的散列函数


四、散列表的性能优势

由此可见,想要好的散列表,散列函数至关重要!!


尊重原创,转载请注明出处!!
原创粉丝点击