树状图还是哈希图?

2022-08-31 13:19:01

何时使用哈希图或树状图?

我知道我可以使用TreeMap在需要对元素进行排序时对其进行迭代。但仅此而已吗?当我只想查阅地图或一些最佳特定用途时,没有优化?


答案 1

TreeMap提供有保证的 O(log n) 查找时间(和插入等),而如果哈希代码适当地分散键,则提供 O(1) 查找时间。HashMap

除非您需要对条目进行排序,否则我会坚持使用.当然也有。我不记得它们之间差异的细节,但这是一个完全合理的“默认”选项:)HashMapConcurrentHashMapHashMap

为了完整起见,我应该指出,大约一个月前,在Stack Overflow上讨论了各种地图的内部结构。请参阅此问题中的评论,如果bestsss很高兴我这样做,我将将其复制到此答案中。


答案 2

哈希表(通常)执行搜索操作(查找),其复杂度在 的范围内,平均大小写复杂度为 ;但是,二叉搜索树 (BST 的) 执行的搜索操作(查找)的复杂度为 ,平均大小写复杂度为 。每个(和每个)数据结构的实现都应该知道(由您自己知道),以了解操作的优点,缺点,时间复杂性和代码复杂性。O(n)<=T(n)<=O(1)O(1 + n/k)O(n)<=T(n)<=O(log_2(n))O(log_2(n))

例如,哈希表中的条目数通常具有一些固定数量的条目(其中某些部分可能根本不填充)并带有冲突列表。另一方面,树通常每个节点有两个指针(引用),但如果实现允许每个节点两个以上的子节点,并且这允许树随着节点的添加而增长,但可能不允许重复,则可能会更多。(Java TreeMap 的默认实现不允许重复)

还有一些特殊情况需要考虑,例如,如果特定数据结构中的元素数量无限制地增加或接近数据结构底层的限制,该怎么办?执行一些重新平衡或清理操作的摊销操作如何?

例如,在哈希表中,当表中的元素数变得足够大时,可能会发生任意数量的冲突。另一方面,树木通常需要在插入(或删除)后进行重新平衡程序。

因此,如果您有类似缓存的东西(例如,有界元素的数量或大小已知),那么哈希表可能是您最好的选择;但是,如果你有更像字典的东西(例如,填充一次并查找多次),那么我会使用树。

然而,这只是在一般情况下(没有提供任何信息)。您必须了解它们如何发生的过程,以便在决定使用哪种数据结构时做出正确的选择。

当我需要集合的多映射(范围查找)或排序平展时,它不能是哈希表。


推荐