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; // 程序正常结束  
}

相关推荐

  1. c语言数据结构

    2024-04-21 14:02:02       15 阅读
  2. 手动数字-C语言

    2024-04-21 14:02:02       20 阅读
  3. 数据结构-

    2024-04-21 14:02:02       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 14:02:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 14:02:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 14:02:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 14:02:02       20 阅读

热门阅读

  1. 第六章 二叉树 part02

    2024-04-21 14:02:02       13 阅读
  2. IoTDB数据库整合MyBatis实现SpringBoot项目CRUD

    2024-04-21 14:02:02       14 阅读
  3. python笔记之面向对象

    2024-04-21 14:02:02       18 阅读
  4. docker-compose搭建MongoDB

    2024-04-21 14:02:02       18 阅读
  5. 【QT进阶】Qt http编程之http与https简单介绍

    2024-04-21 14:02:02       16 阅读
  6. Gitea:轻量级全功能DevSecOps平台的深度解析

    2024-04-21 14:02:02       13 阅读
  7. IDM的实用功能及其在现代下载管理中的重要地位

    2024-04-21 14:02:02       18 阅读
  8. Postgresql float8类型精度丢失问题

    2024-04-21 14:02:02       13 阅读
  9. 通过docker在容器中通过Gunicorn运行flask

    2024-04-21 14:02:02       15 阅读
  10. Fastadmin解决异步高并发大并发阻塞超时问题

    2024-04-21 14:02:02       16 阅读
  11. XiaodiSec day034 Learn Note 小迪渗透学习笔记

    2024-04-21 14:02:02       14 阅读
  12. Android 应用更新提醒自动跳转安装

    2024-04-21 14:02:02       16 阅读
  13. Rust为什么这么难学?

    2024-04-21 14:02:02       27 阅读