已知输入关键字序列为(100,90,120,60,78,35,42,31,15)地址区间为0~11。设计一个哈希表函数把上述关键字散到0~11中,画出散列表(冲突用线性探测法);写出查找算法,计算在等概率情况下查找成功的平均查找长度。
时间: 2024-02-25 10:54:15 浏览: 155
Hash表存储数据,用再散列来解决地址冲突问题,计算平均查找长度,还可以通过Key值查找对应的value
好的,我会根据您的要求回答问题。先来回答您的问题:
这是一个关于哈希表的问题,需要设计哈希函数将关键字散列到指定的地址区间中,并使用线性探测法解决冲突。然后需要编写查找算法,并计算平均查找长度。
下面是具体的步骤:
1. 设计哈希函数
哈希函数的设计可以采用除留余数法,即将关键字除以一个质数,然后取余数作为哈希地址。这里我们取质数11作为除数,哈希函数为:h(key) = key % 11。
2. 构建哈希表
我们可以使用数组来实现哈希表,数组大小为11,即可将关键字散列到0~10的地址区间中。如果发生冲突,则采用线性探测法解决。
具体地,我们可以将哈希表定义为一个长度为11的数组,初始值均为-1。然后对于输入的每个关键字,根据哈希函数计算出它的哈希地址,如果该地址已经被占用,则继续向后探测,直到找到一个空闲的位置为止。探测的方法可以采用线性探测,即依次往后查找,直到找到一个空闲的位置。如果探测到数组末尾,则从数组开头重新开始探测。
以下是具体的代码实现:
```
#define SIZE 11
int hashTable[SIZE]; // 哈希表
void initHashTable() {
for (int i = 0; i < SIZE; i++) {
hashTable[i] = -1; // 初始值均为-1
}
}
int hashFunc(int key) {
return key % SIZE; // 除留余数法
}
void insert(int key) {
int addr = hashFunc(key); // 计算哈希地址
while (hashTable[addr] != -1) { // 发生冲突
addr = (addr + 1) % SIZE; // 线性探测
}
hashTable[addr] = key; // 插入关键字
}
void printHashTable() {
printf("哈希表:\n");
for (int i = 0; i < SIZE; i++) {
printf("%d ", hashTable[i]);
}
printf("\n");
}
```
3. 查找算法
查找算法也比较简单,根据哈希函数计算出关键字的哈希地址,然后在哈希表中查找。如果该位置上的关键字不等于要查找的关键字,则继续向后查找,直到找到要查找的关键字或者遇到空闲位置为止。如果遇到空闲位置,则说明要查找的关键字不存在于哈希表中。
以下是具体的代码实现:
```
int search(int key) {
int addr = hashFunc(key); // 计算哈希地址
while (hashTable[addr] != -1) { // 不为空
if (hashTable[addr] == key) { // 找到了
return addr;
} else { // 继续向后查找
addr = (addr + 1) % SIZE;
}
}
return -1; // 没找到
}
```
4. 计算平均查找长度
在等概率情况下,每个关键字被散列到哈希表中的任意一个位置的概率相等,为1/SIZE。因此,查找成功的平均查找长度为:(1+2+...+n)/n = (n+1)/2,其中n为哈希表中关键字的总数。
以上就是关于哈希表的设计、实现和分析,希望能够对您有所帮助。
阅读全文