个人笔记整理——常用的数据结构

以下为个人在复习过程中的笔记整理,从笔记本上挪到博客上也能加深一遍记忆,细节不完整,好歹有个大概的了解。


目录

 

1、数组

2、链表

3、栈

4、队列

5、树

6、散列表

7、堆

8、图


1、数组

优点:索引查询快,遍历方便;

缺点:只能存储一种元素,增删慢,需要移动其他元素。

 

2、链表

物理存储上非连续、非顺序的存储结构,逻辑顺序是通过链表的指针地址实现的。

优点:不用初始化容量,可以任意增删且十分方便;

缺点:大量指针域占用额外空间,遍历查找耗时。

链表的分类:

a.单向链表:每个节点包括一个data数据域以及一个指向后继节点的指针域next。

b.双向链表:每个节点包括一个data数据域以及两个分别指向前驱和后继节点的指针域prev和next。

c.循环链表:链表的尾节点的指针域next不指向null,而是指向头节点。

在面试过程中数组和链表的区别是最基本的问题,有时候也会问到“Arraylist和Linkedlist的区别”,其中Arraylist的底层实现是数组,Linkedlist的底层实现的链表,下图摘自:https://blog.csdn.net/weixin_42468526/article/details/81178698

个人笔记整理——常用的数据结构_第1张图片

 

3、栈

一种只能在一端进行操作的线性表,使用先进后出的原则,常用于实现递归功能方面的场景。

在JVM中也有很多关于栈的使用,Java的栈内存由编译器自动分配和释放,生命周期短,且比较小,使用后进先出(LIFO)内存分配规则,速度较快。

Java中有直接封装好的Stack类,可直接进行使用,参考https://www.iteye.com/blog/haoran-10-1490811

 

4、队列

只能前端进行删除操作,后端插入操作,不能对中间的元素进行操作的特殊线性表。队列和栈一样,是一种受限制的线性表。

队列可分为:顺序队列、链队列、循环队列。其中循环队列的判满判空条件时需要注意的点。在循环队列中常常牺牲一个存储单元来满足判断的逻辑,当头指针在尾指针的下一个位置时(再入队一个元素,尾指针后移,就与头指针遇上了,所以不能入了),队满;当头指针和尾指针在同一位置时,队空。可参考https://blog.csdn.net/li1914309758/article/details/81363166

 

5、树

树不同于前面的线性表结构,是一种层级式的数据结构,常见的有以下分类:

  • 二叉树

每个节点最多有两个子树的树结构(左右子树是有顺序的),其存储可使用二叉链表:lchild | data | rchild(两个指针域,一个数据域)。

树的遍历是指,从根节点出发,每个节点被访问一次,可分为前序、中序、后序、层次遍历,已知中序遍历+前/后序遍历,可唯一确定一棵二叉树,仅知前序+后序,不可唯一确定。

前序:根->左->右;

中序:左->根->右;

后序:左->右->根;

层次遍历:总以层次遍历的顺序储存节点,用一组数据,按下标顺序遍历。

 

  • 线索二叉树

线索化二叉树:遍历一次二叉树,在遍历过程中检查左右指针域是否为空,并将其前驱和后继节点信息保存的过程。加上前驱后继节点信息的二叉树即为线索二叉树。

 

  • 二叉搜索树

又称二叉排序树,左子树上的节点均小于根节点的值,右子树上的节点均大于根节点的值。二叉排序树用数组进行存储,查找效率高。

 

  • 二叉平衡树(AVL)——重要

左子树上的所有节点都比根节点的值小,右子树上的所有节点的值都比根节点的值大,且左右子树的高度差最大为1。即平衡二叉树在二叉搜素树的性质上增加了子树高度的限制。对二叉平衡树进行插入或者删除操作会导致树的旋转以重新进行平衡,平衡因子存储在节点信息当中,1、0、-1为平衡,2、-2为不平衡。

 

  • 满二叉树

满二叉树国内和国外的定义是不一样的。

国外定义:一棵二叉树的节点要么为叶子节点,要么有左右两个子节点。

国内定义:一棵二叉树如果每一层的节点数都达到了最大值,则为满。

 

  • 完全二叉树

由满二叉树的概念引出,对于深度为k有n个节点的二叉树而言,当且仅当每个节点都与满二叉树中的编号从1至n的节点一一对应时称之为完全二叉树。完全二叉树的叶节点仅出现在最大两层。

(注:深度为k的二叉树最多有[2的k次方-1]个节点。)

 

  • 红黑树

节点是红色或者黑色的树,这个颜色是根据特殊的着色方式进行赋予的。

特征:根节点为黑,每个红结点的两个子节点均为黑,不存在两个连续的红结点,任意节点到其每个叶结点的所有路径包含相同数目的黑色节点。

红黑树是一种非严格意义的平衡二叉树,用于C++的STL中,如map和set。

关于红黑树我其实没有弄明白,这里写上是为了类型的完整性,具体需要看其他的博客或者教材。

 

  • B树

又名多叉树、多路查找树,常用于数据库索引技术。描述B树时指定其阶数,阶数表示树中最多子节点数,如m阶B树是指节点最多有m个子节点的B树,当m为2时,即为二叉树。

当一棵树满足以下条件时,该树称为B树:

1、每个节点至多有m棵子树;

2、除根结点外,其他每个分支节点至少有m/2棵子树;

3、根节点至少有两棵子树;

4、所有叶子节点在同一层上;

5、有j个孩子节点的非叶子节点恰有j-1个关键码,按递增次序排列。

B树中所有节点都有指针,且内部节点出现的索引项不会再出现在叶子节点中。所有节点存储一个关键字,非叶子节点左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。

 

  • B+树

B+树适合文件系统,除了B树的基本特征外,B+树的非叶子节点指针与关键字个数相同,同时为叶子节点增加了链表指针,所有的关键字也都在叶子节点中出现。B+树只有叶子节点带指针,且叶子节点通过指针链接,非叶子节点作为叶子结点的索引,B+树总是到叶子节点才命中。

 

  • 字典树

又称为前缀树,是一种有序树,键通常为字符串。

一个结点的所有子树都有相同的前缀,根节点不包括字符,除根结点外每一个节点只包含一个字符,常用于文本词频统计。


(_ _)。゜zzZ越来越懒,记得越来越模糊,其实每个结构展开讲都有多相关知识的,这篇没准备细细地记,只要自己看的时候知道,啊,还有这个结构哇,大概是这样的呀。


6、散列表

也称为哈希表,根据关键码和值直接进行访问的数据结构,是一种以空间换时间的策略。通过key和value来映射到集合中的一个位置,来很快找到这个集合中的元素,key和value为一对一常作为set,一对多常作为map。

把key通过一个固定的算法函数(hash函数)转换成一个整型数字,然后将该数字对数组长度进行取余(找到它属于哪个桶),取余结果就当作数组下标(放进对应编号的桶)。

其特点是:访问速度快,需要额外的空间,存储无序,可能产生hash冲突。

 

7、堆

堆通常是一个可以被看做一棵完全二叉树的数组对象,有如下特点:

  • 堆中某个节点的值总是不大于或不小于其父节点的值;

  • 堆总是一棵完全二叉树。

堆可分为大顶堆和小顶堆,其大小关系仅存在上下层,即“父节点”和“孩子节点”存在关系,“兄弟节点”不存在大小关系。具体可参考这篇文章https://www.jianshu.com/p/6b526aa481b1

8、图

由顶点的有穷集V和边的集合E组成,边为顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系(可任意相关)。

对比线性表元素间的关系:每个元素仅存在一个直接前驱和后继。

对比树的层级关系:每个节点仅与一个上层元素相关,可与多个下层元素相关。

图的遍历:

  • 深度优先:以一个未被访问的顶点开始,沿当前顶点的边一直访问未被访问过的顶点,直到没有未被访问过的顶点时返回上一个顶点继续探测别顶点。··

个人笔记整理——常用的数据结构_第2张图片

  • 广度优先:类似于树的层序遍历,距离开始点最近的顶点首先被访问,最远的点最后被访问。

个人笔记整理——常用的数据结构_第3张图片

相关算法:

  • 有向图:拓扑排序、计算连通分量、计算最短路径(带权)

  • 无向图:最小生成树、DFS、BFS、MFS、最大连通图、强连通分量;等等。

部分概念:

  • 连通:对两个顶点而言,在顶点i和j之间,若存在顶点和边的交替集合使i—>j,则称i和j为连通(存在路径使得i可达j)。

  • 连通分量:对图而言,无向图G的极大连通子图称为G的连通分量。

  • 拓扑排序:将G(V,E)中所有顶点排成线性序列,使得图中任意对顶点u和v,若边∈E(G),则u在线性序列中出现在v之前,这样的线性序列称为满足拓扑次序。


越写越简化了,主要是概念太多了QAQ,好好复习!

你可能感兴趣的:(笔记整理)