数据结构
线性表:线性表
底层是用数组进行实现的,存储一组相同类型的元素(用泛型进行限定),实现在数组指定位置上的添加删除元素操作,需要分配一块完整且连续的空间进行使用。
注意点:数组中存储的元素是一组相同的数据(泛型指定);默认数组size为10;当添加元素超过此时容量时进行扩容,扩容数量为当前数组的1.5倍
插入时,从数组最后一个元素开始进行操作,将每个元素都向后移动一位,最后将所需要的元素添加进来
删除时,从需要删除的位置开始,将后面的元素向前搬运一个位置进行覆盖
线性表:链表
不需要连续的空间,实际上是各个分散的结点通过指针链接,每个结点存放一个元素以及一个指向下一节点的指针
带头结点链表(最开始有一个为空的元素,指向第一个非空元素)
插入操作:
删除操作:
链表在访问元素时,需要通过.next一个一个遍历寻找,而顺序表则利用数组的特性直接访问得到,所以,当我们顺序表读取快。
而顺序表在插入元素时需要移动后续元素,整个移动操作会浪费时间,而链表则不需要,只需要修改结点 指向即可完成插入,所以链表插入删除快。
线性表:栈
只能从栈顶进行插入删除,先进后出的数据结构
每次新加或者删除元素时,只需要改变头结点的指针指向即可
线性表:队列
秉承先来后到的原则,队列中的元素只能从存放的队尾元素进入,只能从队首出去
插入元素时,从头结点插入,移除时用队尾移除
树:二叉树查找和平衡二叉树
二叉查找树左(右)子树的所有结点的值,都小(大)于其根节点的值,所以根据此特性,可以使用二分搜索一样查找比较方便
为了避免如图所示,构建二叉树一边倒的情况,引入平衡二叉树,在插入的时候动态的维护二叉树的平衡
若平衡因子(左子树高度减右子树的高度计算得出)绝对值大于1,就可以认定为二叉树失衡,根据插入位置的不同,做不同的调整。
若LL型失衡,找到最小失衡的的平衡树,需要将从根节点开始的三个节点进行右旋,将中间的结点作为新的根节点,其他两个结点编程左右树,将原先的右子树,移动至右侧
RR型,原理同上
RL型,先针对添加的位置,向上三个节点作为根结点,进行右旋,此时可以转换为RR的情况,在进行一次左旋
LR型同理
树:红黑树
插入规则大致如下
插入结点时,默认为红色
1.若为根节点,则改为黑色
2.父结点和父结点的兄弟结点都为红色时,可以插入后通过变色进行二叉树的平衡。插入结点大的往右边放,小的往左边放
3.若插入的结点父节点也为红色,则需要把父节点以及父节点的兄弟节点改为黑色,将其爷爷结点改为红色(若为根节点则再改回黑色)
4.父结点为红色,父结点的兄弟结点为黑色(空时也视为黑色),就不能通过变色来解决此问题(因为此时若只通过变色,遍历根节点到空结点的经历的黑色结点数量将不一致)旋转规则就是上述的平衡二叉树的旋转规则,然后在进行改色
哈希表
根据哈希函数计算出每个对象唯一的hashcode,将对象存到哈希表对应位置(注意hashcode计算后的地址是无序的)
上述描述的hashcode有极小概率会相同,此时就叫哈希碰撞(哈希冲突),解决办法为使用链地址法,若同个地址链过多元素,例如超过8时,可以使用平衡二叉树或者红黑树进行性能优化