C++中带有向量的简单散列映射
simple hash map with vectors in C++
我正在学习第一学期,也是我的一员。科学作业我必须使用向量实现一个简单的哈希图,但我在理解这个概念时遇到了一些问题。
首先,我必须实现一个散列函数。为了避免冲突,我认为最好使用双重哈希,如下所示:
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;
}
}
}
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在c++中用vector填充一个简单的动态数组
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- (C++)分析树以计算返回错误值的简单算术表达式
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 将一系列数字映射到 CPP 中的值的简单方法
- yaml-cpp迭代具有未定义值的映射的最简单方法
- 简单的进程加载程序内存映射
- 研究一个简单的代码反汇编输出和内存映射
- 我的简单数独程序内存映射错误
- C++中带有向量的简单散列映射
- 在一个简单的映射函数中避免IF
- C++:有没有一种简单的方法可以将十六进制颜色"0xff2a2620""映射到更具可读性的字符串"lovelyBrown"?
- 读取映射到内存的CSV文件的最简单方法