在C ++中,如何处理哈希映射中的哈希冲突?如果发生碰撞,将花费多少时间来搜索元素?
而且,什么是好的哈希函数?
答案 0 :(得分:8)
根据您使用的系统,有许多不同的方法可以处理哈希映射中的冲突。以下是一些:
您选择的具体实施取决于您。去做最简单的事情。我个人认为链式散列(封闭寻址)是最简单的,如果这个建议有帮助的话。
至于什么是好的哈希函数,这实际上取决于您存储的数据类型。例如,字符串的散列函数通常与整数的散列函数非常不同。根据您想要的安全保证,您可能希望选择加密安全散列,如SHA-256
,或者只是简单的启发式,如单个位的线性组合。设计一个好的哈希函数是非常棘手的,我建议在得出结论之前,先挖掘一下你将要散列的特定结构的建议。
希望这有帮助!
答案 1 :(得分:1)
通常,哈希映射结构将冲突元素存储在列表或树中。如果它们在列表中,则插入元素花费O(1)时间,但是检索它们需要O(N)(N是碰撞元素的数量而不是有映射中的总数)。如果使用树,则插入和查找都是O(log N)。
良好的哈希函数是最小化冲突的函数。这取决于您的特定数据,但通常一个哈希的输出无法从其输入预测(一个随机散布空间中的项目)是一个不错的选择。