我正在学习实现哈希图线性探测的课程,这是讲师实现_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;
}
答案 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
,然后立即返回。进行大量线性探测是哈希值不正确(或恶意输入)的迹象