散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数
基本概念
* 若结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。
* 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称
冲突。具有相同函数值的关键字对该散列函数来说称做
同义词。
* 综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”, 作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。科学家计算过,当负载因子(load factor)不超过75%,查找效率最高。
* 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
31 和111是同义词,他们的关键字相同,查找到相应的关键字后使用顺序查找进行查找,直到找到要找的数据。
哈希函数: 关键字到表的映射关系f
什么是好的哈希函数:
若对于关键字集合中的任意关键字,精哈希函数映像到地址集合中任何一个地址的概率是相等的,则此类哈希函数为
均匀的哈希函数。换句话说,就是使关键字经过哈希函数得到一个“随机地址”,以便使一组关键字的哈希地址均匀分布在整个地址区间中,从而减少冲突。这样的哈希函数是好的哈希函数。
上途中可以看到,分布的十分的不均匀,可以说是一个不太合适的哈希函数。