将哈希表合并到数组中

merging hashtables into an array

本文关键字:数组 合并 哈希表      更新时间:2023-10-16

我想将 2 个或更多哈希表合并在一起。最终形式是什么并不重要,只要我能遍历它。 这里的最终形式是一个数组。

所以我有一个无符号的长作为键,值是一个字符串,int 对。 每个键映射到一个箱子,每个箱子都可以有列子。我不是将整个哈希表复制到数组中,而是逐个 bin 复制它,这样我就不需要遍历整个数组。首先,我将第一个哈希表的第一个 bin 复制到一个 Pair 数组中,字符串和 int 作为它的字段(键被忽略)'

类似的东西

Class Pair{
char* s;
int frequency;
};

要将其添加到数组中,我会有这样的东西...

Pair pair
pair.s=string of the hashtable value
pair.s=integer of the hashtable value
array[index]=pair;

然后要将第二个哈希表的第一个 bin 合并到数组中,我首先检查哈希表值的字符串是否已经在数组中,如果是,我只是更新与数组中的字符串对应的类对的 int 部分,如果不是,我将其添加到数组中。

然后我继续下一个垃圾箱。将第一个哈希表的第二个箱复制到数组中。然后,我不是遍历整个数组来检查第二个哈希表的第二个箱中的某些内容是否在数组中,而是从将第二个箱的第一个元素插入数组的数组索引开始搜索。

问题在于,即使以这种方式迭代仍然相当冗长,因为每个垃圾箱可以包含 1000+ 个 collisons,并且有数千个垃圾箱需要通过。我想避免这种情况。我在想,因为每个键(很长)对于每个字符串都是唯一的,如果它在数组中,则将该键号的偏移量设置为 1,如果它不在数组中,则将 0 设置为。这样,我只需要遍历数组(如果它在数组中)。问题在于,长篇实在是太大了。我无法分配具有这么多位的数组...

还有别的办法吗?

从第一个哈希表中复制值时,使用相同的键构建一个临时哈希表,但这些值是插入每个键的数组索引。 然后,从第二个哈希表复制值时,检查每个键是否在临时表中,如果是,您就知道要立即更新哪个数组元素(否则您只需将新值推到末尾)。

另一种方法,会占用更少的空间,但会改变你的输入,是将第二个哈希表复制到第一个哈希表上,然后将该组合结果复制到数组中。 这自然会合并两个哈希表,没有额外的存储空间,但如果哈希表将在程序执行中进一步使用,则可能不会那么好。