为什么用树不用链表?
树和链表都是数据结构中比较常见的存储模型,使用什么作为存储的数据结构根据场景,需求而定。
链表是什么?想象一根自行车链条,从中间折断,从一端到另一端刚好就是单向链表结构,在JAVA中每个链表节点作为一个类,属性为自身的数据和下一个节点的引用,一扣接一扣成为一张连续的链表!
链表的查找和删除,修改都需要从头部一个一个比较节点数据,直到找到匹配的那个数为止,很明显这样的查找次数大概为N/2(N为链表节点总数),也就是查询的效率使用大O表示法表示为O(N),线性级别;一个总数为N=1024的链表需要平均比较512次才能做后面的增删改操作,而修改和删除只需要改变节点引用,效率很高!
再来看树结构(以红黑树为例),就是生活中的树倒过来,所有的数据挂在根节点上,通过一定的策略(红黑树通过旋转,变色等,二叉搜索树通过比较父节点)放置在合适的位置上,通常树的深度都是常数级;
红黑树的查询速度是非常快的,因为查询效率为O(log2n),比如上面的1024的数据,最大的查询比较次数为10,效率非常惊人!删除节点也只需要最多三次旋转就可以实现平衡;
以上树结构举例使用红黑树,是因为红黑树是一种性能良好的平衡树,如果是二叉搜索树(规则为比父节点小的放在左子节点,大的放右子节点),如果插入的数据为顺序的,则二叉搜索树就退变为一个链表结构,效率降低!换句话说不是说树结构的查询效率一定比链表好!
在数据量很低的时候,推荐使用链表,因为数据结构简单,开发成本低,效率也不差!
在数据为顺序插入时,不应该使用二叉搜索树,在删除操作频繁的时候,不应该使用二叉搜索树(因为数据重新平衡需要很大的代价),而应该使用红黑树等有保证平衡的策略的树结构;
在数据量大的时候,使用平衡树结构的效率提升是显而易见的,从O(N)到O(log2n)的提升。
在JAVA8中,当hashMap的冲突(某个数组元素中的链表结构很长)达到一定值的时候,将会从链表结构转变为红黑树,提高hashMap的查找性能。
关于更多数据结构的问题,请持续关注,会有其他更多的分享提供,谢谢!