为啥哈希表键通常被认为是无序的?

Posted

技术标签:

【中文标题】为啥哈希表键通常被认为是无序的?【英文标题】:Why hash table's keys are usually considered unordered?为什么哈希表键通常被认为是无序的? 【发布时间】:2016-10-17 22:28:13 【问题描述】:

我试图了解二叉搜索树 (BST) 与使用 BST 处理冲突管理的哈希表相比有何优势。

在 Internet 上的许多地方,如果您想遍历键在特定范围内的所有元素,我发现哈希表很糟糕。

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

【问题讨论】:

也许很有趣? Advantages of Binary Search Trees over Hash Tables 【参考方案1】:

哈希函数的目的是尽可能随机,所以如果它们给你有序的键(虽然它对某些事情非常有用)它会破坏随机化的目的,你很可能会得到更多的碰撞超出您的预期。

BST 更适合对数据进行排序,因为...默认情况下,当您将其放入其中时,它会被排序。可以将您放入哈希表的数据以单独的数据结构排序(例如,仅将键放入 BST),这样您就可以将其排序在某处并且您在哈希表中获得 O(1) 搜索时间。但是当然这需要你实现另一个数据结构,增加内存,执行额外的操作等等。

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

【讨论】:

【参考方案2】:

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

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

由于数组中的索引是计算出来的,并且有各种散列函数,这意味着没有保证键的顺序。因此,您必须遍历所有索引才能找到给定的索引。

二叉搜索树比较keys把它们放在正确的位置,所以BST中keys是有顺序的;因此,我们可以迭代一系列键。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于为啥哈希表键通常被认为是无序的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥哈希表扩展通常通过将大小加倍来完成?

我可以在 R 中使用列表作为哈希吗?如果是这样,为啥这么慢?

哈希表 - 为啥它比数组快?

使用整数值作为哈希表的键是多么愚蠢?

C ++:指针作为哈希表中的键

为啥哈希表的大小为 127(素数)优于 128?