【问题标题】:How do I implement linear probing in C++?如何在 C++ 中实现线性探测?
【发布时间】: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 &lt; sizeof(HashTable)指针 的大小。 p 是当前表的最大值吗?
  • 散列的基本原理是将较大的集合映射到较小的集合。这意味着总是有可能将较大集合的多个值映射到较小集合的相同值 -> 冲突。散列函数的质量只是降低了预期平均真实数据发生这种情况的概率,但它不能防止这种情况发生。因此,您的哈希表必须为此做好准备。一个简单的解决方案是为哈希表条目存储某种容器,例如一个列表。 (如果发生冲突,您必须测试此列表的每个值。)另一种解决方案是重新散列。
  • @WhozCraig 是的 p 是表的最大值。
  • 仅供参考:关于Collision Resolution的维基百科。
  • 我认为通过每次向哈希函数添加一个数字,2 个桶永远不会得到相同的哈希索引。恕我直言,2 个桶不应该永远有相同的哈希索引(除非这是由所使用的特定冲突解决方案引起的)。

标签: c++ collision probing


【解决方案1】:

具有线性探测的哈希表需要您

  1. 从散列到位置开始线性搜索,寻找一个用于存储键+值的空槽。
  2. 如果遇到的slot是空的,存储你的key+value;大功告成。
  3. 否则,如果它们的键匹配,则替换值;大功告成。
  4. 否则,请移至下一个插槽,寻找任何空的或匹配键的插槽,此时 (2) 或 (3) 会发生。
  5. 为防止溢出,执行所有这些操作的循环都以表格大小为模。
  6. 如果您一直运行回到原始的散列位置并且仍然没有空槽或匹配键覆盖,则您的表已完全填充(100% 负载)并且您无法插入更多键+值对。

就是这样。在实践中,它看起来像这样:

bool hashEntry(string key, string value, entry HashTable[], int p)
{
    bool inserted = false;
    int hval = Hash(key, p);

    for (int i = 0; !inserted && i < p; i++)
    {
        if (HashTable[(hval + i) % p].key_de.empty())
        {
            HashTable[(hval + i) % p].key_de = key;
        }

        if (HashTable[(hval + i) % p].key_de == key)
        {
            HashTable[(hval + i) % p].val_en = value;
            inserted = true;
        }
    }

    return inserted;
}

请注意,在线性探测哈希算法中扩展表是乏味的。我怀疑这将在你的研究中出现。最终,您需要跟踪占用了多少插槽,因此当表超过指定的负载因子(例如,80%)时,您扩展表,重新散列新 p 大小的所有条目,这将改变它们最终的位置居住。

无论如何,希望它有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2019-02-18
    • 2013-03-25
    • 2015-08-21
    相关资源
    最近更新 更多