📅  最后修改于: 2023-12-03 15:40:55.190000             🧑  作者: Mango
散列技术是计算机领域中非常重要的技术之一,它是通过把一个大的、复杂的数据结构映射到一个简单的、易于管理的数据结构的方法来实现的。在散列技术中,散列表是常用的一种数据结构。
本文将介绍如何用 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;
};
通过上述的散列算法和链式散列表的实现,我们可以很方便地进行散列操作。在实际应用中,可以根据具体的需求,灵活选择不同的散列算法和散列表实现方式。