哈希查找算法(线性探测)
简介
哈希查找是一种高效的数据查找方法,通过哈希函数将键值映射到哈希表中的索引位置,从而快速找到目标数据。本文介绍了一种基于开放地址法(线性探测)的哈希查找算法,并提供了详细的C语言实现代码和注释。
哈希查找算法概述
哈希查找算法主要通过以下步骤实现数据的插入、查找和删除:
- 哈希函数:将键值映射到哈希表中的索引位置。
- 冲突处理:当两个键值通过哈希函数映射到同一索引位置时,需要一种机制来解决冲突。
- 查找操作:根据键值通过哈希函数计算索引,并根据冲突处理机制找到目标位置。
- 删除操作:标记或移除哈希表中的指定键值对。
开放地址法(线性探测)
开放地址法是解决哈希冲突的一种方法,其中最简单的形式是线性探测。其基本思想是:当发生哈希冲突时,通过线性方式(逐个位置)探测下一个空闲位置,直到找到一个空位或回到起始位置。
线性探测步骤
- 计算初始索引:使用哈希函数计算键值的初始索引位置。
- 检查冲突:如果当前位置已被占用,按顺序检查下一个位置。
- 循环检查:如果到达哈希表的末尾,则从头开始检查,直到找到空位或回到起始位置。
代码实现
头文件和宏定义
#include <stdio.h>
#include <stdlib.h>
#define TABLE_SIZE 10 // 定义哈希表的大小
结构体定义
typedef struct {
int key;
int value;
} HashItem;
// 定义哈希表为指针数组
HashItem* hashTable[TABLE_SIZE];
哈希函数
int hashFunction(int key) {
return key % TABLE_SIZE;
}
插入函数
void insert(int key, int value) {
int index = hashFunction(key); // 计算哈希值
int originalIndex = index; // 保存初始索引
// 创建新哈希表项
HashItem* newItem = (HashItem*) malloc(sizeof(HashItem));
newItem->key = key;
newItem->value = value;
// 处理冲突,使用线性探测法
while (hashTable[index] != NULL && hashTable[index]->key != -1) {
index = (index + 1) % TABLE_SIZE; // 移动到下一个位置
if (index == originalIndex) { // 检查是否回到了初始位置
printf("Hash table is full\n");
return; // 哈希表已满
}
}
// 将新项插入哈希表
hashTable[index] = newItem;
}
查找函数
int search(int key) {
int index = hashFunction(key); // 计算哈希值
int originalIndex = index; // 保存初始索引
// 通过线性探测查找键
while (hashTable[index] != NULL) {
if (hashTable[index]->key == key) {
return hashTable[index]->value; // 找到键,返回值
}
index = (index + 1) % TABLE_SIZE; // 移动到下一个位置
if (index == originalIndex) {
return -1; // 未找到
}
}
return -1; // 未找到
}
删除函数
void delete(int key) {
int index = hashFunction(key); // 计算哈希值
int originalIndex = index; // 保存初始索引
// 通过线性探测查找要删除的键
while (hashTable[index] != NULL) {
if (hashTable[index]->key == key) {
hashTable[index]->key = -1; // 标记该位置为已删除
return;
}
index = (index + 1) % TABLE_SIZE; // 移动到下一个位置
if (index == originalIndex) {
return; // 未找到
}
}
}
主函数
int main() {
// 初始化哈希表为空
for (int i = 0; i < TABLE_SIZE; i++) {
hashTable[i] = NULL;
}
// 插入键值对
insert(1, 10);
insert(11, 20);
insert(21, 30);
// 查找并打印值
printf("Value for key 1: %d\n", search(1));
printf("Value for key 11: %d\n", search(11));
printf("Value for key 21: %d\n", search(21));
// 删除键值对
delete(11);
printf("Value for key 11 after deletion: %d\n", search(11));
return 0;
}