信源编码第三次作业

来源:互联网 发布:fifaonline3刷球员软件 编辑:程序博客网 时间:2024/04/29 05:38
哈希表的数据结构

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。这里把这种对应关系f称为散列函数,又称为哈希(Hash)函数。按这个思想,采用散列技术将记录存在在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表。那么,关键字对应的记录存储位置称为散列地址。

哈希表的构造方法

构造哈希表的方法是:设要存储的数据元素个为n,设置一个长度为m(m≥n)的连续内存单元(即数组),分别以每个数据元素的关键字Ki(0≤i≤n-1)为自变量,以哈希函数h(Ki)值为该数据元素在数组中的下标值存储该数据元素。把构造哈希表时Ki≠Kj(i≠j),但h(Ki)=h(Kj)的现象称作哈希冲突。

(1)除留余数法
     除留余数法是用数据元素的关键字K除以哈希表长度m所得的余数作为哈希地址的方法。除留余数法的哈希函数h(K0=K mod m。

(2)直接定址法
     直接定址法是以数据元素的关键字K本身或关键字加上某个数值常量C作为哈希函数的方法。直接定址法的哈希函数h(K)为h(K) = K + C

(3)数字分析法
    数字分析法是取数据元素关键字中某些取值较均匀的数字位构造哈希函数的方法。它只适合于所有关键字值已知的情况。 

(4)平方取中法

这个方法计算很简单,假设关键字是1234,那么它的平方就是1522756,再抽取中间的3位就是227,用做散列地址。平方取中法比较适合不知道关键字的分布,而位数又不是很大的情况。

5折叠法

  折叠法是将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短些),然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。

    比如关键字是9876543210,散列表表长为三位,将它分为四组,987|654|321|0,然后将它们叠加求和987 + 654 + 321 + 0 = 1962,再求后3位得到散列地址962。

折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况。

5随机数法

  选择一个随机数,取关键字的随机函数值为它的散列地址。也就是f(key) = random(key)。这里random是随机函数。当关键字的长度不等时,采用这个方法构造散列函数是比较合适的。

哈希冲突解决方法

(1)开放定址法
       开放定址法是一类以发生哈希冲突的哈希地址为自变量、通过某种哈希冲突函数得到一个新的空闲的哈希地址的方法。开放定址法的哈希冲突函数通常是一组。主要包括线性探查法平方探查法伪随机数法

2链表法
     链表法解决哈希冲突的基本思想是:如果没有发生哈希冲突,则直接在该地址保存该数据元素;如果发生了哈希冲突,则把发生哈希冲突的数据元素保存在另外的单链表中。
     用链表法解决哈希冲突通常有两种方法: 第一种方法是为发生哈希冲突的不同的同义词建立不同的单链表,第二种方法是为所有发生哈希冲突的数据元素建立一个单链表。





0 0
原创粉丝点击