哈希表
O(1)的查找操作
哈希表充分体现了算法设计领域的思想:空间换时间
键通过哈希函数得到的索引,分布越均匀越好
1 哈希函数的设计
1)整型
小范围正整数直接使用;
小范围负整数进行偏移;
大整数:取模,模一个素数;
下面的右侧分布就比较均匀:
2)浮点型
3)字符串
转换成整型处理:
优化一下:
代码实现:
4)复合类型
转成整型处理:
2 哈希冲突的处理——链地址法(Separate Chaining)
要想实现O(1)级别,显然使用静态数组,固定地址是不合理的,需要resize。
平均每个地址承载的元素多过一定程度,即扩容。
平均每个地址承载的元素少过一定程度,即缩容。
//哈希计算
int hash(K key) {
return (hashCode(key) & 0x7fffffff) % M;//计算索引
}
int hashCode(K key) {
std::hash<K> key_hash;
return key_hash(key);
}
3 添加元素
void add(K key,V value){
RBTree<K,V> *rbTree=hashTable[hash(key)];
if(rbTree->contains(key)){
rbTree->set(key,value);
}else{
rbTree->add(key,value);
size++;
//扩容
if(size>=upperTol*M)
resize(2*M);
}
}