【问题标题】:simple hash map with vectors in C++C++ 中带有向量的简单哈希映射
【发布时间】:2013-07-02 11:46:09
【问题描述】:

我正在第一学期学习,并且是我的一部分。科学作业我必须使用向量实现一个简单的哈希图,但我在理解这个概念时遇到了一些问题。

首先我必须实现一个哈希函数。为了避免冲突,我认为最好使用双重哈希,如下所示:

do {
    h = (k % m + j*(1+(k % (m-2)));
    j++;
} while ( j % m != 0 );

其中 h 是要返回的哈希,k 是键,m 是 hash_map 的大小(和一个素数;它们都是 int 类型)。

这很简单,但是我需要能够在映射中插入或删除一对键和相应的值。

这两个函数的签名应该是bool,所以我必须返回true或flase,我猜当向量中的位置h没有元素时我应该返回true。 (但我不知道为什么 remove 也应该是 bool)。

我的问题是当插入函数返回 false 时该怎么办(即,当位置 h 上已经保存了一个键值对时 - 我将其实现为一个名为 find 的函数)。我显然可以通过简单地增加 j 来将它移动到下一个空闲位置,但是我的哈希函数计算的哈希不会再告诉我们某个键保存在哪个位置,从而导致删除函数的错误行为。

网上有没有不使用预先定义的 STD 方法的好例子? (我的谷歌在过去几天表现得很奇怪,只用当地语言回复我无用的点击)

【问题讨论】:

  • 维基百科文章(可能还有你的教科书)对这些问题进行了很好的讨论。
  • 密钥可以有多大?
  • 键可以是任何东西。
  • 我不明白,键可以是任何东西?字符串?
  • 如果您想这样做,只需在元素碰撞到下一个插槽时将其插入即可。当您在寻找元素时,您会正常获得哈希,然后检查它是否具有您想要的值。如果不是,则移动到下一个节点,直到找到具有您价值的 1 为止。 en.wikipedia.org/wiki/Hash_table#Collision_resolution 这称为线性探测

标签: c++ hashmap


【解决方案1】:

我被告知将我的评论移至答案,所以就在这里。我假设您的 get 方法采用您正在寻找参数的值。

所以我们要做的是一个称为线性探测的过程。

当我们插入值时,我们像往常一样对其进行散列,假设我们的散列值为 4

[x,x,x,,,x,x]

如我们所见,我们可以简单地将其插入:

[x,x,x,x,,x,x]

但是,如果我们在插入时取了 4,我们将简单地移动到下一个空的插槽

[x,x,x,**x**,x,,x,x]

在线性探测中,如果我们到达终点,我们会循环回到起点,直到找到一个槽。你不应该用完空间,因为你正在使用一个向量,当它开始接近满容量时可以分配额外的空间

这会在您搜索时引起问题,因为 4 的值可能不再是 4(在本例中为 5)。为了解决这个问题,我们做了一点 hack。请注意,只要负载平衡低于 1,我们仍然会得到 O(1) 的插入和检索运行时间复杂度。

在我们的 get 方法中,不是返回数组中 4 处的值,而是开始在 4 处查找我们的值,如果它在那里我们可以返回它。如果不是,我们查看 5 的值,依此类推,直到找到值。

伪代码中新的东西看起来像这样

bool insert(value){
   h = hash(value);
   while(node[h] != null){
      h++;

      if( h = node.length){
          h = 0;
       }
   }
   node[h] = value;

  return true;
}

得到

get(value){
    h = hash(value);
    roundTrip = 0; //used to see if we keep going round the hashmap

   while(true){

      if(node[h] == value)
          return node[h];

      h++;

      if( h = node.length){
          h = 0;
          roundTrip++;
       }

       if(roundTrip > 1){ //we can't find it after going round list once
          return -1;
       }
   }
}

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多