📜  table de hachage en - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:05:27.718000             🧑  作者: Mango

C语言中的哈希表

哈希表(Hash table),也可以称为散列表、哈希映射或键值对映射,是根据关键码值(Key value)直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

哈希表的实现

在C语言中,哈希表可以使用结构体和数组实现。结构体中存放的键值对信息,数组则用来存储哈希表中每个位置上的结构体。

我们可以定义一个键值对结构体:

typedef struct {
    char* key;
    int value;
} KeyValuePair;

在定义一个哈希表时,我们可以使用如下方式:

#define TABLE_SIZE 19

KeyValuePair hashTable[TABLE_SIZE];

这个哈希表的大小是19,可以根据实际需求进行调整。在哈希表中,我们需要实现两个重要的函数:哈希函数和插入/查找函数。

哈希函数

哈希函数是将大区间映射到小区间的函数,通常使用取余运算实现。哈希函数的目的是将键值进行哈希,转换为一个哈希地址(指向数组中一个位置),方便存储和访问。我们可以实现一个简单的哈希函数:

int hash(char* key) {
    int hashVal = 0;

    while (*key != '\0') {
        hashVal += (*key++ - 'a' + 1);
    }

    return hashVal % TABLE_SIZE;
}

这个哈希函数将字符串中的每个字母按照顺序加起来,然后对哈希表大小取余,得到哈希地址。可以根据实际需求实现不同的哈希函数。

插入/查找函数

插入函数的作用是将键值对插入哈希表中。我们可以实现一个简单的插入函数:

void insert(char* key, int value) {
    int hashVal = hash(key);

    while (hashTable[hashVal].key != NULL) {
        if (strcmp(hashTable[hashVal].key, key) == 0) {
            hashTable[hashVal].value = value;
            return;
        }
        hashVal = (hashVal + 1) % TABLE_SIZE;
    }

    hashTable[hashVal].key = key;
    hashTable[hashVal].value = value;
}

这个插入函数首先使用哈希函数获得哈希地址,然后在哈希表中查找该位置是否已经被占用,如果已经被占用并且键值相同,则更新value;否则,继续查找下一个位置,直到找到空位置,将键值对插入该位置。

查找函数的作用是根据键值查找哈希表中对应的值。我们可以实现一个简单的查找函数:

int find(char* key) {
    int hashVal = hash(key);

    while (hashTable[hashVal].key != NULL) {
        if (strcmp(hashTable[hashVal].key, key) == 0) {
            return hashTable[hashVal].value;
        }
        hashVal = (hashVal + 1) % TABLE_SIZE;
    }

    return -1;
}

这个查找函数首先使用哈希函数获得哈希地址,然后在哈希表中查找该位置是否已经被占用,如果已经被占用并且键值相同,则返回对应的value;否则,继续查找下一个位置,直到找到空位置或者找到键值相同的位置。

总结

哈希表是一个非常实用的数据结构,可以在O(1)的时间复杂度内进行插入、删除和查找操作。在C语言中,我们可以使用结构体和数组实现哈希表,实现的关键在于哈希函数和插入/查找函数的实现。