二次探测再散列法解决哈希冲突

本文详细解释了如何使用二次探测再散列法解决哈希表中的冲突,以49这个关键字为例,通过计算哈希值和递增探测位置直到找到空闲槽位的过程。
摘要由CSDN通过智能技术生成

二次探测再散列法解决哈希冲突

此法通过不断增加步长来找到下一个可以用的插入位置
例题
设哈希表长为14,哈希函数是H(key)=key%11,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为49的结点加到表中,用二次探测再散列法解决冲突,则放入的位置是

首先我们通过哈希函数计算49的哈希值,H(49)=49%11=5;
如果这时候哈希表的位置5为空,那就直接放这里就ok
如果位置5已经被占用,那我们这时候就要用二次探测再散列法来寻找下一个合适的位置了
注意公式
di= i 2 ( i为探测次数)
第i次探测位置=(初始位置+di)%哈希表长度

第1次探测位置=(5+12)%14=6,发现位置6已经被占用,继续探测
第2次探测位置=(5+22)%14=9,位置9为空,则落座

答案为9

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是用C语言编写的二次探测的哈查找的代码示例: ```c #include <stdio.h> #include <stdlib.h> #define SIZE 10 int hash(int key) { return key % SIZE; } int hash2(int key) { return 7 - (key % 7); } int hashSearch(int hashTable[], int key) { int index = hash(key); int h2 = hash2(key); int i = 0; while (hashTable[(index + i * h2) % SIZE] != -1) { if (hashTable[(index + i * h2) % SIZE] == key) { return (index + i * h2) % SIZE; } i++; } return -1; } void hashInsert(int hashTable[], int key) { int index = hash(key); int h2 = hash2(key); int i = 0; while (hashTable[(index + i * h2) % SIZE] != -1) { i++; } hashTable[(index + i * h2) % SIZE] = key; } int main() { int hashTable[SIZE]; for (int i = 0; i < SIZE; i++) { hashTable[i] = -1; } hashInsert(hashTable, 5); hashInsert(hashTable, 25); hashInsert(hashTable, 15); hashInsert(hashTable, 35); printf("Key 15 found at index %d\n", hashSearch(hashTable, 15)); printf("Key 35 found at index %d\n", hashSearch(hashTable, 35)); printf("Key 5 found at index %d\n", hashSearch(hashTable, 5)); printf("Key 25 found at index %d\n", hashSearch(hashTable, 25)); printf("Key 10 not found, returned index %d\n", hashSearch(hashTable, 10)); return 0; } ``` 在上述代码中,我们定义了两个哈函数,`hash()` 和 `hash2()`。`hash()` 函数用于计算键的初始哈值,`hash2()` 函数用于计算键的二次哈步长。 `hashSearch()` 函数用于在哈表中查找给定的键。它使用二次探测的方解决冲突。如果键存在于哈表中,则返回键的索引。如果键不存在于哈表中,则返回 -1。 `hashInsert()` 函数用于将键插入哈表中。它也使用二次探测的方解决冲突。 在 `main()` 函数中,我们首先初始化哈表。然后插入一些键值对,并使用 `hashSearch()` 函数查找这些键的索引。最后,我们查找一个不存在于哈表中的键,并检查 `hashSearch()` 函数是否返回了 -1。 望这个示例能够帮助你理解如何使用C语言编写二次探测的哈查找。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值