Hash算法解决冲突的四种方法

Hash算法解决冲突的方法一般有以下几种常用的解决方法 

1. 开放定址法: 


所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入 
公式为:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1) 
※ 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者 
碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探测到开放的地址则表明表 
中无待查的关键字,即查找失败。 
比如说,我们的关键字集合为{12,67,56,16,25,37,22,29,15,47,48,34},表长为12。 我们用散列函数f(key) = key mod l2 
当计算前S个数{12,67,56,16,25}时,都是没有冲突的散列地址,直接存入: 

这里写图片描述 
计算key = 37时,发现f(37) = 1,此时就与25所在的位置冲突。 
于是我们应用上面的公式f(37) = (f(37)+1) mod 12 = 2。于是将37存入下标为2的位置: 
这里写图片描述

2. 再哈希法: 


再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数
计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。

3. 链地址法: 


链地址法的基本思想是:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向 
链表连接起来,如: 
键值对k2, v2与键值对k1, v1通过计算后的索引值都为2,这时及产生冲突,但是可以通道next指针将k2, k1所在的节点连接起来,这样就解决了哈希的冲突问题 
这里写图片描述

4. 建立公共溢出区: 


这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表

### 二维前缀和算法在瓦片图案生成或处理中的应用 #### 定义与基本原理 二维前缀和是一种用于快速求解矩形区域内元素总和的技术。对于给定的一个矩阵 `A`,可以预先计算一个新的矩阵 `prefixSum`,其中每个元素 `(i,j)` 表示从原点 `(0,0)` 到当前坐标的子矩阵内所有数值之和。 通过这种方式,在后续查询任意指定区域内的元素累积值时只需常数时间复杂度 O(1),因为只需要访问四个预处理过的节点即可完成加减运算得出结果[^1]。 #### 应用场景分析 当涉及到像地图服务这样的应用场景时——特别是采用分层切片机制的地图系统(如微软 Bing 地图),这种技术能够显著提升性能效率: - **加速渲染过程**:利用二维前缀和可以在瞬间获取特定范围内的数据汇总信息,从而加快图像合成速度; - **简化碰撞检测逻辑**:游戏开发等领域经常需要用到对象间相互作用判断,借助此方法可迅速定位目标区间并作出响应; - **优化路径规划算法**:无论是最短路还是其他形式的空间搜索问题,都能受益于高效的数据检索能力所带来的优势[^2]。 #### 实现案例展示 下面给出一段 Python 代码片段作为例子说明如何基于上述理论框架构建实际解决方案: ```python def build_prefix_sum(matrix): rows = len(matrix) cols = len(matrix[0]) if matrix else 0 prefix_sum = [[0]*(cols+1) for _ in range(rows+1)] for i in range(1,rows+1): for j in range(1,cols+1): prefix_sum[i][j]=matrix[i-1][j-1]+\ prefix_sum[i-1][j]+ \ prefix_sum[i][j-1]- \ prefix_sum[i-1][j-1] return prefix_sum def query_submatrix_sum(prefix_sum,x1,y1,x2,y2): """Query sum of elements within sub-matrix defined by top-left (x1,y1), bottom-right(x2,y2).""" return prefix_sum[x2+1][y2+1]-prefix_sum[x1][y2+1]-prefix_sum[x2+1][y1]+prefix_sum[x1][y1] # Example usage: input_matrix=[[3,0,1,4],[2,8,7,5],[4,6,9,1]] ps=build_prefix_sum(input_matrix) print(query_submatrix_sum(ps,1,1,2,2)) # Output should be 30 which is the sum inside this area. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值