数据结构与算法
数据结构指的是一组数据的存储结构,算法指的是操作数据的一个方法。数据结构为算法服务,而算法要作用在特定的数据结构上。
一、数据结构
数组
数组是同一类型的元素按一定顺序排列的集合,在内存中的分配是连续的。数组会为存储的元素都分配一个自增的下标,通过下标来访问元素。
优点:查询速度快。
缺点:新增、删除慢。因为每次新增、删除都需调整后面元素的索引。
总结:数组查询快,增删慢,适用于频繁查询,增删较少的情况。
链表
链表由一系列节点组成,每个节点包含2个部分。1个用于存储元素的内存地址,另1个存储相邻节点的指针。
优点:新增、删除快。因为新增、删除只影响相邻的节点。
缺点:查询速度慢。查询需要从头查到尾,当所查元素在尾部时,查询效率势必较低。
总结:适用于需要频繁新增、删除的场景,查询操作相对较少。
栈
Stack,后进先出,是一种线性表。有出栈和入栈,只允许在栈顶操作。Java中的栈内存就是一个栈的数据结构,先调用的方法要等到后调用的方法结束才会出栈。
队列
Queue,先进先出,是一种线性表。只允许在表的一端进行插入,另一端进行删除。Java中,LinkedList实现了Deque。
树
具有层次关系的集合。树的分类有很多,平衡二叉树、红黑树、B树、B+树。
散列表
也叫哈希表(Hash)。是根据键和值直接进行访问的数据结构。
图
图是一系列顶点的集合,这些顶点通过一系列边连接起来组成图这种数据结构。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。
堆
堆可以看做是一颗用数组实现的二叉树,根据'堆属性'来排序。常见的堆有二叉堆、斐波那契堆等。
树的分类
1.二叉树
二叉树每个节点的子节点数量不能超过两个。
2.二叉查找树
二叉查找树又叫搜索二叉树。所有左子节点的值都小于根节点的值,所有右节点的值都大于根节点的值。
缺点:极端情况下,会变成链表。
3.AVL树
AVL树又叫平衡二叉查找树,通过左旋、右旋来维持树的相对平衡,左右子树的高度之差不超过1。适合用于插入删除次数少,查找多的情况。https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
4.红黑树
红黑树是特殊的平衡二叉查找树。每个节点增加一个存储位表示节点的颜色,要么是红色,要么是黑色;根是黑色;如果一个节点是红色的,那么它的子节点必须是黑色的。相对于要求严格的AVL树来说,它的旋转次数变少,所以对于查找、插入、删除操作多的情况下,可以使用红黑树。
缺点:规则复杂,旋转和变色操作耗时较长。
5.B树
一种平衡多路查找树,树的高度更低,每个节点可以存储多个元素,查找次数更少。
缺点:元素散落在各个节点,查找效率不稳定。
6.B+树
所有数据都存储在叶子节点,查找效率更稳定。叶子节点使用有序链表连接,便于范围查找。
为什么MySQL用B+树做索引?
MySQL的数据是存储在磁盘上,由于所需数据可能在磁盘上并不连续,一次查询就需要多次磁盘IO。所以MySQL需要一种尽可能减少磁盘IO次数的数据结构。
B+树的特点:
1.高度平衡:B+树是一种平衡树,会维持树的高度相对较低,减少查询时磁盘IO次数。
2.多路查找:B+树的每个节点可以存储多个关键字和指针,使得每次磁盘IO可以获取更多的数据。
3.有序:数据都按照顺序存储在叶子节点,并且叶子节点之间通过指针相连。范围查找和排序上拥有非常好的性能。
二、算法
常见算法有排序和查找两种
排序算法
插入排序、冒泡排序、希尔排序、快速排序、选择排序、堆排序、归并排序、基数排序
查找算法
顺序查找、二分查找
算法设计技巧
贪婪算法、分治算法、动态规则、随机化算法、回溯算法