散列表(hash表)
有两种办法:
(1)开放地址法
(2)chaining法
注:java底层实现chaining法
讲解:
0、key-value中的value可以是null
1、确定数组的下标
2、hash冲突问题
3、capacity的默认值,capacity扩增时,需要确定扩增多大,扩增之后原本存储的数据下标是否需要改变
#总结
1、散列表能很好地解决精确查询(O(1) 复杂度),但无法解决范围查询(必须 O(n) 复杂度);
2、基于有序数组的二分搜索能很好地解决精确查询和范围查询(O() 复杂度),但无法解决插入和删除(必须 O(n) 复杂度);
3、基于二分搜索思想改进的链表(二叉搜索树)能很好地解决查询(包括范围查询)、插入和删除,所有的操作都是 O() 的时间复杂度;
4、二叉搜索树中以任意节点作为根的子树仍然是一棵二叉搜索树,这个特点很重要,它是递归操作的关键;
5、二叉搜索树存在节点倾斜问题,会降低操作性能,极端情况下会退化成普通链表,所有的操作都退化到 O(n) 复杂度;
6、为解决二叉搜索树的倾斜问题,实际应用中需引入相关平衡方案,本系列的后序文章将介绍三种常见的方案:红黑树、跳表和 B 树;
7、红黑树
至此,我们在两位教授的帮助下,大体厘清了红黑树的演化过程:
(1)找到二叉树倾斜的原因:向下生长;
(2)阻止倾斜的策略:改变生长方向——采用裂变式向上生长策略;
(3)基于 2,演化出 2-3 树;
(4)由于 2-3 树实现上的复杂性,引出用二叉树表示 2-3 树的想法——红黑树;
(5)基于 2-3 树的相关特性,总结出左倾红黑树的 4 条特性,其中特性 1 和特性 2 是核心特性;
(6)基于二叉搜索树的特性,发现三个核心操作:左旋、右旋和颜色翻转——有了这三板斧,便可以完全脱离 2-3 树来处理红黑树的平衡性,至此红黑树有了实现上的可能;