c语言数据结构之哈希表

哈希表(Hash Table,也叫散列表)是一种非常重要的数据结构,它提供了一种通过键值(key)直接访问在存储位置中的数据的方法。其基本思想是将键值通过哈希函数转换为数组的索引,然后通过这个索引快速定位到相应的值(value)。哈希表使得数据的存储和查找的时间复杂度在理想情况下可以达到O(1)。

哈希表主要由两部分组成:哈希函数和哈希表本身。哈希函数用于将键值转换为数组索引,而哈希表则是一个数组,用于存储键值对。

哈希表的主要优点包括:

  1. 查找速度快:在理想情况下,哈希表的查找、插入和删除操作的时间复杂度都是O(1),即常数时间复杂度。这是因为哈希表通过哈希函数直接定位到键值对应的存储位置,无需遍历整个数据结构。
  2. 灵活性高:哈希表可以存储任意类型的键值对,且键值之间无需保持任何特定的顺序。

然而,哈希表也存在一些缺点:

  1. 空间利用率:为了保证哈希表的性能,通常需要为其分配较多的存储空间。当哈希表中的元素较少时,空间利用率可能较低。
  2. 哈希冲突:由于哈希函数的输出范围有限,不同的键值可能经过哈希函数处理后得到相同的索引,这称为哈希冲突。解决哈希冲突的方法有多种,如开放寻址法(包括线性探测、平方探测等)和链地址法。

在实际应用中,哈希表被广泛应用于各种需要快速查找的场景,如数据库索引、缓存系统、编译器中的符号表等。通过选择合适的哈希函数和冲突解决方法,可以有效地提高哈希表的性能。

总的来说,哈希表是一种高效且灵活的数据结构,它在处理大量数据时具有显著的优势。然而,也需要注意其可能存在的空间利用率和哈希冲突等问题,并根据实际情况选择合适的实现方法。

 

#include<stdio.h>  
  
// 定义哈希表的最大容量  
#define maxHashSize 100000 // 哈希表的大小,可根据需求调整  
  
// 定义哈希表中元素的数据类型  
#define eleType int // 键的类型,这里为整型,也可以替换为其他类型  
  
// 定义哈希表中空元素的标识值  
#define empty -14124254 // 自定义一个不会出现的数作为空元素的标识,确保不与正常数据冲突  
  
// 声明哈希表数组  
int hashArray[maxHashSize]; // 哈希表本质就是一个数组,用于存储数据  
  
// 哈希函数,用于计算键值的哈希值  
int hashFunc(eleType val) {  
    int x = val % maxHashSize; // 使用取模运算将键值转化为数组索引  
    if(x < 0) x += maxHashSize; // 确保哈希值非负  
    return x; // 返回计算得到的索引值  
}  
  
// 初始化哈希表,将哈希表中的所有元素设置为空  
void hashInit() {  
    for(int i = 0; i < maxHashSize; ++i) {  
        hashArray[i] = empty; // 将数组中的每个元素初始化为空标识值  
    }  
}  
  
// 插入操作,将键值插入哈希表中  
int hashInsert(eleType val) {  
    // 注意:这里存在一个拼写错误,hashFuns应该是hashFunc  
    int key = hashFunc(val); // 调用哈希函数计算键值对应的索引  
    while(1) { // 循环查找空位置或已存在的键值  
        if(hashArray[key] == empty) { // 如果当前位置为空,则插入键值  
            hashArray[key] = val;  
            return key; // 返回插入的索引位置  
        } else if(hashArray[key] == val) { // 如果键值已存在,则返回其索引位置  
            return key;  
        }  
        key++; // 尝试下一个位置  
        if(key == maxHashSize) { // 如果到达哈希表末尾,则回到开头循环查找  
            key = 0;  
        }  
    }  
}  
  
// 删除操作,从哈希表中删除指定的键值  
int hashDelete(eleType val) {  
    // 注意:这里存在一个拼写错误,hashFuns应该是hashFunc,并且存在另一个拼写错误,retyrn应该是return  
    int key = hashFunc(val); // 调用哈希函数计算键值对应的索引  
    while(1) { // 循环查找指定的键值  
        if(hashArray[key] == empty) { // 如果当前位置为空,说明键值不存在,返回0表示删除失败  
            return 0;  
        } else if(hashArray[key] == val) { // 如果找到键值,则删除它  
            hashArray[key] = empty; // 将位置设置为空标识值  
            return 1; // 返回1表示删除成功  
        }  
        key++; // 尝试下一个位置  
        if(key == maxHashSize) { // 如果到达哈希表末尾,则回到开头继续查找  
            key = 0;  
        }  
    }  
}  
  
// 查找操作,在哈希表中查找指定的键值,并返回其索引位置  
int hashFind(eleType val, int* isFind) { // 注意:这里的elsType应该是eleType  
    int key = hashFunc(val); // 调用哈希函数计算键值对应的索引  
    while(1) { // 循环查找指定的键值  
        if(hashArray[key] == empty) { // 如果当前位置为空,说明键值不存在  
            *isFind = 0; // 设置标志位表示未找到  
            return key; // 返回当前索引位置(虽然无意义,但保持与其他操作一致)  
        } else if(hashArray[key] == val) { // 如果找到键值  
            *isFind = 1; // 设置标志位表示找到  
            return key; // 返回键值的索引位置  
        }  
        key++; // 尝试下一个位置  
        if(key == maxHashSize) { // 如果到达哈希表末尾,则回到开头继续查找  
            key = 0;  
        }  
    }  
}  
  
// 主函数,程序的入口点  
int main() {  
    hashInit(); // 初始化哈希表  
    // 可以在这里添加插入、删除、查找等操作的测试代码  
    return 0; // 程序正常结束  
}

  • 28
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值