📜  门| GATE CS 2011 |问题13(1)

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

门 | GATE CS 2011 | 问题13

这个问题是关于哈希表的,要求实现一个可以存储字符串的哈希表。本篇介绍如何设计和实现一个哈希表,以及如何处理哈希冲突的问题。

哈希表的概念

哈希表是一种数据结构,用来实现直接访问表。它将一个键映射到一个值上,称为哈希,哈希表使用哈希函数将键映射到索引,也称为哈希码。哈希表通常是一个数组,数组中的每个元素就是一个链表,具有相同哈希码的元素会被添加到链表中。

哈希函数

哈希函数将输入的值转换成哈希码。其输入可以是任意大小的数据,但输出通常是一个固定大小的整数值。哈希函数应该是高效的,从而可以快速地计算哈希码。

下面是一个简单的哈希函数的示例代码:

int hashCode(char *str, int tableSize) {
    int hash = 0;
    for (int i = 0; i < strlen(str); i++) {
        hash += str[i];
    }
    return hash % tableSize;
}

这个哈希函数将字符串中所有字符的 ASCII 值相加,并将结果对哈希表大小取模,以得到哈希码。

处理冲突

由于哈希函数将键映射到一个给定的索引,因此可能会出现哈希冲突,即两个键映射到同一个索引。为了处理冲突,我们需要实现一种方法,以在同一个索引中存储多个值。

最常见的方法是使用链地址,即在哈希表索引处存储一个链表。当哈希函数将两个不同的键映射到同一索引时,哈希表将在该索引处存储一个链接列表,其中每个链接列表来自一个不同的键值对。

下面是一个实现链地址哈希表的示例代码:

typedef struct {
    char *key;
    char *value;
    struct Node *next;
} Node;

typedef struct {
    int size;
    Node **table;
} HashTable;

HashTable *createHashTable(int size) {
    HashTable *hashTable = malloc(sizeof(HashTable));
    hashTable->size = size;
    hashTable->table = calloc(size, sizeof(Node *));
    return hashTable;
}

void put(HashTable *hashTable, char *key, char *value) {
    int index = hashCode(key, hashTable->size);
    Node *node = hashTable->table[index];
    while (node != NULL) {
        if (strcmp(node->key, key) == 0) {
            node->value = value;
            return;
        }
        node = node->next;
    }
    node = malloc(sizeof(Node));
    node->key = key;
  node->value = value;
    node->next = hashTable->table[index];
    hashTable->table[index] = node;
}

char *get(HashTable *hashTable, char *key) {
    int index = hashCode(key, hashTable->size);
    Node *node = hashTable->table[index];
    while (node != NULL) {
        if (strcmp(node->key, key) == 0) {
            return node->value;
        }
        node = node->next;
    }
    return NULL;
}

这个示例实现了一个哈希表,该哈希表的每个元素都是一个节点,每个节点包含一个键和一个值。如果两个键映射到同一个索引,则哈希表将在该索引处存储一个链接列表,其中每个链接列表来自一个不同的键值对。

结论

哈希表是一个高效的数据结构,可以用于实现不同的功能和算法,包括快速查找和排序。本篇介绍了哈希表的基本概念、哈希函数以及如何处理哈希冲突的问题。我希望本篇文章对程序员有所帮助。