📜  用于链式散列的 C++ 程序(1)

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

用于链式散列的 C++ 程序

散列技术是计算机领域中非常重要的技术之一,它是通过把一个大的、复杂的数据结构映射到一个简单的、易于管理的数据结构的方法来实现的。在散列技术中,散列表是常用的一种数据结构。

本文将介绍如何用 C++ 语言实现链式散列表,下面给出具体的实现步骤和代码。

散列算法

首先需要实现一个散列算法,散列算法可以把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。

下面是一个简单的散列函数,它可以把字符串转成散列值。

unsigned int hashFn(const char* str, int len) {
    unsigned int hash = 1315423911;
    for (int i = 0; i < len; ++i) {
        hash ^= ((hash << 5) + str[i] + (hash >> 2));
    }
    return hash;
}
链式散列表的实现

链式散列表是一种通过链表解决冲突的散列表实现方式。当出现散列冲突时,它会在冲突的槽里面存储一个链表来保存所有的元素。

下面是一个简单的链式散列表实现,它的散列函数是通过取模来实现的。

const int Capacity = 100;

struct Node {
    char key[256];
    int value;
    Node* next;
};

class HashTable {
public:
    HashTable() : _capacity(Capacity) {
        _values = new Node*[Capacity];
        memset(_values, 0, sizeof(Node*) * Capacity);
    }

    ~HashTable() {
        for (int i = 0; i < _capacity; ++i) {
            Node* node = _values[i];
            while (node) {
                Node* tmp = node;
                node = node->next;
                delete tmp;
            }
        }
        delete[] _values;
    }

    void put(const char* key, int value) {
        unsigned int hash = hashFn(key, strlen(key));
        int index = hash % _capacity;

        Node* node = _values[index];
        while (node) {
            if (strcmp(node->key, key) == 0) {
                node->value = value;
                return;
            }
            node = node->next;
        }

        Node* newNode = new Node;
        strcpy(newNode->key, key);
        newNode->value = value;
        newNode->next = _values[index];
        _values[index] = newNode;
    }

    int get(const char* key) {
        unsigned int hash = hashFn(key, strlen(key));
        int index = hash % _capacity;

        Node* node = _values[index];
        while (node) {
            if (strcmp(node->key, key) == 0) {
                return node->value;
            }
            node = node->next;
        }

        return -1;
    }

private:
    Node** _values;
    int _capacity;
};
总结

通过上述的散列算法和链式散列表的实现,我们可以很方便地进行散列操作。在实际应用中,可以根据具体的需求,灵活选择不同的散列算法和散列表实现方式。