C++中带有向量的简单散列映射

simple hash map with vectors in C++

本文关键字:简单 映射 向量 C++      更新时间:2023-10-16

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

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

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。(但我不知道为什么删除也应该是bool)。

我的问题是,当插入函数返回false时(即,当位置h上已经保存了一个键值对时——我将其实现为一个名为find的函数)该怎么办。很明显,我只需增加j就可以将其移动到下一个空闲位置,但我的哈希函数计算的哈希不会再告诉我们某个密钥保存在哪个位置,这导致了remove函数的错误行为。

网上有没有好的例子,不使用预先定义的STD方法?(我的谷歌在过去几天表现不佳,只会在本地语言中重复使用不有用的点击)

有人告诉我要把注释移到一个答案上,所以它就在这里。我假设你的get方法取你要找的参数值。

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

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

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

正如我们所看到的,我们可以简单地将其插入:

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

然而,如果我们插入时取4,我们将简单地移动到下一个空插槽

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

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

这将导致搜索时出现问题,因为4处的值可能不再为4(在本例中为5)。为了解决这个问题,我们做了一点破解。请注意,只要负载平衡低于1,插入和检索的运行时复杂性仍然为O(1)。

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

psudo代码中,新的东西看起来像这个

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;
       }
   }
}