数组,链表,树三种结构存储方式对比
数组
- 优点:通过下标方式访问元素,速度快,对于有序数组,还可以使用二分查找提高检索速度
- 如果要检索具体的某个值,或者插入值(按一定顺序),数组会整体移动,效率较低;并且如果数组已满需要进行扩容,消耗额外的时间
- ArrayList数组集合底层操作机制
- ArrayList中维护了一个Object类型的数组elementData
- 当创建对象时,如果使用的是无参构造器,则初始elementData容量为0(jdk7是10)
- 如果使用的是指定容量capacity的构造器,则储时为elementData容量为capacity
- 当添加元素时:先判断是否需要扩容,如果需要扩容则调用grow方法,否则直接添加元素到合适位置
如果使用的是无参构造器,第一次添加需要扩容的话,则扩容elementData的length为10,如果需要再次扩容的话,则扩容为1.5倍
如果使用的是指定capacity的构造器,需要扩容则直接扩容到1.5倍
链表
- 优点:存储位置不是连续的,在一定程度上,对数组的存储方式进行了优化,比如,插入一个数值结点。只需要将插入位置的前一个结点的next指向该节点,然后将该节点的next指向下一个结点,删除效率也很好
- 缺点:在进行检索时,效率仍然很低,每次检索都要从头节点一直遍历到目标结点
树
树结构可以提高数据存储,读取的效率;比如利用二叉排序树,即可以保证数据的检索速度,同时也可以保证树的插入,删除,修改的速度
树
常用术语
- 节点:又称节点对象,树中存储数据的结构体
- 根节点(root节点):树的最顶端的节点
- 父节点:某个节点的上一层节点称为该节点的父节点
- 子节点:某节点指向的下一层的节点称为该节点的子节点
- 叶子节点:没有子节点的节点
- 节点的权:节点的值
- 路径:从root节点找到该节点的路径
- 层:树的叶子节点到根节点相差的层面树,每跨父->子为一层
- 子树:某个节点下层看作一棵树,该树就是这个节点的子树
- 树的高度:树的最大层数
- 森林:多颗子树一起,构成一个森林
二叉树
-
树有很多种,每个节点最多只能有两个子节点的形式称为二叉树
-
二叉树的子节点分为左子节点和右子节点
-
如果该二叉树的所有叶子节点都在最后一层,并且节点总数为2n-1,n为层数,则称为满二叉树
-
如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,并且最后一层的叶子节点在左边连续 ,倒数第二层的叶子节点在右边连续,称为完全二叉树