哈希表(Hash Table),也称为散列表,是一种根据关键码值(Key-Value)进行直接访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。哈希表的核心思想是将关键码值通过一个哈希函数映射到一个固定的位置上,从而实现常数时间复杂度的查找和插入操作。
哈希表的应用非常广泛,以下是一些常见的应用场景:
1. 数据库索引:哈希表可以用来实现数据库的索引,以加快查询速度。
2. 缓存系统:哈希表可以用来实现缓存系统,以加快读取速度。
3. 字典:哈希表可以用来实现字典,以实现快速查找单词。
4. 计数器:哈希表可以用来实现计数器,以实现快速统计数据。
以下是一个简单的哈希表的实现,包括哈希函数和哈希表的操作函数。```c++
#include <iostream>
#include <vector>
using namespace std;
// 哈希表定义
class HashTable {
public:
HashTable(int size): size(size), data(size) {}
void insert(int key, int value) {
int index = hash(key);
for (int i = 0; i < data[index].size(); i++) {
if (data[index][i].first == key) {
data[index][i].second = value;
return;
}
}
data[index].push_back(make_pair(key, value));
}
int get(int key) {
int index = hash(key);
for (int i = 0; i < data[index].size(); i++) {
if (data[index][i].first == key) {
return data[index][i].second;
}
}
return -1;
}
void remove(int key) {
int index = hash(key);
for (int i = 0; i < data[index].size(); i++) {
if (data[index][i].first == key) {
data[index].erase(data[index].begin() + i);
return;
}
}
}
private:
int hash(int key) {
return key % size;
}
int size;
vector<vector<pair<int, int>>> data;
};
int main() {
HashTable ht(10);
ht.insert(1, 10);
ht.insert(2, 20);
ht.insert(11, 30);
cout << ht.get(1) << endl; // 输出10
cout << ht.get(2) << endl; // 输出20
cout << ht.get(11) << endl; // 输出30
ht.remove(2);
cout << ht.get(2) << endl; // 输出-1,因为已经被删除了
return 0;
}
输出:
```
10
20
30
-1
```
哈希函数
这个例子中,我们创建了一个哈希表,包含10个桶。然后我们对哈希表进行了插入、查找和删除操作,并输出了结果。
哈希函数不是随意的,它需要根据特定的要求来确定。哈希函数的主要作用是将输入的任意长度的数据映射成固定长度的哈希值,这个哈希值可以用于快速查找或比较数据。因此,好的哈希函数应该具有以下几个特点:
1. 一致性:对于相同的输入,哈希函数应该返回相同的哈希值。
2. 均匀性:哈希函数应该将输入的数据均匀地分布在哈希表的所有位置上,避免出现冲突。
3. 简单性:哈希函数应该是简单、高效的,不需要太多的计算和存储空间。
4. 不可逆性:哈希函数应该是不可逆的,即不能根据哈希值推出原始数据。
哈希函数的确定有很多方法,下面介绍两种常见的方法:
1. 直接寻址法:直接将关键字作为哈希值。这种方法适用于关键字的范围比较小的情况,例如字符型数据。
2. 除留余数法:将关键字除以某个数,然后取余数作为哈希值。这种方法比较常用,可以通过调整除数的大小来控制哈希表的大小和冲突率。
以下是使用除留余数法实现的哈希函数的示例代码:```c++
```
#include <iostream>
using namespace std;
int hash_func(int key, int size) {
return key % size;
}
int main() {
int key = 12345;
int size = 10;
int hash_value = hash_func(key, size);
cout << "The hash value of key " << key << " is " << hash_value << endl;
return 0;
}
在本例中,我们使用除留余数法,将关键字key除以哈希表的大小size,然后取余数作为哈希值。运行结果如下:
```
The hash value of key 12345 is 5
```
可以看到,哈希值为5,符合除留余数法的定义。