上一篇博客介绍了哈希表及处理哈西冲突的一种算法——开放定址法,这篇博客在介绍一下处理哈西冲突的另一种方法——拉链法。就是建立哈希表后,在每个位置下联一条链表,将数据用哈希函数处理后放入相应的链表中。
我个人认为就处理哈希冲突的这两种算法来说各有利弊,因为建立哈希表为了便于查找;使用开放定址法时,当第一次定位没找到时,会向后遍历直到找到或遍历完整个哈希表为止,极端时要遍历整个表。而拉链法在定位后,只用向当前位置下的链表遍历进行查找,但如果链表过长是也会降低效率;我们可以使哈希表足够长以减少链表的长度,提高效率。
#include<iostream>
#include<vector>
using namespace std;
template<class K,class V>
#include<vector>
using namespace std;
template<class K,class V>
struct HashNode //哈希表节点,保存数据
{
K _key;
V _value;
HashNode<K,V>* next;
HashNode(const K& key,const V& value)
:_key(key)
,_value(value)
,next(NULL)
{}
};
template<class K,class V>
class HashTable
{
typedef HashNode<K,V> Node;
public:
HashTable()
:_size(0)
{}
~HashTable()
{
for(size_t i=0;i<_table.size();i++)
{
Node* cur=_table[i];
if(cur==NULL)