解决哈希表的冲突-开放地址法和链地址法
来源:互联网 发布:装机必备软件 知乎 编辑:程序博客网 时间:2024/05/22 14:14
在实际应用中,无论如何构造哈希函数,冲突是无法完全避免的。
1 开放地址法
这个方法的基本思想是:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。这个过程可用下式描述:
H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… , k ( k ≤ m – 1))
其中: H ( key ) 为关键字 key 的直接哈希地址, m 为哈希表的长度, di 为每次再探测时的地址增量。
采用这种方法时,首先计算出元素的直接哈希地址 H ( key ) ,如果该存储单元已被其他元素占用,则继续查看地址为 H ( key ) + d 2 的存储单元,如此重复直至找到某个存储单元为空时,将关键字为 key 的数据元素存放到该单元。
增量 d 可以有不同的取法,并根据其取法有不同的称呼:
( 1 ) d i = 1 , 2 , 3 , …… 线性探测再散列;
( 2 ) d i = 1^2 ,- 1^2 , 2^2 ,- 2^2 , k^2, -k^2…… 二次探测再散列;
( 3 ) d i = 伪随机序列 伪随机再散列;
例1设有哈希函数 H ( key ) = key mod 7 ,哈希表的地址空间为 0 ~ 6 ,对关键字序列( 32 , 13 , 49 , 55 , 22 , 38 , 21 )按线性探测再散列和二次探测再散列的方法分别构造哈希表。
解:
( 1 )线性探测再散列:
32 % 7 = 4 ; 13 % 7 = 6 ; 49 % 7 = 0 ;
55 % 7 = 6 发生冲突,下一个存储地址( 6 + 1 )% 7 = 0 ,仍然发生冲突,再下一个存储地址:( 6 + 2 )% 7 = 1 未发生冲突,可以存入。
22 % 7 = 1 发生冲突,下一个存储地址是:( 1 + 1 )% 7 = 2 未发生冲突;
38 % 7 = 3 ;
21 % 7 = 0 发生冲突,按照上面方法继续探测直至空间 5 ,不发生冲突,所得到的哈希表对应存储位置:
下标: 0 1 2 3 4 5 6
49 55 22 38 32 21 13
( 2 )二次探测再散列:
下标: 0 1 2 3 4 5 6
49 22 21 38 32 55 13
注意:对于利用开放地址法处理冲突所产生的哈希表中删除一个元素时需要谨慎,不能直接地删除,因为这样将会截断其他具有相同哈希地址的元素的查找地址,所以,通常采用设定一个特殊的标志以示该元素已被删除。
2 链地址法
链地址法解决冲突的做法是:如果哈希表空间为 0 ~ m - 1 ,设置一个由 m 个指针分量组成的一维数组 ST[ m ], 凡哈希地址为 i 的数据元素都插入到头指针为 ST[ i ] 的链表中。这种方法有点近似于邻接表的基本思想,且这种方法适合于冲突比较严重的情况。
例 2 设有 8 个元素 { a,b,c,d,e,f,g,h } ,采用某种哈希函数得到的地址分别为: {0 , 2 , 4 , 1 , 0 , 8 , 7 , 2} ,当哈希表长度为 10 时,采用链地址法解决冲突的哈希表如下图所示。
转自:
http://blog.csdn.net/w_fenghui/article/details/2010387
- 解决哈希表的冲突-开放地址法和链地址法
- 解决哈希表的冲突-开放地址法和链地址法
- 解决哈希表的冲突-开放地址法和链地址法
- 解决哈希表的冲突-开放地址法和链地址法
- hash(开放地址法解决冲突)
- 用开放地址法中的线性探查法解决冲突实现哈希表的运算
- 算法学习 - HashTable开放地址法解决哈希冲突
- 用链地址法解决冲突的哈希表
- 数据结构与算法之哈希冲突解决-链地址法与开放定址法对比
- 哈希表之开地址法解决冲突
- 一段采用链地址法解决冲突的Hash代码
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 散列表-开放地址法和链地址法的实现
- 数据结构与算法学习之路:简单的哈希表实现(链地址法解决冲突)
- HASH表(采用开放地址法处理hash冲突)
- 哈希表(HashTable)的开放定址法和链地址法的实现
- 哈希表链地址法解决冲突
- 开放地址法
- Android中数据存储
- 玩家心里分析
- 取消eclipse js 错误提示
- 机器学习中的范数规则化之(一)L0、L1与L2范数
- codechef Ciel and Receipt题解
- 解决哈希表的冲突-开放地址法和链地址法
- 男人肾虚的8大表现
- cxf 注解
- javascript常用技巧
- IAR和谐打包报错 [MEM] After WLAN Init, available heap -134451921
- finally语句执行时机
- Meeting point-2
- MFC中实现单击按钮弹出对话框的方法
- UVa:10420 - List of Conquests