二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。
散列表也是支持这些操作的,而且散列表的这些操作比二叉查找树更高效,时间复杂度是 O(1)。
既然散列表如此高效,那么散列表是不是可以完全替代二叉树呢。
或者说有没有什么地方用散列表是做不了的,必须用二叉树呢?
散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。
而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn)。
但是为什么我们不能完全用散列表去替代二叉树呢?
一
散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。
而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。
二
散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定。
尽管二叉查找树的性能也不稳定,但是在工程中,最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。
三
尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。
四
散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。
平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。
五
为了避免过多的散列冲突,散列表装载因子不能太大,特别是基于开放寻址法解决冲突的散列表,不然会浪费一定的存储空间。综合这几点,平衡二叉查找树在某些方面还是优于散列表的。
所以,这两者的存在并不冲突。我们在实际的使用过程中,需要结合具体的需求来选择使用哪一个。
来源:CSDN
作者:-红桃K
链接:https://blog.csdn.net/qq_42006733/article/details/104640962