关于哈希表的使用和原理

哈希表是一种数据结构,它可以根据键值(Key value)直接访问数据,提高查找的效率。

哈希表的原理:

        通过一个哈希函数(Hash function)将键值映射到一个数组的某个位置,这个位置也叫做哈希地址(Hash address)。如果不同的键值产生了相同的哈希地址,就会发生哈希冲突(Hash collision),这时候需要采用一些方法来解决冲突,比如开放地址法(Open addressing)或链表法(Chaining)。

哈希表的使用方法:

        先创建一个足够大的数组,然后定义一个合适的哈希函数,根据数据的特点和分布来设计。当要插入或查找一个数据时,先用哈希函数计算出它的哈希地址,然后在数组中找到对应的位置,如果该位置为空,就可以直接插入或返回查找失败;如果该位置已经有数据,就需要判断数据的键值是否和要插入或查找的数据相同,如果相同,就可以更新或返回查找成功;如果不同,就需要根据冲突解决方法来寻找下一个位置,直到找到空位或相同键值为止。

哈希表的优点:

        查找和插入的时间复杂度都是接近O(1)的,比其他的数据结构如树或链表都要快。

哈希表的缺点:

        它需要额外的空间来存储数组,而且数组的大小不容易调整;另外,哈希表的性能也依赖于哈希函数的设计,如果哈希函数不合理,会导致哈希冲突过多,降低效率。

下面,是我程序里面写的一个示例:

        大概用法就是通过查询对应的编号,来找到对应的函数,做一个函数的转绑,当然这只是哈希表的一种逻辑思路,哈希表的函数和使用逻辑都需要你自己去设计

	//创建一个哈希表,用于存储寄存器地址和处理函数的对应关系
	std::unordered_map<WORD, AdpFunc> reg_func_map_Ctl03;
	std::unordered_map<WORD, AdpFunc> reg_func_map_Ctl04;

	for (auto& auFun : m_vecRebindFun_03)
	{
		reg_func_map_Ctl03[auFun.wRegNo] = auFun.rbfunc;
	}

	//遍历m_vecRdCmd_03和auVec.vecModBusReg两个向量,使用哈希表中的数据来重新绑定处理函数
	for (auto& auVec : m_vecRdCmd_03)
	{
		for (auto& auDb : auVec.vecModBusReg)
		{
			if (reg_func_map_Ctl03.count(auDb.wRegNo) > 0) //如果哈希表中存在该寄存器地址
			{
				auDb.func = reg_func_map_Ctl03[auDb.wRegNo]; //重新绑定处理函数
			}
		}
	}

	for (auto& auFun : m_vecRebindFun_04)
	{
		reg_func_map_Ctl04[auFun.wRegNo] = auFun.rbfunc;
	}

	//遍历m_vecRdCmd_04和auVec.vecModBusReg两个向量,使用哈希表中的数据来重新绑定处理函数
	for (auto& auVec : m_vecRdCmd_04)
	{
		for (auto& auDb : auVec.vecModBusReg)
		{
			if (reg_func_map_Ctl04.count(auDb.wRegNo) > 0) //如果哈希表中存在该寄存器地址
			{
				auDb.func = reg_func_map_Ctl04[auDb.wRegNo]; //重新绑定处理函数
			}
		}
	}

我这里用的count只是找到有没有这个键值,没用明确要找到某个键值,可以换成find明确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值