散列表处理冲突


处理冲突

1. 开放寻址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为 散列函数,m为 散列表长,di为增量序列,可有下列三种取法:
1.1. di=1,2,3,…,m-1,称线性探测再散列;
1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)称二次探测再散列;
1.3. di= 伪随机数序列,称伪随机探测再散列。
2. 再 散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的 散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。
3. 链地址法(拉链法)
4. 建立一个公共溢出区
### 散列表中的线性探测法 在线性探测法中,当两个同的键映射到相同的索引位置时会发生冲突。为了处理这种冲突,线性探测法会从初始冲突的位置开始,逐个检查后续的槽位直到找到一个空闲的位置[^1]。 #### 线性探测的工作原理 假设有一个大小为 \(m\) 的散列表,并且已经定义了一个散列函数 \(h(k)\),用于将键 \(k\) 映射到表的一个特定位置上。如果尝试插入新元素时发现目标位置已被占用,则按照如下方式继续寻找可用位置: \[ h'(k, i) = (h(k) + i) \mod m \] 其中 \(i=0, 1, ..., m-1\) 表示当前正在试探的是第几次移动后的槽位[^2]。 #### 插入操作的具体过程 对于要插入的新项 `key` 和其对应的值 `value`: 1. 计算原始哈希码:\(index = hash(key)\ \% \ table\_size\) 2. 如果此位置为空或已经被删除标记占据,则可以直接放置新的条目; 3. 否则进入循环检测模式,每次增加偏移量并重新计算实际存储位置,直到遇到未被使用的槽位为止。 ```python def insert(table, key, value): index = hash_function(key) % len(table) while True: if table[index] is None or table[index]['status'] == 'deleted': table[index] = {'key': key, 'value': value, 'status': 'occupied'} break # Move to next slot using linear probing formula index = (index + 1) % len(table) ``` #### 查找操作的过程 查找给定键的过程中也需要遵循同样的逻辑路径来进行搜索。一旦到达了从未访问过的节点(即遇到了第一个空槽),就可以断言所求的数据存在于集合之中。 ```python def search(table, key): initial_index = index = hash_function(key) % len(table) while True: entry = table[index] if entry is None: return None elif entry['key'] == key and entry['status'] != 'deleted': return entry['value'] # Continue searching with linear probe sequence index = (index + 1) % len(table) # If we've looped back around without finding the item... if index == initial_index: return None ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值