📜  在不使用指针的情况下在 C++ STL 中实现分离链接的程序(1)

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

在 C++ STL 中实现分离链接的程序

分离链接是一种避免散列表碰撞的方法,它将散列表中冲突的元素以链表的形式连接起来。在 C++ STL 中实现分离链接,可以使用 std::list 容器来实现。

程序实现
#include <iostream>
#include <list>
#include <string>

using namespace std;

class HashTable {
private:
    int size; // 散列表容量
    list<string>* table; // 存储散列表的数组,每个元素是一个链表
public:
    HashTable(int size) {
        this->size = size;
        table = new list<string>[size];
    }

    ~HashTable() {
        delete[] table;
    }

    // 计算 hash 值
    int hash(string key) {
        int sum = 0;
        for (int i = 0; i < key.length(); i++) {
            sum += key[i] * i;
        }
        return sum % size;
    }

    // 在散列表中插入元素
    void insert(string key) {
        int index = hash(key);
        table[index].push_front(key);
    }

    // 在散列表中查找元素
    bool find(string key) {
        int index = hash(key);
        for (auto it = table[index].begin(); it != table[index].end(); it++) {
            if (*it == key) {
                return true;
            }
        }
        return false;
    }
};

int main() {
    // 创建一个容量为 10 的哈希表
    HashTable ht(10);

    // 插入元素
    ht.insert("hello");
    ht.insert("world");
    ht.insert("programming");
    ht.insert("algorithm");

    // 查找元素
    cout << boolalpha << ht.find("hello") << endl; // true
    cout << boolalpha << ht.find("world") << endl; // true
    cout << boolalpha << ht.find("programming") << endl; // true
    cout << boolalpha << ht.find("algorithm") << endl; // true
    cout << boolalpha << ht.find("cpp") << endl; // false

    return 0;
}
程序说明

该程序实现了一个分离链接的哈希表,主要分为以下几个部分:

  • 构造函数:通过 size 参数创建一个表头数组,每个表头元素是一个链表。
  • 析构函数:释放动态分配的内存。
  • hash 函数:根据 key 计算 hash 值,返回值为 int 类型。
  • insert 函数:插入元素到散列表中,首先计算出 key 对应的 hash 值,然后将 key 插入到该位置的链表的头部。
  • find 函数:查找元素是否在散列表中,首先计算出 key 对应的 hash 值,然后遍历该位置的链表,查找是否有等于 key 的元素。如果找到了,则返回 true,否则返回 false。

程序中主函数演示了如何使用该分离链接的哈希表,首先创建一个容量为 10 的哈希表,然后插入一些元素,最后查找一些元素是否在哈希表中。