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

How do I implement linear probing in C++?

我是 Hash Maps 的新手,明天要交作业。我实施了一切,一切都很好,除了我发生碰撞的时候。我不太理解线性探测的想法,我确实尝试根据我的理解来实现它,但是由于某种原因,程序在 table 大小 < 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 个桶将永远不会获得相同的哈希索引。但这没有用。

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

  1. 从散列到的位置开始进行线性搜索,寻找用于存储您的键+值的空槽。
  2. 如果遇到的slot是空的,存储你的key+value;你完成了。
  3. 否则,如果它们的键匹配,则替换值;你完成了。
  4. 否则,移动到下一个插槽,寻找任何空的或键匹配的插槽,此时 (2) 或 (3) 出现。
  5. 为了防止超过 运行,执行所有这些操作的循环以 table 大小为模进行换行。
  6. 如果您 运行 一直回到原始散列位置并且仍然没有空槽或匹配键覆盖,则您的 table 已完全填充(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;
}

请注意,在线性探测哈希算法中扩展 table 是乏味的。我怀疑这将在您的学习中出现。最终你需要跟踪有多少插槽被占用,所以当 table 超过指定的负载因子(比如 80%)时,你扩展 table,重新散列新 p 上的所有条目大小,这将改变他们最终居住的地方。

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