阶段总结(三)——为什么有了散列表我们还需要二叉树

南笙酒味 提交于 2020-03-04 05:17:40

二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。

散列表也是支持这些操作的,而且散列表的这些操作比二叉查找树更高效,时间复杂度是 O(1)。

既然散列表如此高效,那么散列表是不是可以完全替代二叉树呢。

或者说有没有什么地方用散列表是做不了的,必须用二叉树呢?

 

散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。

而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn)。

 

但是为什么我们不能完全用散列表去替代二叉树呢?

 

散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。

而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。

 

散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定。

尽管二叉查找树的性能也不稳定,但是在工程中,最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。

 

尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。

 

散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。

平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。

 

为了避免过多的散列冲突,散列表装载因子不能太大,特别是基于开放寻址法解决冲突的散列表,不然会浪费一定的存储空间。综合这几点,平衡二叉查找树在某些方面还是优于散列表的。

 

所以,这两者的存在并不冲突。我们在实际的使用过程中,需要结合具体的需求来选择使用哪一个。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!