1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Create 数据结构.md

数据结构相关学习与面试知识点
This commit is contained in:
Snailclimb 2018-05-07 21:33:39 +08:00 committed by GitHub
parent a197f643e4
commit 368a32726a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

103
数据结构.md Normal file
View File

@ -0,0 +1,103 @@
在我们学习Java的时候很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况我本人之前就很迷茫。所以我决定通过这个开源平台来帮助一些有需要的人通过下面的内容你会掌握系统的Java学习以及面试的相关知识。本来是想通过Gitbook的形式来制作的后来想了想觉得可能有点大题小做。另外我自己一个人的力量毕竟有限希望各位有想法的朋友可以提issue。
### 数据结构
- **Queue**
[Java集合类分析之Queue](http://wanglizhi.github.io/2016/06/18/Java-Queue/)
- **Set**
[由浅入深理解java集合(二)——集合 Set](https://www.jianshu.com/p/9081017a2d67)
- **List**
[Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)](http://www.cnblogs.com/skywang12345/p/3308900.html)
**ArrayList** 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
**LinkedList** 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低但随机插入、随机删除效率低。
**Vector** 是矢量队列和ArrayList一样它也是一个动态数组由数组实现。但是ArrayList是非线程安全的而Vector是线程安全的。
**Stack** 是栈它继承于Vector。它的特性是先进后出(FILO, First In Last Out)。
[集合框架源码学习之ArrayList](https://juejin.im/post/5aafa05a6fb9a028c06aa217)
注意ArrayList的扩容机制(注意移位运算符的使用)以及System.arraycopy()和Arrays.copyOf()方法在ArrayList集合源码中的使用。
[集合框架源码学习之LinkedList](https://juejin.im/post/5aafab9651882555635e219a)
[java数据结构与算法之顺序表与链表深入分析](https://blog.csdn.net/javazejian/article/details/52953190)
- **Map**
[集合框架源码学习之HashMap(JDK1.8)](https://juejin.im/post/5ab0568b5188255580020e56)
- **Stack(栈)**
[java数据结构与算法之栈Stack设计与实现](https://blog.csdn.net/javazejian/article/details/53362993)
- **树**
* **1 二叉树**
[二叉树](https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科)
(1)[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)——若设二叉树的高度为h除第 h 层外,其它各层 (1h-1) 的结点数都达到最大个数第h层有叶子结点并且叶子结点都是从左到右依次排布这就是完全二叉树。
(2)[满二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
(3)[平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91/10421057)——平衡二叉树又被称为AVL树区别于AVL算法它是一棵二叉排序树且具有以下性质它是一棵空树或它的左右两个子树的高度差的绝对值不超过1并且左右两个子树都是一棵平衡二叉树。
* **2 完全二叉树**
[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科)
* **3 满二叉树**
[满二叉树](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科,国内外的定义不同)
国内教程定义一个二叉树如果每一个层的结点数都达到最大值则这个二叉树就是满二叉树。也就是说如果一个二叉树的层数为K且结点总数是(2^k) -1 ,则它就是满二叉树。
* **4 二叉查找树BST**
[浅谈算法和数据结构: 七 二叉查找树](浅谈算法和数据结构: 七 二叉查找树)
二叉查找树的特点:
1. 若任意节点的左子树不空,则左子树上所有结点的 值均小于它的根结点的值;
2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 任意节点的左、右子树也分别为二叉查找树。
4. 没有键值相等的节点no duplicate nodes
* **5 平衡二叉树Self-balancing binary search tree**
[ 平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91)百度百科平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等
* **6 红黑树**
红黑树特点:
1. 每个节点不是红色就是黑色的;
2. 根节点总是黑色的;
3. 所有的叶节点都是是黑色的红黑树的叶子节点都是空节点NIL或者NULL
4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
5. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)
[漫画:什么是红黑树?](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树)
[寻找红黑树的操作手册](http://dandanlove.com/2018/03/18/red-black-tree/)(文章排版以及思路真的不错)
[红黑树深入剖析及Java实现](https://zhuanlan.zhihu.com/p/24367771)(美团点评技术团队)
* **7 B-B+B*树**
[二叉树学习笔记之B树、B+树、B*树 ](https://yq.aliyun.com/articles/38345)
[《B-树B+树B*树详解》](https://blog.csdn.net/aqzwss/article/details/53074186)
[《B-树B+树与B*树的优缺点比较》](https://blog.csdn.net/bigtree_3721/article/details/73632405)
B-树或B树是一种平衡的多路查找(又称排序)树在文件系统中有所应用。主要用作文件的索引。其中的B就表示平衡(Balance)
1. B+ 树的叶子节点链表结构相比于 B- 树便于扫库,和范围检索。
2. B+树支持range-query(区间查询)非常方便而B树不支持。这是数据库选用B+树的最主要原因。
3. B*树 是B+树的变体B*树分配新结点的概率比B+树要低,空间使用率更高;
* **8 LSM 树**
[[HBase] LSM树 VS B+树](https://blog.csdn.net/dbanote/article/details/8897599)
B+树最大的性能问题是会产生大量的随机IO
为了克服B+树的弱点HBase引入了LSM树的概念即Log-Structured Merge-Trees。
[LSM树由来、设计思想以及应用到HBase的索引](http://www.cnblogs.com/yanghuahui/p/3483754.html)