Hash函数是一种映射关系,通过一种映射关系,将原本的字符串,数字或其他关键信息转换为一个索引值。
用数学关系式表示为:
   index  =  function(key)

数序上有不同的映射关系,不同的key,有可能会获取相同的index,这个时候的index就是有重码,也就是collosion,这就导致了Hash函数的不唯一性,从而在查找index下的关键字时也是有冲突的。

目前一些常用的数学映射关系为:
   1、直接定址法,就是直接使用key作为index
   2、数字分析法,取key中的若干位数作为index,有较多冲突
   3、平法取中法,取key的平方,然后取中间几位作为index(index与key值密切相关),
   4、折叠法,将key从中间分割成几个部分,然后按照一定规则相加获取的结果为index。
   5、除留余数法,将key对某个数值m求余,获取的余数即为index,显然indxe<m,也就是如果key>m,必然会有n-m个冲突存在(n为key关键字的个数)。
   6、随机数法,将key值通过随机数求取index,即function(key)=random(key),伪随机数的均匀性较好,当关键字长度不相等时,用此法构造较为恰当。

解决冲突:
    其实并不是将冲突去掉,而是通过一种变通的方法,将冲突变得可以唯一查找,而不是有冲突就没有唯一的index位置了。
   解决方法有:
    一、开放定址法:
             index = (function(key)+di)mod m
               di:增长序列,m哈希表长,d的求取方法有下面集中。
      1、线性探测再散列,就是查找或插入时,如果发生冲突,就线性排列下去,下面还有冲突,继续排列下去,直到没有冲突时,查找结束或添加index。d=1,2,3,……,m-1
     2、二次探测再散列,d=1^2,-1^2,2^2,-2^2,……,±k^2(k<=m/2)
     3、伪随机探测再散列,d=random(key)
  二、再Hash法
        即将index冲突的key关键字进行另一种Hash算法,得到key关键的index2索引值,从而来降低和避免冲突,当然要将冲突完全避免,则需要多个Hash算法隐含在其中。
 三、链地址法
        当Index发生冲突时,将同一个index下冲突的key值都放在以index开头的链表中,这样index开头的链表中的key都可以比较方便的查找出来。
四、建立溢出表
         建立一个和key关键字一样多的index索引,当index发生冲突时,将所有发生冲突的key或index都放在溢出表中。

Hash表查找:
  
Hash函数学习笔记// -------开放定址Hash表的存储结构------------
Hash函数学习笔记 DUPLICATE -1
采用链接构建Hash的思路,MainChainHash申请一个head指针和若干个变量,然后main指针依次指向下一个MainChainHash指针,而每一个child指针,指向ChildChainHash链中的值,这样一个Hash表就 构造完成了。当主键key使用Hash一下获取的Index时,通过Index索引值知道Child链,从而构造了一个核实的Hash表。

Hash函数学习笔记// 采用开放式哈希表的存储结构
Hash函数学习笔记

Hash函数学习笔记Status SearchHash(HashTable H, KeyType k, 
int &p, int &c)
Hash函数学习笔记 InsertHash
摘抄自严蔚敏的C数据结构中Hash章节。

Hash表最大的特点:
    不管n有多大,即表有多长,我们总可以选择一个合适的装填因子以便将来平均查找长度限定在一个范围之内。

查找长度
链地址:
          S=1+α /2
线性探测:
          S = 1/2 (1+1/(1-
α ) )
伪随机探测:
          S = -1/
α ln(1-α )





 

相关文章:

  • 2022-12-23
  • 2021-04-13
  • 2021-09-05
  • 2021-12-25
  • 2022-03-12
猜你喜欢
  • 2021-12-13
  • 2021-10-16
  • 2021-12-04
  • 2022-12-23
  • 2022-01-02
  • 2021-05-02
  • 2021-12-08
相关资源
相似解决方案