一. 数据结构概述、栈、队列
1. 数据结构概述
2. 栈数据结构的执行特点
3. 常见数据结构之队列
二. 常见数据结构之数组
- 数组它就是内存中的一块儿连续区域。
- 数组变量存的是数组在堆内存当中的起始地址。
- 数组查询任意索引位置的值耗时相同,数组根据索引查询速度快。
- 数组是一种根据索引查询快,增删慢的模型。
- 数组增删元素要对元素进行移位,甚至可能要创建新数组。
三. 链表
- 链表中的每个元素节点首先是包含了自己的节点的地址,每个元素节点的内部包含了自己的数据值和下一个元素的地址。
- 头地址指向链表中的第一个元素。
- 链表只是增删那一刻相对来说比较快,增删数据要找到这个数据才能删,找的过程也就是查询的过程还是比较慢的。
链表的分类:
- 单向链表:只能从前往后找。
- 双向链表:从前可以往后找,从后也可以往前找。有个头地址,有个尾地址,头可以往后找,尾可以往前找。Java中双链表用的比较多。增删首尾元素的速度特别快。因为双链表可以直接定位首尾元素。
- 结论:数组根据索引查元素是最快的,而双链表增删首尾元素的速度是最快的。
补充:链表与数组的区别?
- 链表与数组的主要区别在于数据的存储方式。
- 数组是连续的链表,链表是不连续的数组。
- 数组是一种连续的数据结构,它将数据存储在一段连续的内存空间中,可以通过下标来访问数据。
- 链表是一种离散的数据结构,它将数据存储在一些离散的内存块中,每个内存块都包含了指向下一个内存块的指针,可以通过指针来访问数据。
- 数组的大小是固定的吗,一旦创建就不能改变;而链表的大小是动态的,可以根据需要动态的添加或删除元素。
- 数组的访问速度比链表快,因为数组中的元素在内存中是连续存储的,可以通过下标直接访问;而链表中的元素在内存块中是离散存储的,需要通过指针来访问。
- 链表的插入和删除操作比数组快,因为链表中的元素在内存中是离散存储的,可以通过指针来快速插入或删除元素;而数组中的元素在内存块中是连续存储的,插入或删除火元素需要移动其它元素,效率较低。
四. 二叉树和二叉查找树
- 二叉树和二叉查找树是我们后面一些特殊集合的底层数据结构。
- 二叉树是包含一个父节点,父节点产生一个左节点,还有一个右节点。每个节点最多只能有两个子节点,分别是左子节点和右子节点。
- 如果是根节点,它的父节点地址值就为null。
放了数据的二叉树:
二叉查找树:
- 二叉查找树它小的会往左边走,大的会往右边走。
- 二叉查找树它是一种二分查找的算法,目的:为了提高检索数据的性能。
- 二叉查找树又称二叉排序树或者二叉搜索树。
- 因为二叉查找树它小的会往左边走,大的会往右边走,因此左子树上所有节点的值都小于根节点的值,右子树上所有节点的值都大于根节点的值。
- 普通二叉树不怎么用,开发中用的最多的还是二叉查找树。
二叉查找树节点添加的一个机制:
- 规则:小的存左边,大的存右边,一样的不存。
- 将7作为根节点,4比7小往左边走,10比7大往右边走。
- 二叉查找树是一个增删改查都挺快的一个数据结构,相对来说比较完美,包括后续数据库检索数据也会用到这种数据结构。
五. 平衡二叉树(比较完美的一种二叉树结构)
二叉查找树存在的问题:
-
我们发现排好之后这个二叉查找树相当于是一个链表,而链表的话查询速度就慢了。
- 问题:出现瘸子现象,导致它的查询性能与单链表一样,查询速度变慢!
- 我们希望这个树它能在满足二叉树的规则之上,能够尽量的矮小,因为树越矮,去搜索的深度就会越短,可以提高检索的性能。
- 而平衡二叉树的目的就是为了把这个数做的尽量矮小,数据的分布尽量的均匀。
如何去满足成为一颗平衡二叉树:
- 平衡二叉树要求任意节点的左右两个字数的高度差不超过1,这样可以使元素分布的尽量均匀,把树做的尽量矮小。
- 思路:左边高,右拉。右边高,左拉。
- 左边高,右拉,右拉不行,就放弃右拉,先以不平衡的那个点左拉再整体右拉,反之亦然。
案例:使1234567成为一颗平衡二叉树: 4 2,6 1,3,5,7
六. 红黑树
- 红黑树与平衡二叉树的目的一样,都是为了提高数据的增删改查的性能。
- 红黑规则:黑红黑红交替的。
- 红黑树的每一个节点要多一个字段值来标记它是什么颜色。后面去看Java底层代码也能看到,有些是基于红黑树的,它的节点里面是有这种red,black这样的属性的。
- 路径算法:每条路径均包含相同数目的黑色节点。
- 红黑树:小的往左边走,大的往右边走。
怎样去通过红黑规则来保持平衡?
七. 索引
- 索引是一种数据结构,用于快速查找和访问数据。索引通常是基于某个属性或者字段的值和构建的,例如数据库中的主键或外键,或者文件系统中的文件名或路径。
- 索引可以大大提高数据的访问效率,因为它可以避免全表扫描,而是直接定位到需要的数据。
- 不同类型的索引有不同的实现方式,例如B+Tree索引、Hash索引、Full Text全文索引等
- 索引的缺点是会占用额外的存储空间,并且在插入、更新和删除数据时需要维护索引,因此会影响写入性能。所以,在设计索引时需要权衡读写性能和存储空间的消耗。