数据结构是计算机存储、组织数据的方式。
通常情况下,精心选择的数据结构可以带来更高的运行或存储效率
数据存储的常用结构有:栈、队列、数组、链表和红黑树
一端开口(栈顶),一端封闭(栈底)
特点:先进后出
后端开口(队尾),前端开口(对头)
特点:先进先出
数组名[索引]
查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低
长度固定
使用时机:经常做查询,少做增删
查询数据是否存在,必须从头(head)开始查询
查询第n个数据,必须从头(head)开始查询
链表是一种增删快的模型(对比数组)
链表是一种查询慢的模型(对比数组)
因为增删数据也要从头查询,所以实际速度也非常慢,但是对比数组还是更有优势一点。
实际更多的用双向链表,既可以从头到尾,也可以从尾部到头部。
比如长度为100的链表,我们要查询第95个数据,我们可以从尾部开始查,效率更高。
二叉树是指每个节点的子节点数量不超过2
在二叉树的基础上,元素排列有顺序,左子树元素小,右子树元素大。
在二叉树相比于普通二叉树的优势在于查找速度较快。
虽然二叉查找树的元素是有顺序的,但是某些特殊情况下,二叉查找树会退化成链表。
二叉树退化成链表结构,不再具有查询优势。
在二叉查找树的基础上,规定左右两个子树的高度差不超过1。
任意节点的左右两个子树都是一颗平衡二叉树。
在添加一个节点之后,该树不再是一颗平衡二叉树时,将触发旋转。
左旋:将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让给已经降级的根节点当右子节点。
右旋:将根节点的左侧往右拉,原先的左子节点变成新的父节点,把多余的右子节点让给已经降级的根节点当左子节点。
平衡二叉树是高度平衡的,当执行插入或者删除操作时,只要左右子树高度差超过1时,就要通过旋转来保持平衡,但是旋转是非常耗时的。
由此可见,平衡二叉树是适用于元素增删少,而查找较多的场景。
由于维护高度平衡的代价较大,所以平衡二叉树实际的应用并不多,更多时候会选择更加高效的红黑树。
红黑树是特殊的二叉查找树,在每个节点上有一个存储位表示节点的颜色,可以是红或黑(非红即黑)
红黑树是一种弱平衡二叉树,相对于要求严格的平衡二叉树来说,它的旋转次数相对较少。
对于查询,插入,删除都较多的情况,我们可以使用红黑树达到整体性能的提升。
红黑树不是高度平衡的,它的平衡是通过“红黑规则”进行实现的
规则:
1.每一个节点或是红色的,或者是黑色的。
2.根节点必须是黑色
3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的。
4.不能出现两个红色节点相连的情况
5.对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同的黑色节点。
6.新加入的节点是红色的,如果加入后不满则红黑规则,需要进行旋转或变色。
如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。