哈希桶的结构
处理哈希冲突的开链法/拉链法 —-哈希桶
使用素数做哈希表的长度,可以降低哈希冲突
素数表
size_t GetNextPrime(size_t num)//素数表
{
const int _PrimeSize = 28;
static const unsigned long _PrimeList[_PrimeSize] =
{
53ul, 97ul, 193ul, 389ul, 769ul,
1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
1610612741ul, 3221225473ul, 4294967291ul
};
for (size_t i = 0; i < _PrimeSize; ++i)
{
if (_PrimeList[i] > num)
{
return _PrimeList[i];
}
}
return _PrimeList[_PrimeSize - 1];
}
哈希桶的节点的定义
template <class K,class V>
struct HashNode
{
pair<K, V> _kv;
HashNode<K, V>* _next;
HashNode(const pair<K, V>& kv)
:_kv(kv)
, _next(NULL)
{}
};
哈希桶的插入
在插入前检查容量,以及负载因子。不够就进行增容,按素数表进行增,以减小哈希冲突。
找到位置后进行插入,每次插入都插入到表的下一个节点。如:
插入的为空时:
插入有节点时:
代码:
bool Insert(const pair<K, V>& kv)
{
_Check();