首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

笔记 hash散列表的解决冲突——开放定址法(转)

笔记 hash散列表的解决冲突——开放定址法(转)

以下是列举收集来的三个题目,三个题目是同一个意思,


一,利用线性探测法构造散列表
   题目:已知一组关键字为(26,36,41,38,44,15,68,12,06,51),用除余法构造散列函数,用线性探查法解决冲突构造这组关键字的散列表。
  解答:为了减少冲突,通常令装填因子α<l。这里关键字个数n=10,不妨取m=13,此时α≈0.77,散列表为T[0..12],散列函数为:h(key)=key%13。
    由除余法的散列函数计算出的上述关键字序列的散列地址为(0,10,2,12,5,2,3,12,6,12)。
    前5个关键字插入时,其相应的地址均为开放地址,故将它们直接插入T[0],T[10),T[2],T[12]和T[5]中。
    当插入第6个关键字15时,其散列地址2(即h(15)=15%13=2)已被关键字41(15和41互为同义词)占用。故探查h1=(2+1)%13=3,此地址开放,所以将15放入T[3]中。
    当插入第7个关键字68时,其散列地址3已被非同义词15先占用,故将其插入到T[4]中。
    当插入第8个关键字12时,散列地址12已被同义词38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%13=1,此地址开放,可将12插入其中。
    类似地,第9个关键字06直接插入T[6]中;而最后一个关键字51插人时,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。
       开放定址法的flash演示


二、题目
      
已知一个线性表(38,25,74,63,52,48),假定采用h(k)=k%6计算散列地址进行散列存储,若用线性探测的开放定址法处理冲突,则在该散列表上进行查找的平均查找长度为()。

     A. 1.5        B. 1.7         C. 2        D. 2.3

2、解题过程
       (1)计算h(k):  38%6 = 2      25%6 = 1      74%6 = 2     63%6 = 3     52%6 = 4     48%6 = 0
       (2)定址:            
                              地址:     0             1             2              3             4             5
1、线性表第1个元素(38):                                   38(第1 次不冲突)
2、线性表第2个元素(25):                   25(第1次不冲突)
3、线性表第3个元素(74):                                    74(第1 次冲突,地址 + 1)
4、线性表第3个元素(74):                                                   74(第2 次不冲突)
5、线性表第4个元素(63):                                                   63(第1 次冲突,地址 + 1)
6、线性表第4个元素(63):                                                                 63(第2 次不冲突)
7、线性表第5个元素(52):                                                                 52(第1 次冲突,地址 + 1)
8、线性表第5个元素(52):                                                                              52(第2 次不冲突)
9、线性表第6个元素(48):   48(第1次不冲突)
经过上述定址过程,线性表中的各个元素都有了唯一的地址。
2.3、结果
       线性表中的 6 个元素,经过9次定址,
在该散列表上进行查找的平均查找长度为:9/6 =1.5,  答案选:A


三、哈希表查找不成功怎么计算?


解答:先建好表,然后可以算出每个位置不成功时的比较次数之和,再除以表空间个数!
例如:散列函数为hash(x)=xMOD 13,用线性探测,建立了哈希表之后,如何求查找不成功时的平均查找长度!?


    地址: 0  1  2  3  4  5  6  7  8  9  10  11   12


    数据:39 12  28  15  42  44  6  25  -  -  36  -   38


  成功次数: 1  3  1  2  2  1  1   9          1       1


不成功次数: 9   8  7  6   5  4  3  2  1   1   2  1    10


查找成功时的平均查找长度:ASL=(1+3+1+2+2+1+1+9+1+1)/10 =2.2


查找不成功时的平均查找长度:ASL=(9+8+7+6+5+4+3+2+1+1+2+1+10)/13=4.54


说明:


第n个位置不成功时的比较次数为,第n个位置到第1个没有数据位置的距离。


至少要查询多少次才能确认没有这个值。


(1) 查询hash(x)=0,至少要查询9次遇到表值为空的时候,才能确认查询失败。


(2) 查询hash(x)=1,至少要查询8次遇到表值为空的时候,才能确认查询失败。
(3) 查询hash(x)=2,至少要查询7次遇到表值为空的时候,才能确认查询失败。
(4) 查询hash(x)=3,至少要查询6次遇到表值为空的时候,才能确认查询失败。
(5) 查询hash(x)=4,至少要查询5次遇到表值为空的时候,才能确认查询失败。
(6) 查询hash(x)=5,至少要查询4次遇到表值为空的时候,才能确认查询失败。
(7) 查询hash(x)=6,至少要查询3次遇到表值为空的时候,才能确认查询失败。
(8) 查询hash(x)=7,至少要查询2次遇到表值为空的时候,才能确认查询失败。
(9) 查询hash(x)=8,至少要查询1次遇到表值为空的时候,才能确认查询失败。
(10)查询hash(x)=9,至少要查询1次遇到表值为空的时候,才能确认查询失败。
(11)查询hash(x)=10,至少要查询2次遇到表值为空的时候,才能确认查询失败。
(12)查询hash(x)=11,至少要查询1次遇到表值为空的时候,才能确认查询失败。

(13)查询hash(x)=12,至少要查询10次遇到表值为空(循环查询顺序表)的时候,才能确认查询失败。
继承事业,薪火相传
返回列表