数据结构基础篇学习笔记

文章介绍了数据结构中的线性表,包括基于数组实现的线性表和链表,强调了它们在插入删除操作上的差异。此外,还讨论了栈和队列的概念,以及二叉查找树和平衡二叉树在保持平衡上的策略。红黑树的插入规则和哈希表的哈希碰撞解决方法也被提及。
摘要由CSDN通过智能技术生成

数据结构

线性表:线性表

底层是用数组进行实现的,存储一组相同类型的元素(用泛型进行限定),实现在数组指定位置上的添加删除元素操作,需要分配一块完整且连续的空间进行使用。

注意点:数组中存储的元素是一组相同的数据(泛型指定);默认数组size为10;当添加元素超过此时容量时进行扩容,扩容数量为当前数组的1.5倍

插入时,从数组最后一个元素开始进行操作,将每个元素都向后移动一位,最后将所需要的元素添加进来

删除时,从需要删除的位置开始,将后面的元素向前搬运一个位置进行覆盖

 线性表:链表

不需要连续的空间,实际上是各个分散的结点通过指针链接,每个结点存放一个元素以及一个指向下一节点的指针

带头结点链表(最开始有一个为空的元素,指向第一个非空元素)

插入操作:

删除操作:

 链表在访问元素时,需要通过.next一个一个遍历寻找,而顺序表则利用数组的特性直接访问得到,所以,当我们顺序表读取快。
而顺序表在插入元素时需要移动后续元素,整个移动操作会浪费时间,而链表则不需要,只需要修改结点 指向即可完成插入,所以链表插入删除快。

 线性表:栈

只能从栈顶进行插入删除,先进后出的数据结构

每次新加或者删除元素时,只需要改变头结点的指针指向即可

 线性表:队列

秉承先来后到的原则,队列中的元素只能从存放的队尾元素进入,只能从队首出去

插入元素时,从头结点插入,移除时用队尾移除

 树:二叉树查找和平衡二叉树

二叉查找树左(右)子树的所有结点的值,都小(大)于其根节点的值,所以根据此特性,可以使用二分搜索一样查找比较方便

为了避免如图所示,构建二叉树一边倒的情况,引入平衡二叉树,在插入的时候动态的维护二叉树的平衡

若平衡因子(左子树高度减右子树的高度计算得出)绝对值大于1,就可以认定为二叉树失衡,根据插入位置的不同,做不同的调整。

若LL型失衡,找到最小失衡的的平衡树,需要将从根节点开始的三个节点进行右旋,将中间的结点作为新的根节点,其他两个结点编程左右树,将原先的右子树,移动至右侧

RR型,原理同上

 RL型,先针对添加的位置,向上三个节点作为根结点,进行右旋,此时可以转换为RR的情况,在进行一次左旋

 

LR型同理

 树:红黑树

插入规则大致如下

插入结点时,默认为红色

1.若为根节点,则改为黑色 

2.父结点和父结点的兄弟结点都为红色时,可以插入后通过变色进行二叉树的平衡。插入结点大的往右边放,小的往左边放

3.若插入的结点父节点也为红色,则需要把父节点以及父节点的兄弟节点改为黑色,将其爷爷结点改为红色(若为根节点则再改回黑色)

 

4.父结点为红色,父结点的兄弟结点为黑色(空时也视为黑色),就不能通过变色来解决此问题(因为此时若只通过变色,遍历根节点到空结点的经历的黑色结点数量将不一致)旋转规则就是上述的平衡二叉树的旋转规则,然后在进行改色

 

哈希表

根据哈希函数计算出每个对象唯一的hashcode,将对象存到哈希表对应位置(注意hashcode计算后的地址是无序的)

上述描述的hashcode有极小概率会相同,此时就叫哈希碰撞(哈希冲突),解决办法为使用链地址法,若同个地址链过多元素,例如超过8时,可以使用平衡二叉树或者红黑树进行性能优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值