C语言哈希表详解

一、什么是哈希表

哈希表是一种根据关键码值(Key Value)直接进行访问的数据结构。通俗的说,哈希表就是把一个关键码值(Key Value)通过哈希函数转换为一个索引,该索引指向在表中对应的记录。哈希函数可以将任意长度的输入映射为较小的固定长度的输出。一般情况下,哈希表的查询和插入操作的时间复杂度为 O(1),在某些特殊情况下,时间复杂度为 O(n)。

二、哈希表的实现

哈希表的实现主要包括哈希函数和哈希冲突处理两部分。

1. 哈希函数

哈希函数是将关键码值映射到哈希表中的位置的函数。

int hash_func(char *key)
{
    unsigned long hash = 5381;
    int c;
    while ((c = *key++))
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
    return hash % HASH_SIZE;
}

hash_func() 函数采用了比较常用的“乘法散列法”,可以将字符串转换为哈希表中的位置。

2. 哈希冲突处理

哈希冲突指的是两个关键字经过哈希函数映射到了同一个位置的情况。

常见的哈希冲突处理方法有“链式解决法”和“开放定址法”。

链式解决法

链式解决法通过链表将哈希表中相同位置的多个元素串连在一起。

typedef struct NODE
{
    char *key;
    char *val;
    struct NODE *next;
} NODE;

NODE *hash_table[HASH_SIZE];

void put(char *key, char *val)
{
    int pos = hash_func(key);
    NODE *head = hash_table[pos];
    NODE *p = head;

    while (p)
    {
        if (strcmp(p->key, key) == 0)
        {
            p->val = val;
            return;
        }
        p = p->next;
    }

    NODE *new_node = (NODE*)malloc(sizeof(NODE));
    new_node->key = key;
    new_node->val = val;
    new_node->next = NULL;

    if (head == NULL)
        hash_table[pos] = new_node;
    else
    {
        p = head;
        while (p->next)
            p = p->next;
        p->next = new_node;
    }
}

char *get(char *key)
{
    int pos = hash_func(key);
    NODE *p = hash_table[pos];
    while (p)
    {
        if (strcmp(p->key, key) == 0)
            return p->val;
        p = p->next;
    }
    return NULL;
}

开放定址法

开放定址法是指当哈希冲突发生时,通过向前/后寻找空闲位置来解决冲突的方法。

char *hash_table[HASH_SIZE];

void put(char *key, char *val)
{
    int pos = hash_func(key);
    
    while (hash_table[pos] != NULL && strcmp(hash_table[pos], key) != 0)
    {
        pos = (pos + 1) % HASH_SIZE;
    }

    hash_table[pos] = val;
}

char *get(char *key)
{
    int pos = hash_func(key);
    
    while (hash_table[pos] != NULL && strcmp(hash_table[pos], key) != 0)
    {
        pos = (pos + 1) % HASH_SIZE;
    }

    return hash_table[pos];
}

三、哈希表的应用

哈希表广泛应用于数据存储、索引,如:数据库中的索引、编译器中的符号表、DNS解析中的缓存等。

四、总结

哈希表是一种基于哈希函数实现的数据结构,主要包括哈希函数和哈希冲突处理两部分,通过链式解决法和开放定址法来处理哈希冲突。哈希表具有查询和插入操作的时间复杂度为 O(1) 的优点,广泛应用于数据存储、索引等方面。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-26 12:17
下一篇 2024-11-26 12:18

相关推荐

  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28
  • Python语言实现人名最多数统计

    本文将从几个方面详细介绍Python语言实现人名最多数统计的方法和应用。 一、Python实现人名最多数统计的基础 1、首先,我们需要了解Python语言的一些基础知识,如列表、字…

    编程 2025-04-28
  • Python作为中心语言,在编程中取代C语言的优势和挑战

    Python一直以其简单易懂的语法和高效的编码环境而著名。然而,它最近的发展趋势表明Python的使用范围已经从脚本语言扩展到了从Web应用到机器学习等广泛的开发领域。与此同时,C…

    编程 2025-04-28
  • Python基础语言

    Python作为一种高级编程语言拥有简洁优雅的语法。在本文中,我们将从多个方面探究Python基础语言的特点以及使用技巧。 一、数据类型 Python基础数据类型包括整数、浮点数、…

    编程 2025-04-28

发表回复

登录后才能评论