为什么哈希表的密钥通常被认为是无序的?

时间:2016-06-16 12:01:06

标签: data-structures hash

我试图理解二进制搜索树(BST)在哈希表上的优势是什么,哈希表使用BST处理冲突管理。

在互联网的许多地方,如果你想迭代其键在一定范围内的所有元素,我会看到哈希表是坏的。

但为什么呢?我的意思是,为什么通常使用无序键而不是有序键?为什么这不是哈希函数可以支持的简单特征(例如,如所述here

3 个答案:

答案 0 :(得分:2)

哈希函数意味着尽可能随机,所以如果它们为你提供有序键(虽然它对某些东西非常有用),它会破坏随机化的目的,你很可能会得到更多的碰撞比你想象的还要好。

BST更适合排序数据,因为......当你把它放在那里时它会被排序。可以将您放入哈希表中的数据保存在单独的数据结构中(例如,只将密钥放入BST中),这样您就可以将它排序到某个地方并在哈希表中获得O(1)搜索时间。但当然,这需要您实现另一个数据结构,更多内存,执行其他操作等。

总之:如果您将严重依赖于正在排序的数据并且想要使用相对大量的数据,那么很多时候,请使用BST。否则,如果您想快速从数据结构中获取特定内容,请使用HashTable(如果您不担心使用内存,可能需要使用BST键)。

答案 1 :(得分:0)

BST优于哈希表没有优势,具体取决于您将选择一个或另一个的用例。如果你看Hash table,就可以看到

  

哈希表使用哈希函数来计算桶或槽数组的索引,从中可以找到所需的值。

由于计算了数组中的索引并且存在各种散列函数,这意味着不保证密钥的顺序。因此,您必须遍历所有索引才能找到给定的索引。

二进制搜索树比较键将它们放在正确的位置,因此BST中有键的顺序;因此,可以迭代一系列键。

答案 2 :(得分:0)

在哈希表上,您没有任何控件可以放置项目,因此以正确顺序迭代它们的唯一方法是每次扫描整个列表并找出下一个元素。

哈希表很好,因为插入时间和检索时间复杂度通常为O(1)(当然还有冲突)。范围迭代效率非常低

BST插入/检索时间为O(Log(N))。范围迭代是有效的。