在C++中,哈希算法可能会遇到冲突,即不同的输入值映射到相同的哈希值。为了解决这个问题,我们可以采用以下几种冲突解决策略:
#include <iostream>
#include <list>
#include <vector>
class HashTable {
public:
HashTable(size_t size) : table(size) {}
void insert(int key) {
size_t index = hash(key);
table[index].push_back(key);
}
bool search(int key) {
size_t index = hash(key);
for (int value : table[index]) {
if (value == key) {
return true;
}
}
return false;
}
void remove(int key) {
size_t index = hash(key);
for (auto it = table[index].begin(); it != table[index].end(); ++it) {
if (*it == key) {
table[index].erase(it);
break;
}
}
}
private:
size_t hash(int key) {
return key % table.size();
}
std::vector<std::list<int>> table;
};
#include <iostream>
#include <vector>
class HashTable {
public:
HashTable(size_t size) : table(size, nullptr), size(size) {}
void insert(int key) {
size_t index = hash(key);
while (table[index] != nullptr) {
if (table[index] == key) {
return;
}
index = (index + 1) % size;
}
table[index] = key;
}
bool search(int key) {
size_t index = hash(key);
while (table[index] != nullptr) {
if (table[index] == key) {
return true;
}
index = (index + 1) % size;
}
return false;
}
void remove(int key) {
size_t index = hash(key);
while (table[index] != nullptr) {
if (table[index] == key) {
table[index] = nullptr;
return;
}
index = (index + 1) % size;
}
}
private:
size_t hash(int key) {
return key % size;
}
std::vector<int*> table;
size_t size;
};
这两种冲突解决策略各有优缺点。链地址法在空间效率上较高,因为每个槽位只需要存储一个链表节点。而开放地址法在空间效率上较低,因为需要额外的空间来存储探测路径。然而,开放地址法在某些情况下可以实现更好的负载因子,从而提高查找和删除操作的性能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。