【发布时间】:2015-06-20 18:07:09
【问题描述】:
我正在编写只需要整数的双哈希表。
unsigned int DoubleHashTable::HashFunction1(unsigned int const data)
{
return (data % GetTableSize());
}
unsigned int DoubleHashTable::HashFunction2(unsigned int const data, unsigned int count)
{
return ((HashFunction1(data) + count * (5 - (data % 5)) % GetTableSize()));
}
并尝试使用 SetData() 将数据插入表中
void DoubleHashTable::SetData(unsigned int const data)
{
unsigned int probe = HashFunction1(data);
if (m_table[probe].GetStatus())
{
unsigned int count = 1;
while (m_table[probe].GetStatus() && count <= GetTableSize())
{
probe = HashFunction2(data, count);
count++;
}
}
m_table[probe].Insert(data);
}
将 100 个整数项放入大小为 100 的表中后,表显示一些索引留为空白。我知道,这将需要 O(N) ,这是最坏的情况。我的问题是,即使需要最坏的搜索时间,项目也应该插入没有空白空间的表中,对吗?我找不到我的功能的问题。
附加问题。有众所周知的哈希算法,双重哈希的目的是尽可能减少冲突,H2(T)是H1(T)的备份。但是,如果众所周知的散列算法(如 MD5、SHA 等,我不是在谈论安全性,只是众所周知的算法)更快且分布良好,为什么我们需要双重散列?
谢谢!
【问题讨论】:
-
双重散列有时很有用,因为没有完美的散列函数。我们能做的最好的就是尽量减少碰撞。另外,你在散列什么整数?
-
只使用 rand() 函数生成无符号整数类型的随机数。我的表大小是 101(质数),并且将 101 个项目放入表中。
-
我建议插入大量随机数,比如 1000 * tableSize,看看每个槽的填充情况。分布应该差不多。
-
我尝试插入总是大于 10000 的随机数,rand() % 10000 + 10000。结果剩下 5 个空格。 (表的大小是 101)实际上,我无法遵循您的评论,大数字有什么区别?在我的脑海里,如果没有问题,桌子总是要满的。
-
我发现了问题,HashFunction2() 返回的索引号错误,大于表的大小...(当表的大小为 11 时,它返回 13)我理解双散列的概念和线性散列与非常好的计算之间的区别。 H2(T) 有规则吗?我现在用的H2(T)是从网上找的,刚看了某大学CS课的ppt文件...
标签: hash hashtable linear-probing double-hashing