LeetCode 101 中的内容
补充-哈希表
哈希表又称散列表,使用O(n)空间复杂度存储数据,通过哈希函数映射位置从而实现近似O(1)时间复杂度的插入、查找、删除等操作。
C++中要查找元素是否在集合中可以使用unordered_set
。
如需同时存储键和值,则需要用unordered_map
。
如果元素有穷,并且范围不大,那么可以用一个固定大小的数组来存储或统计元素。
如果需要维持大小关系,且插入查找并不过于频繁,则可以使用有序的 set
或 map
来替代 unordered_set
或 unordered_map
。
实现一个简单的哈希表:
template<typname T>
class HashTable {
private:
vector<list<T>> hash_table;
// 哈希函数
int myhash(const T& value) const {
return hash(value, hash_table.size());
}
public:
// 构造与析构
// size是最好的质数
HashTable(int size = 31) {
hash_table.reserve(size);
hash_table.resize(size);
}
~HashTable() { }
// 查找哈希表是否存在该值
bool contains(const T& value) {
int hash_value = myhash(value);
const list<T>& slot = hash_table[hash_value];
std::list<T>::const_iterator it = slot.cbegin();
for (; it != slot.cend() && *it != value; ++it);
return it != slot.cend();
}
// 插入值
bool insert(const T& value) {
if (contains(value)) {
return false;
}
int hash_value = myhash(value);
std::list<T>& slot = hash_table[hash_value];
slot.push_front(value);
return true;
}
// 删除值
bool remove(const T& value) {
list<T>& slot = hash_table[myhash(value)];
auto it = find(slot.begin(), slot.end(), value);
if (it == slot.end) {
return false;
}
slot.erase(it);
return true;
}
};
// 一个简单的对整数实现的哈希函数
int hash(const int& key, const int& tableSize) {
return key % tableSize;
}