【发布时间】:2020-04-08 04:03:19
【问题描述】:
我是 Hash Maps 的新手,明天有一个作业要交。我实现了一切,一切都很好,除了当我遇到碰撞时。我不太理解线性探测的想法,我确实尝试根据我的理解来实现它,但是由于某种原因,程序停止了表大小
void hashEntry(string key, string value, entry HashTable[], int p)
{
key_de = key;
val_en = value;
for (int i = 0; i < sizeof(HashTable); i++)
{
HashTable[Hash(key, p) + i].key_de = value;
}
}
我认为通过每次向哈希函数添加一个数字,2个桶永远不会得到相同的哈希索引。但这没有用。
【问题讨论】:
-
我保证
sizeof(HashTable)是错误的,所以从那开始。i < sizeof(HashTable)是 指针 的大小。p是当前表的最大值吗? -
散列的基本原理是将较大的集合映射到较小的集合。这意味着总是有可能将较大集合的多个值映射到较小集合的相同值 -> 冲突。散列函数的质量只是降低了预期平均真实数据发生这种情况的概率,但它不能防止这种情况发生。因此,您的哈希表必须为此做好准备。一个简单的解决方案是为哈希表条目存储某种容器,例如一个列表。 (如果发生冲突,您必须测试此列表的每个值。)另一种解决方案是重新散列。
-
@WhozCraig 是的
p是表的最大值。 -
仅供参考:关于Collision Resolution的维基百科。
-
我认为通过每次向哈希函数添加一个数字,2 个桶永远不会得到相同的哈希索引。恕我直言,2 个桶不应该永远有相同的哈希索引(除非这是由所使用的特定冲突解决方案引起的)。