哈希映射的查找功能的条件C ++

时间:2018-12-10 14:13:22

标签: c++

我正在学习实现哈希图线性探测的课程,这是讲师实现_find()函数的部分,该函数从哈希表中获取目标值的索引(此处为pos.key)。

但是在阅读代码时,我开始怀疑while循环的条件是否正确,因为我不确定索引和起始变量是否已初始化为哈希表的头索引。

我的意思是,如果搜索从哈希表的中间开始,并且在搜索中遇到状态为EMPTY的节点,因为它是线性探测,它将返回false而无需继续搜索,即使那只是在可用或已删除节点之间的一个空节点,或者从前一个部分搜索到起始点,在该位置仍可能是尚待搜索的值。

例如,如果给定的哈希表如下所示,并且搜索从第四个节点[avail]开始,

[可用] [已删除] [可用] [可用] [已删除] [空] [可用]

是否有可能在遇到[空]时不查看所有节点就结束搜索?

还是讲师会假设已定义m_hash的hash()来初始化索引和起始变量作为哈希表的头索引?

我要在这里检查我的怀疑是否合理。感谢您阅读我的问题,我们将不胜感激。

template<class TYPE, class HASH>
bool HashMap<TYPE,HASH>::_find(MapPos& pos) const
{
    int start, index;
    index = start = m_hash.hash(pos.key) % m_nArraySize;
    while(m_pArray[index].status != EMPTY) // AVAIL or DELETED
    {
        if(m_pArray[index].status == AVAIL && m_pArray[index].data==pos.key)
        {
            pos.index = index;
            return true;
        } 
        index= (index+ _next(pos.key)) % m_nArraySize;//_next() returns 1 making it linear probing
        if(index==start) return false;
    }
return false;
}

2 个答案:

答案 0 :(得分:1)

您写了

  

如果搜索从哈希表的中间开始,并且满足   在搜索中状态为EMPTY的节点,因为它是线性探测,所以它   在不继续搜索的情况下将返回false

是什么让您认为找到一个EMPTY节点时该函数将返回false?条件

if(index==start) return false;

确保只有在探查整个索引范围后才能返回false。在循环中查看以下指令:

index= (index+ _next(pos.key)) % m_nArraySize;

index到达m_nArraySize时,模%将使其为0,并且搜索将在数组的开头继续。结果,起始索引可以在阵列上的任何位置。

答案 1 :(得分:0)

是的,哈希映射返回“未找到”结果,而不查看所有条目。这是要点,它的数据结构比原始数组复杂。

这就是为什么状态为DELETED的原因。如果您删除某个条目,则根据在向前搜索时遇到EMPTY的指示,即测试后的值不在地图中的规则,仍必须找到该条目之后的所有内容。

一个好的哈希函数将在整个数组中均匀分布密钥,因此可能是您在搜索的第一个位置遇到要搜索的密钥或EMPTY,然后立即返回。进行大量线性探测是哈希值不正确(或恶意输入)的迹象