2.基于散列表的工作原理,采用除留余数法H(key) = key % p (p<m) 作为散列函数,采用线性探测法处理冲突,实现散列查找算法,自动生成包含数百、数千、数万正整数的若干中正整数集合构造散列表,测量不同规模散列表的平均查找长度写出C语言完整代码
时间: 2023-06-20 16:06:03 浏览: 101
以下是基于散列表的查找算法的C语言实现,采用除留余数法作为散列函数,采用线性探测法处理冲突:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10007 // 散列表大小
#define MAX_NUM 100000 // 随机数最大值
// 散列表结构体
typedef struct {
int key;
int value;
} HashTable;
// 散列函数:除留余数法
int hash(int key) {
return key % SIZE;
}
// 线性探测法处理冲突
int linear_probe(HashTable table[], int key) {
int index = hash(key);
while (table[index].key != -1 && table[index].key != key) {
index = (index + 1) % SIZE;
}
return index;
}
// 添加键值对到散列表
void insert(HashTable table[], int key, int value) {
int index = linear_probe(table, key);
table[index].key = key;
table[index].value = value;
}
// 查找键对应的值
int search(HashTable table[], int key) {
int index = hash(key);
while (table[index].key != -1) {
if (table[index].key == key) {
return table[index].value;
}
index = (index + 1) % SIZE;
}
return -1; // 未找到
}
int main() {
srand(time(NULL));
// 初始化散列表
HashTable table[SIZE];
for (int i = 0; i < SIZE; i++) {
table[i].key = -1;
table[i].value = -1;
}
// 生成随机数集合,添加到散列表
int nums[10000];
for (int i = 0; i < 10000; i++) {
nums[i] = rand() % MAX_NUM + 1;
insert(table, nums[i], i);
}
// 测试查找效率
clock_t start, end;
double cpu_time_used;
start = clock();
for (int i = 0; i < 10000; i++) {
search(table, nums[i]);
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Average search length: %lf\n", cpu_time_used / 10000);
return 0;
}
```
该代码中,使用了一个 `HashTable` 结构体来表示散列表中的每个键值对。散列函数采用了除留余数法,线性探测法用于处理冲突。程序首先生成一组随机数,并将它们添加到散列表中。然后,程序测试了查找效率,并输出了平均查找长度。
阅读全文