数据结构是指逻辑意义上的 数据组织方式 及其相应的处理方式。
为什么是逻辑意义上的数据组织方式?因为数据结构中落到数据存储上的表现形式不一定是一一对应的,甚至可能看不到原来数据的样子,所以叫做逻辑意义上的组织方式。
数据组织方式
-
表:至多有0到一个直接前距或者0到一个直接后距
-
树:直接前距是0个,直接后距可能是0到n个
-
图:直接前距和直接后距可能都是多个
-
散列:是根据hash算法来确定存储位置的数据结构方式。
数据处理方式
以某种特定的算法实现数据的增删改查以及遍历。
为什么遍历也算数据处理方式的一种?因为遍历数据时由第一个数据遍历到最后一个,不同的实现算法,遍历的效能是完全不一样的。所以它也是数据处理方式的一种。
算法复杂度,评价数据结构的好坏?
谈到数据结构,肯定就会想到算法复杂度。以前遇到过两个题:
-
请问O(log2n)与O(log3n)哪个的算法复杂度更复杂?这里算法复杂度是一样的。
-
AVL树和红黑树谁的数据结构好些?数据结构好与坏,没有绝对的好与坏,取决于它的场景(比如读多写少还是写多读少)和数据量。
什么是树:
-
一个节点,即只有根节点,也可以是一棵树。
-
其中任何一个节点与下面所有节点构成的树称为子树。
-
根节点没有父节点,而叶子节点没有子节点。
-
除根节点外,任何节点有且仅有一个父节点。
-
任何节点可以有0到n个子节点。
什么是二叉查找树?
二叉查找树特性:
-
左子树上所有节点值均小于或等于节点的值。
-
右子树上所有节点值均大于或等于节点的值。
-
任何递归左右子树也都是二叉查找树。
二叉树如何查找数据10?
因为10 > 9,所以查看右孩子13;
由于10 < 13,因此查看左孩子11;
由于10 < 11,因此查看左孩子10,发现10就是查找的节点。
这种方式就是二分查找的思想,查找所需的最大次数就是二叉树查找树的高度。
平衡二叉树?
平衡二叉树的性质:
-
树的左右高度差不能超过1
-
任何往下递归的左子树和右子树必须符合第1条性质
-
没有任何节点的空树或者只有根节点的树也是平衡二叉树
红黑树与AVL树
AVL树算法是以苏联数学家Adelson-Velsky和Landis名字命名的平衡二叉树算法。
红黑树是于1972年发明的,当时称为对称二叉B树,1978年得到优化,正式命名为红黑树。它的主要特征是在每个节点上增加一个属性来表示节点的颜色,可以是红色,也可以是黑色。
红黑树以各方面都不差的性能,在JDK集合中广泛使用。
红黑树的特性:
-
节点只能是红色或黑色。
-
根节点必须是黑色。
-
所以NIL(Nothing In Leaf)节点都是黑色。
-
一条路径上不能出现相邻的两个红色节点。
-
在任何递归子树内,根节点到叶子节点的所有路径上包含相同数目的黑色。
插入或删除节点时,导致红黑树性质发生改变,有两种调整方法:[变色]和[旋转]。而旋转又分成两种形式:[左旋转]和[右旋转]。
比较LinkedList和ArrayList:
在subList场景中,对父集合元素的增加或删除,均会导致子列表的遍历、增加和删除产生ConcurrentModificationException异常。