0

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

所以我有一个 unsigned long 作为键,值是一个字符串,整数对。每个键映射到一个 bin,每个 bin 都可以有冲突。我没有将整个哈希表复制到数组中,而是逐个复制它,这样我就不需要遍历整个数组。首先,我将第一个哈希表的第一个 bin 复制到一个 Pairs 数组中,其中字符串和 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部分在数组中,如果不是,我将其添加到数组中。

然后我继续到下一个 bin..将第一个哈希表的第二个 bin 复制到数组中..然后不是遍历整个数组来检查数组中第二个哈希表的第二个 bin 中的内容,而是开始搜索来自将第二个 bin 的第一个元素插入数组的数组索引。

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

还有其他方法吗?

4

1 回答 1

0

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

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

于 2011-05-07T17:30:38.997 回答