哈希表是一种数据结构,它可以根据键值(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明确
1439

被折叠的 条评论
为什么被折叠?



