HASH表一些简单问题

来源:互联网 发布:企业saas软件 编辑:程序博客网 时间:2024/05/16 14:34
一、哈希表的构造

              对于哈希表来说,它主要由三部分构成:哈希函数、哈希表、冲突处理

             (1)哈希函数的构造方法

                    1)直接定址法

                          取关键字或关键字的某个线性函数值为哈希地址。即:

                          H(key)=key或H(key)a*key+b

                          其中a和b为常数

                          例如:有一个从1岁到100岁的人口数字统计表,其中,年龄作为关键字,哈希函数取关键字自身,如下表:

                               

 

            由于直接定址所得地址集合和关键字集合的大小相同,因此,对于不同的关键字不会发生冲突。但是,实际中使用这种方法的情况很少,因为随着关键字的增多,哈希表会变得很庞大。

                    2)平方去中位法:

                         取关键字平方后的中间几位为哈希地址。取的位数由表长决定。例子

                                           

                  3)还有折叠法、数字分析法、除留余数法、随机数法等

              (2)处理冲突的方法

                               1)开放地址法

                            

                          其中i=1,2,3。。。。,k(k<=m-1),H(key)为哈希函数,m为哈希表表长,di为增量序列,可能有下列三种情况:

                             (1)di=1,2,3....,m-1,称线性探测在散列;

                             (2)称二次探测再散列;

                             (3)di=伪随机数序列,称伪随机探测再散列。

                          例如,在长度为11的哈希表中已填有关键字分别为17,60,29的记录,(哈希函数H(key)=key MOD 11),现在有第四个记录,其关键字为38,由哈希函数得到哈希地址为5,产生冲突。若用线性探测再散列的方法处理,得到下个地址是6,仍冲突,再求下个地址7,仍冲突,直到哈希地址为8的 位置为“空”时止,处理冲突的过程结束,记录填入哈希表中序号为8的位置。若用二次探测再散列,则应该填入序号为4的位置。类似的可以得到伪随机再散列的地址。

                      

            (a)插入前(b)线性探测再散列(c)二次探测再散列(d)伪随机探测再散列,伪随机数是9

 

                    2)链地址法

                         将所有关键字为同义词的记录存储在同一线性表中。假设某哈希函数产生的哈希地址在区间[0,m-1]上,则设立一个指针型向量 Chain Chain Hash[m];

                         其每个分量的初始状态都是空指针。凡是哈希地址为i的记录都插入到头指针为ChainHash[i]的链表中。在列表中的插入位置可以在表头或表尾;也可以在中间      以保持同义词在同一线性表中按关键字有序。

                       例如:已知一组关键字为(19,14,23,01,68,20,84,27,55,11,10,79),则按哈希函数H(key)=key MOD 13 和链地址法处理冲突构造所得的哈希表,如下图所示:

                           

原创粉丝点击