我想将两个或多个哈希表合并在一起..只要我可以遍历它,最终形式是什么并不重要。这里的最终形式是一个数组。
所以我有一个unsigned long long作为键,值是一个字符串,int对。每个键映射到一个bin,每个bin可以有一个collisons。不是将整个哈希表复制到数组中,而是将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的第一个元素插入到数组中。
问题甚至迭代这种方式仍然相当冗长,因为每个垃圾箱可以包含1000多个垃圾箱,并且有数千个垃圾箱要经过。我想避免这种情况。我在想,因为每个字符串(长很长)对每个字符串都是唯一的,如果它在数组中,则将该键号的偏移量设置为1,如果不是,则设置为0。这样我只需要遍历数组,如果它在数组中。问题是很长一段时间太大了。我不能用这么多位分配一个数组......
还有其他办法吗?
答案 0 :(得分:0)
在复制第一个哈希表中的值时,使用相同的键构建临时哈希表,但值是每个哈希表插入的数组索引。然后,当从第二个哈希表复制值时,检查每个键是否在临时表中,如果是,则知道要立即更新哪个数组元素(否则只需在末尾推送新值)。
另一种方法是占用较少的空间但会改变输入,将第二个哈希表复制到第一个哈希表上,然后将组合结果复制到数组中。这自然会合并两个哈希表而没有额外的存储空间,但如果在执行程序时将进一步使用哈希表,则可能不会那么好。