哈希表(链式)

这篇博客详细介绍了哈希表的链式实现,包括查找成功和不成功的平均查找长度计算。作者通过实例讲解了哈希表的insert和find操作,并提供了C++源代码,强调了使用array容器和命名空间的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

对于哈希表这个结构或许大家都很熟悉,但是很多人都是学完数据机构知道哈希表是怎么个情况,但是没有实际上手去试一下。我就是这样一个人!!今天我看到STL里侯捷老师讲到hash_table的有关知识的时候,我就突然想把这个来实现一下。如果是考研数据结构对于这部分不是很了解也可以看一下,我会把这部分的一个难点讲清楚。

概念

其实哈希表的概念有很多,基本上都是书上现成的内容,我也不再进行copy了。我这里想说的一点就是关于哈希表的查找长度问题。这一次是链表法,所以就针对链表法进行查找长度的计算。下面就来看一下这个应该怎么处理。
在这里插入图片描述
主要是有两种查找长度,一个是查找成功的平均查找长度,另一个是查找不成功的平均查找长度。首先来看查找成功的平均查找长的。

  1. 查找0,首先使用数组定位到第一个指针处,再向下比较一次得到。所以应该是查找2次;
  2. 查找5,首先使用数组定位到第一个指针处,再向下比较两次得到。所以应该是查找3次;
  3. 查找10,首先使用数组定位到第一个指针处,再向下比较三次得到。所以应该是查找4次;
  4. 查找11,首先使用数组定位到第二个指针处,再向下比较一次得到。所以应该是查找2次;
  5. 查找22,首先使用数组定位到第三个指针处,再向下比较一次得到。所以应该是查找2次;
  6. 查找34,首先使用数组定位到第五个指针处,再向下比较一次得到。所以应该是查找2次;

所以全部次数应该是2+3+4+2+2+2,再除以6。但是还要一些人认为第一个位置不应该算比较次数,所以应该是1+2+3+1+1+1,再除以6。其实这个地方大可不必纠结,因为计算机对于这个比较操作多一次少一次并不会影响计算机的性能。对于考研党来说的话,就是针对对应学校的出题方法进行作答。如果没有明确的答案那么就是二者均可。
第二种就是查找不成功的平均查找长度,

  1. 查找第一个块的不成功长度为4;
  2. 查找第二个块的不成功长度为2;
  3. 查找第三个块的不成功长度为2;
  4. 查找第四个块的不成功长度为1;
  5. 查找第五块的不成功长度为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;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值