我正在研究用于散列的冲突解决方法,尤其是在开放寻址(例如线性探测,二次探测)中。线性探测很容易理解,因为它引用了类似的东西,
index = hash(value)
for i, 0 -> SIZE
seek_index = (index + i) % SIZE
if map[seek_index] is EMPTY
//proceed insertion
但对于二次探测,我想知道直到我需要搜索空槽?
index = hash(value)
for i, 0 -> SIZE // Is it should be up to SIZE ?
seek_index = (index + i*i) % SIZE
if map[seek_index] is EMPTY
//proceed insertion
如果限制是SIZE或其他什么,证明我会在地图中获得EMPTY单元格吗?
任何参考将不胜感激。
答案 0 :(得分:2)
无法保证您将探测数组中的每个元素。
例如,考虑SIZE=5
。然后你将在索引0,1,2,2,2,2,2,4处探测(相对于index
),其中(模5)为0,1,4,4,1所以如果空位在索引处2或3(相对于index
),那么你将找不到它们。
Squares mod n被称为“二次残差”,and the number of quadratic residues modulo n cannot exceed n/2 + 1 (n even) or (n + 1)/2 (n odd).