繁体   English   中英

如何在 C++ 中实现线性探测?

[英]How do I implement linear probing in C++?

我是 Hash Maps 的新手,我明天有一个任务要交。 我实施了一切,一切都很好,除了发生碰撞时。 我不太明白线性探测的想法,我确实尝试根据我的理解来实现它,但是由于某种原因,程序停止了表大小 < 157 的工作。

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 个存储桶将永远不会获得相同的哈希索引。 但这没有用。

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

  1. 从散列到的位置开始线性搜索,寻找一个空槽,用于存储您的键+值。
  2. 如果遇到的槽是空的,存储你的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大小的所有条目,这将改变它们最终驻留的位置。

无论如何,希望它是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM