C++哈希表之线性探测法实现详解

 更新时间:2022年05月04日 10:50:24   作者:liufeng2023  
线性探测法的优点:只要散列表未满,总能找到一个不冲突的散列地址;缺点:每个产生冲突的记录被散列到离冲突最近的空地址上,从而又增加了更多的冲突机会

1、哈希表-线性探测法理论

在这里插入图片描述

线性探测法的理论我们在上一篇博客已经阐述了。

现在我们来看看线性探测法的增删查的代码思想:

1.1、哈希表的增加元素

在这里插入图片描述

注意:

往后遍历寻找空闲位置的时候,要注意是环形遍历哦!不然访问数组就越界了。

在添加元素,发生位置被占用,即发生哈希冲突后,在向后遍历寻找空闲位置的时候,我们要知道,这个空闲的位置是有两种情况的:

1、这个位置一直是空的,没放过元素。

2、这个位置是空的,以前放过元素,后来被删除了。

1.2、哈希表的查询操作

在这里插入图片描述

在这里插入图片描述

  • 当用哈希函数计算得出的下标值是3,然后去访问数组,查询时,发现该值不等于要查询的元素的值val,说明当时放val的时候发生了哈希冲突,这时候就要向后遍历了;
  • 访问4下标的时候发现这个位置是空的(空的有两种情况),如果这个位置一直是空的,则就不用继续向后找了,val不存在!因为是线性探测法,所以当时val如果要放的时候肯定是要放在这里的。
  • 但是如果这个位置是空的,但是之前放过元素,后来被删除了,这个位置之前存放了元素,然后val插入的时候,就插到后面的空闲的位置了,所以此时我们还要继续往后遍历寻找val值。

在这里插入图片描述

所以我们需要定义一个Bucket节点来表示每一个元素的所有的内容。

在这里插入图片描述

//桶的状态
enum State
{
	STATE_UNUSE, //从未使用过的桶
	STATE_USING, //正在使用的桶 放着是一个有效的元素,没有被删过 
	STATE_DEL,  //元素被删除了的桶,认为桶里的元素无效了 
};
//我们删除桶里的元素,并不是真正把值删除掉,而是把桶的状态置为STATE_DEL就认为桶里的元素无效了 
//桶的类型
struct Bucket
{
	Bucket(int key = 0, State state = STATE_UNUSE)
		: key_(key)
		, state_(state)
	{}
	int key_;      //存储的数据
	State state_;  //桶的当前状态
};

1.3、哈希表的删除操作

在这里插入图片描述

2、哈希表-线性探测法代码实现

2.1、素数表中的素数

求素数的代码:(用于素数表中的素数取值)

在这里插入图片描述

在这里插入图片描述

int main()
{
	int data = 3;
	for (int i = data; i < 10000; i++)
	{
		int j = 2;
		for (; j < i; j++)
		{
			if (i % j == 0)
				break;
		}
		if (j == i)
			cout << i << " ";
	}
	cout << endl;
	return 0;
}

到此这篇关于C++哈希表之线性探测法详解使用的文章就介绍到这了,更多相关C++线性探测法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言模拟实现库函数详解

    C语言模拟实现库函数详解

    C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用,下面让我们一起来详细了解它
    2022-07-07
  • C++递归与分治算法原理示例详解

    C++递归与分治算法原理示例详解

    这篇文章主要为大家介绍了C++递归与分治算法的策略原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • C语言FlappyBird飞扬的小鸟实现开发流程

    C语言FlappyBird飞扬的小鸟实现开发流程

    因为在家宅了好多天,随手玩了下自己以前做的一些小游戏,说真的,有几个游戏做的是真的劣质,譬如 flappybird 真的让我难以忍受,于是重做了一波分享给大家
    2022-11-11
  • C++11中的时间库std::chrono(引发关于时间的思考)

    C++11中的时间库std::chrono(引发关于时间的思考)

    这篇文章主要介绍了C++11中的时间库std::chrono(引发关于时间的思考),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C++编程指向成员的指针以及this指针的基本使用指南

    C++编程指向成员的指针以及this指针的基本使用指南

    这篇文章主要介绍了C++编程指向成员的指针以及this指针的基本使用指南,与C语言一样,存储的数值被解释成为内存里的一个地址,需要的朋友可以参考下
    2016-01-01
  • C语言实现简单的推箱子游戏

    C语言实现简单的推箱子游戏

    这篇文章主要为大家详细介绍了C语言实现简单的推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言实现字符串转浮点函数的示例

    C语言实现字符串转浮点函数的示例

    字符串不仅可以转换为整数,也可以转换为浮点数,本文主要介绍了C语言实现字符串转浮点函数的示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-02-02
  • c语言static关键字用法详解

    c语言static关键字用法详解

    大家好,本篇文章主要讲的是c语言static关键字用法详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++ LeetCode300最长递增子序列

    C++ LeetCode300最长递增子序列

    这篇文章主要为大家介绍了C++ LeetCode300最长递增子序列示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Qt自制一个小闹钟的实现示例

    Qt自制一个小闹钟的实现示例

    本文主要介绍了Qt自制一个小闹钟的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09

最新评论