数据结构
Queue
什么是队列
队列是数据结构中比较重要的一种类型,它支持FIFO,尾部添加、头部删除(先进队列的元素先出队列),跟我们生活中的排队类似。
队列的种类
- 单队列(单队列就是常见的队列,每次添加元素时,都是添加到队尾,存在“假溢出”的问题,也就是明明有位置却不能添加的情况)
- 循环队列:避免了“假溢出”的问题。
Java集合框架中的队列Queue
Java集合中的Queue继承自Collection接口,Deque、LinkedList、PriorityQueue,BlockingQueue等类都实现了它。Queue用来存放等待处理元素的集合,这种场景一般用于缓冲、并发访问。除了继承Collection接口的一些方法,Queue还添加了额外的添加、删除、查询操作。
Set
什么是Set
Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要HashSet和TreeSet两大类。
在判断重复元素的时候,HashSet集合会调用hashCode()和equal()方法来实现;TreeSet集合会调用compareTo来实现。
补充:有序集合与无序集合说明
- 有序集合:集合里的元素可以根据key或 index访问(List、map)
- 无序集合:集合里的元素只能遍历。(Set)
HashSet和 TreeSet底层数据结构
HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的HashCode来获取元素在集合中的位置。
TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序。
List
什么是List
在List中,用户可以精确控制列表中每个元素的插入位置,另外用户可以通过证书索引(列表中的位置)访问元素,并搜索列表中的元素。与Set不同,List通常允许重复的元素。另外List是有序的集合而Set是无序集合。
List的常见实现类
ArrayList是一个数组队列,相当于动态数组,它由数组实现,随机访问效率高,随机插入、随机删除效率低。
LinkedList是一个双向链表,它可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但是随机插入、随机删除效率高。
Vector是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而 Vector是线程安全的。
Stack是栈,他继承于 Vector,它的特性是:先进后出(FILO)
树
二叉树
二叉树
- 完全二叉树:若二叉树的高度为h,除第h层 外,其他各层(1~h-1)的节点数都 达到最大个数,第h层 有叶子节点,并且叶子节点都是从左到右依次排布 ,这就是完全二叉树。
- 满二叉树:除了叶节点外每一个节点都有左右子叶且叶子节点都处在最底层的二叉树。
- 平衡二叉树:平衡二叉树又被称为AVL树(区别于AVL算法),它是一颗二叉排序树,且具有以下 性质,它是一棵空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
完全二叉树
完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的节点都及集中在该层最左边的若干位置的二叉树。
满二叉树
一个二叉树,如果每一层的节点数都达到最大值,则这个二叉树就是满二叉树,也就是说,如果一个二叉树的层数为k,且节点总数是(2^k-1),则它就是满二叉树。
堆
数据结构之堆的定义:
堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或者每个节点的值都 小于或等于其左右汉字节点的值,称为小顶堆。
二叉查找树(BST)
二叉查找树的特点:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值 均大于它的根节点的值。
- 任意节点的左右子树也分别为二叉查找树。
- 没有键值相等的节点。
平衡二叉树
平衡二叉树(平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树 、Treap、伸展树等)。
红黑树
红黑树特点:
- 每个节点非红即黑;
- 根节点总是黑色的;
- 每个 叶子节点都是黑色的空节点(NIL节点);
- 如果节点是红色的,则它的子节点必须是黑色的;
- 从根节点到叶节点或者空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。
红黑树的应用:
TreeMap、TreeSet以及JDK1.8的hashMap都用到了红黑树。
为什么要用红黑树?
简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。
B-,B+,B*树
B-树(B树)是一种平衡的多路查找(又称排序)树,在文件系统中有所应用,主要用作文件的索引,其中的B就表示平衡。
- B+树的叶子节点链表结构相比于B-树便于扫库和范围搜索;
- B+树支持range-query(区间查询)非常方便,而B树不支持,这就是数据库选用B+树的最主要原因。
- B*树是B+树的变体,B *树分配新节点的概率要比B+树要低,空间使用率更高。
LSM树
B+树最大的性能问题是会产生大量的随机ID,为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。