数组,链表和树
数组
是在内存空间中分配的连续的存储空间, 因存储位置固定,数组检索较快(直接定位数组下标,即存储地址)。检索的时间复杂度为O(1)。但插入数据时,时间复杂度较差,O(n),数组内插入数据之后的数据均要位移。
链表
内存空间中分散的存储地址,以指针为逻辑牵引,建立虚拟的链式结构。搜索数据的时间复杂度为O(n),但插入新数据的时间复杂度为O(1)。
二叉树
理想状态下二叉树的插入,查找的时间复杂度均为O(logN),均衡了数组,链表两者的特点,适用于插入,和查找操作均衡且大量的场景下。二叉树在此场景下的性能优于数组和链表。
均衡二叉树
均衡二叉树才是对上述二叉树性能的完美体现,由于均衡二叉树满足特性,每个Node结点左结点的数据小于根节 点,右子树的数据大于根节点。由此,在遍历时,所查找数据仅需要递归的和根结点对比(迅速定位后续查找在结点的 左子树还是在右子树)。其查找逻辑等同于对数组的二分查找法,时间复杂度为O(logN)。均衡二叉树的插入操作,也是伴随着二分递归操作,定位位置,插入结点(就单个结点来说,地址指针 TreeNode.left和LinkedNode.next)一致,那么插入开销等同于查找开销。
B树
多子结点的均衡二叉树。
理想状态下二叉树的时间开销等同于对数组的二分查找。
二叉树的查找性能和二分查找(依托于数组)一致,但底层数据存储又是分散的(类似链表),如果进一步扩大此特征,淡化树的结构,便能更优异的利用数组和链表的特性。实现可二分查找的链表(就还是上述的均衡二叉树)。
但是对此进一步优化,链表的结点存储一个有序数组(B+树)(因其存储特性与物理机更匹配,其查询效率很高(完美利用了二分查找效率当然高)常用于数据库的数据映射,)。
b+树
b*树和b+树的最终目的一致,对b+树的存储结构建成过程进行优化。