前言
对于哈希表这个结构或许大家都很熟悉,但是很多人都是学完数据机构知道哈希表是怎么个情况,但是没有实际上手去试一下。我就是这样一个人!!今天我看到STL里侯捷老师讲到hash_table的有关知识的时候,我就突然想把这个来实现一下。如果是考研数据结构对于这部分不是很了解也可以看一下,我会把这部分的一个难点讲清楚。
概念
其实哈希表的概念有很多,基本上都是书上现成的内容,我也不再进行copy了。我这里想说的一点就是关于哈希表的查找长度问题。这一次是链表法,所以就针对链表法进行查找长度的计算。下面就来看一下这个应该怎么处理。
主要是有两种查找长度,一个是查找成功的平均查找长度,另一个是查找不成功的平均查找长度。首先来看查找成功的平均查找长的。
- 查找0,首先使用数组定位到第一个指针处,再向下比较一次得到。所以应该是查找2次;
- 查找5,首先使用数组定位到第一个指针处,再向下比较两次得到。所以应该是查找3次;
- 查找10,首先使用数组定位到第一个指针处,再向下比较三次得到。所以应该是查找4次;
- 查找11,首先使用数组定位到第二个指针处,再向下比较一次得到。所以应该是查找2次;
- 查找22,首先使用数组定位到第三个指针处,再向下比较一次得到。所以应该是查找2次;
- 查找34,首先使用数组定位到第五个指针处,再向下比较一次得到。所以应该是查找2次;
所以全部次数应该是2+3+4+2+2+2,再除以6。但是还要一些人认为第一个位置不应该算比较次数,所以应该是1+2+3+1+1+1,再除以6。其实这个地方大可不必纠结,因为计算机对于这个比较操作多一次少一次并不会影响计算机的性能。对于考研党来说的话,就是针对对应学校的出题方法进行作答。如果没有明确的答案那么就是二者均可。
第二种就是查找不成功的平均查找长度,
- 查找第一个块的不成功长度为4;
- 查找第二个块的不成功长度为2;
- 查找第三个块的不成功长度为2;
- 查找第四个块的不成功长度为1;
- 查找第五块的不成功长度为2;
所以全部次数应该是4+2+2+1+2,再除以5。同样的也有人认为第一个位置不应该算一次。相应的也就减1即可。
具体方法
下面我就针对两个方法进行解释,insert和find。
bool hash_table::insert(const int& val)
{
if (find(val))
{
return true;
}
pNode& point = arr[val % 53];
node* newPoint = new node(val);
pNode _point = nullptr;
if (point == nullptr)
{
point = newPoint;
return true;
}
else
{
_point = point;