数据结构与算法之散列表 链地址法实现 单链表 / C++ 示例

数据结构与算法阿木 发布于 2025-07-11 10 次阅读


摘要:

散列表(Hash Table)是一种基于散列函数将键映射到表中的位置的数据结构,它提供了快速的查找、插入和删除操作。链地址法是解决散列冲突的一种常用方法,通过在每个散列位置维护一个链表来存储具有相同散列值的元素。本文将介绍链地址法在散列表中的实现,并通过C++代码示例展示其具体实现过程。

一、

散列表是一种高效的数据结构,广泛应用于各种场景,如数据库索引、缓存、哈希集合等。链地址法是解决散列冲突的一种有效方法,它通过在每个散列位置维护一个链表来存储具有相同散列值的元素。本文将详细介绍链地址法在散列表中的实现,并通过C++代码示例进行展示。

二、链地址法原理

链地址法的基本思想是将散列表的每个位置视为一个链表的头部,当发生散列冲突时,将冲突的元素插入到对应位置的链表中。这样,每个散列位置都维护一个链表,链表中的元素按照插入顺序排列。

三、散列表实现

以下是一个基于链地址法的散列表的C++实现示例:

cpp

include <iostream>


include <vector>


include <list>

class HashTable {


private:


std::vector<std::list<int>> table;


int capacity;

public:


HashTable(int size) : capacity(size), table(capacity) {}

int hashFunction(int key) {


return key % capacity;


}

void insert(int key) {


int index = hashFunction(key);


auto& list = table[index];


for (auto it = list.begin(); it != list.end(); ++it) {


if (it == key) {


return; // Key already exists


}


}


list.push_back(key);


}

bool search(int key) {


int index = hashFunction(key);


auto& list = table[index];


for (auto it = list.begin(); it != list.end(); ++it) {


if (it == key) {


return true;


}


}


return false;


}

void remove(int key) {


int index = hashFunction(key);


auto& list = table[index];


for (auto it = list.begin(); it != list.end(); ++it) {


if (it == key) {


list.erase(it);


return;


}


}


}


};

int main() {


HashTable hashTable(10);

// Insert elements


hashTable.insert(1);


hashTable.insert(2);


hashTable.insert(3);


hashTable.insert(4);

// Search elements


std::cout << "Search 2: " << (hashTable.search(2) ? "Found" : "Not Found") << std::endl;


std::cout << "Search 5: " << (hashTable.search(5) ? "Found" : "Not Found") << std::endl;

// Remove elements


hashTable.remove(2);


std::cout << "Search 2 after removal: " << (hashTable.search(2) ? "Found" : "Not Found") << std::endl;

return 0;


}


四、代码分析

1. `HashTable` 类定义了一个散列表,其中包含一个整数类型的键和值。

2. `table` 成员变量是一个 `std::vector`,用于存储链表,每个链表对应散列表的一个位置。

3. `capacity` 成员变量表示散列表的大小。

4. `hashFunction` 成员函数用于计算键的散列值。

5. `insert` 成员函数用于将键插入到散列表中。首先计算键的散列值,然后在对应位置的链表中查找键是否已存在,如果不存在,则将其插入到链表的末尾。

6. `search` 成员函数用于在散列表中查找键。首先计算键的散列值,然后在对应位置的链表中遍历查找键。

7. `remove` 成员函数用于从散列表中删除键。首先计算键的散列值,然后在对应位置的链表中遍历查找键,如果找到,则将其从链表中删除。

五、总结

本文介绍了链地址法在散列表中的实现,并通过C++代码示例展示了其具体实现过程。链地址法是一种有效的解决散列冲突的方法,通过在每个散列位置维护一个链表来存储具有相同散列值的元素。在实际应用中,可以根据具体需求调整散列表的大小和散列函数,以提高散列表的性能。