数据结构:链表,数组,堆栈,队列,二叉树,哈希表,图,几个排序算法
问题1:java中arraylist如何实现:一个可以随机访问,自动增加容量的数组,怎么搞出来的?
问题2:如何用栈实现计算算术表达式。
问题3: 辗转相除法
数据结构除了数组之外都可以认为是抽象数据结构(ADT)
1.数组:
--无序数组:插入快,查找慢,删除慢
--有序数组:查找比无序快(二分),插入慢,删除慢
(有序无序如果知道下标,那查找快,可以直接通过下标访问)
二分查找:前提是有序数组(可以用递归实现,也可以不用)
大O表示法
2.简单排序(冒泡排序,快速排序,归并排序,堆排序) 时间复杂度 ,空间复杂度,稳定性
--冒泡排序(n-1轮,最大的数据行总是'冒泡到数组的顶端')
--堆排序
(1)建立堆(大顶):从最后一个非叶节点开始
(2)调整堆
3栈和队列
栈实现队列。
栈实现算数表达式求值。java中栈利用后缀表达式的方式实现。
4链表
5.二叉树
删除节点(两个子节点的情况):用它的中序后继节点代替(例子:霍夫曼树)
6.红黑树
--定义:红黑树是特殊的二叉查找树,任意一个节点包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。此外,每个节点都有存储位表示节点的颜色,颜色是红或者黑。
7.哈希表
--定义:哈希表是一个在时间和空间上做出权衡的经典例子。
1.图
(1) 存储结构。
--邻接矩阵。
邻接矩阵存储方法采用N*N矩阵(N代表图节点的个数)。
适用情况:矩阵是稠密的矩阵(比如图是完全图时)
--邻接表。
每一个结点后面所接的结点都是它的邻接结点。
适用情况:稀疏矩阵,更节省空间的存储结构。
(2)图的遍历。
---广度优先。类似于一个分层搜索的过程,广度优先遍历使用队列来保持访问过的结点的顺序,按这个顺序来访问这些结点的邻接结点。(横向挖掘)
---深度优先。每次都在访问完当前结点后首先访问当前结点的第一个结点。(纵向挖掘)采用递归实现。
6.nginx负载均衡
7.KMP算法
8.JVM
11设计模式