数据结构:
- 线性表
- 顺序表
- 链表
- 栈和队列
- 优先级队列
- 双端队列
- 集合
- 散列表
- 跳表(Redis利用跳表实现有序集合Sorted Set)
- 树
- 二叉树
- 线索二叉树
- 树与森林
- 树与森林的遍历
- 堆
- Huffman树
- 图
- 图的遍历
- 深度优先
- 广度优先
- 最小生成树
- Kruskal算法
- Prim算法
- 最短路径
- 图的遍历
- 搜索结构
- 二分查找
- 二叉搜索树
- 平衡二叉树(AVL树)
- 红黑树
- 索引结构
- B树
- B+树
数据结构
1、AarryList、LinkedList、Stack、Queue常用方法
####1.1 AarryList用法
ava.util.ArrayList < E > 的一些方法 | 描述 |
---|---|
+add(o: E): void | 在list的末尾添加一个元素o |
+add(index: int, o: E): void | 在指定的index处插入元素o |
+set(index: int, o: E): E | 设置指定index处的元素为o |
+get(index: int): E | 返回指定index处的元素 |
+clear(): void | 从list中删除所有元素 |
+remove(o: Object): boolean | 删除list中的第一个元素o,如果元素被删除,返回true |
+remove(index: int): boolean | 删除指定index处的元素,如果元素被删除,返回true |
+size(): int | 返回list中元素个数 |
+isEmpty(): boolean | 如果list不含元素,返回true |
+contains(o: Object): boolean | 如果list含有元素o,返回true |
+indexOf(o: Object): int | 返回list中第一个匹配元素的index |
+lastIndexOf(o: Object): int | 返回list中最后一个匹配元素的index |
1.2 LinkedList用法
增加:
add(E e):在链表后添加一个元素; 通用方法
addFirst(E e):在链表头部插入一个元素; 特有方法
addLast(E e):在链表尾部添加一个元素; 特有方法
push(E e):与addFirst方法一致
offer(E e):在链表尾部插入一个元素 add(int index, E element):在指定位置插入一个元素。
offerFirst(E e):JDK1.6版本之后,在头部添加; 特有方法 offerLast(E e):JDK1.6版本之后,在尾部添加; 特有方法
删除:
remove() :移除链表中第一个元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):删除头,获取元素并删除; 特有方法
removeLast(E e):删除尾; 特有方法
pollFirst():删除头; 特有方法
pollLast():删除尾; 特有方法
pop():和removeFirst方法一致,删除头。
poll():查询并移除第一个元素 特有方法
查:
get(int index):按照下标获取元素; 通用方法
getFirst():获取第一个元素; 特有方法
getLast():获取最后一个元素; 特有方法
peek():获取第一个元素,但是不移除; 特有方法
peekFirst():获取第一个元素,但是不移除;
peekLast():获取最后一个元素,但是不移除;
pollFirst():查询并删除头; 特有方法
pollLast():删除尾; 特有方法
poll():查询并移除第一个元素 特有方法
其他:
boolean contains(Object o)
size()
void clear()
int indexOf(Object o)
int lastIndexOf(Object o)
1.3 Stack用法
Stack的一些方法 | 描述 |
---|---|
push( num) | 入栈 |
pop() | 栈顶元素出栈 |
empty() | 判定栈是否为空 |
peek() | 获取栈顶元素 |
search(num) | 判端元素num是否在栈中,如果在返回1,不在返回-1。 |
1.4 Queue用法
方法名 | 描述 | 解释说明 |
---|---|---|
add | 增加一个元索 | 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回false |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
2、集合
2.1 散列表
- 散列方法
- 除留余数法
- 数字分析法
- 平方取中法
- 折叠法
- 处理哈希冲突的方法
- 开放定址法
- 线性探测法
- 二次探测法
- 伪随机数探测法
- 再哈希法
- 链地址法
- 建立一个公共溢出区
- 开放定址法
2.2跳表
跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。和链表、字典等数据结构被广泛地应用在Redis内部不同,Redis只在两个地方用到了跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。
3、树
3.1 线索二叉树
用自己的话说就是:原来我们求一棵二叉树的前序、中序、后序序列的时候,都必须用到递归遍历相应的二叉树,否则也得借助栈等结构来记录。这样的话,如果我们想很快的找到某一个节点在某种序列下的前驱或后继,每次都要遍历,这显然十分浪费时间。很自然,要是想避免这个重复工作,那么我们就需要把所有节点的前驱和后继记录下来,这样每次查找相应的记录就行了。于是就引出了——‘线索’一词。没错,真的是‘线索’,由线索找到相应节点的前驱和后继,很形象!
3.2 线索二叉树相关知识点
- 线索二叉树前中后序线索化
- 线索二叉树的遍历
- 线索二叉树的插入和删除
3.3 二叉树
递归遍历
* 中序遍历二叉树(递归)
*/
public void PrintBinaryTreeMidRecur(TreeNode<T> root)
{
if (root!=null)
{
PrintBinaryTreeMidRecur(root.left);
System.out.print(root.data);
PrintBinaryTreeMidRecur(root.right);
}
}
非递归遍历
* 中序遍历二叉树(非递归)
*
* 思路:先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,
* 出栈,访问T->data,再中序遍历T的右子树。
*/
public void PrintBinaryTreeMidUnrecur(TreeNode<T> root)
{
TreeNode<T> p=root;//p为当前节点
LinkedList<TreeNode> stack=new LinkedList<>();
//栈不为空时,或者p不为空时循环
while(p!=null || !stack.isEmpty())
{
//当前节点不为空。压入栈中。并将当前节点赋值为左儿子
if (p!=null)
{
stack.push(p);
p=p.left;
}
//当前节点为空:
// 1、当p指向的左儿子时,此时栈顶元素必然是它的父节点
// 2、当p指向的右儿子时,此时栈顶元素必然是它的爷爷节点
//取出并访问栈顶元素,赋值为right
else
{
p=stack.pop();
System.out.print(p.data);
p=p.right;
}
}
}
层次遍历
* 层次遍历二叉树(非递归)
*/
public void PrintBinaryTreeLayerUnrecur(TreeNode<T> root)
{
LinkedList<TreeNode> queue=new LinkedList<>();
TreeNode<T> p;
queue.push(root);
while(!queue.isEmpty())
{
p=queue.removeFirst();
System.out.print(p.data);
if (p.left!=null)
queue.addLast(p.left);
if (p.right!=null)
queue.addLast(p.right);
}
}
}
3.4 哈夫曼树的应用
- 最优判定树
- Huffman编码
4、 图
4.1图的存储
- 邻接表
- 邻接矩阵
4.2 图的遍历
- 深度优先遍历
- 广度优先遍历
4.3 最小生成树
- Kruskal算法
- Prime算法
4.4 最短路径
- Dijkstra算法
5、二叉搜索树
- AVL树
- 红黑树
都是为提高搜索效率而建立的搜索结构
6、索引结构
B树和B+树都是平衡多路搜索树
- B树
- B+树
B+tree:是应文件系统所需而产生的一种B-tree的变形树。
一棵m阶的B+树和m阶的B树的异同点在于:
- 有n棵子树的结点中含有n-1 个关键字; (此处颇有争议,B+树到底是与B 树n棵子树有n-1个关键字 保持一致,还是不一致:B树n棵子树的结点中含有n个关键字,待后续查证。暂先提供两个参考链接:①wikipedia http://en.wikipedia.org/wiki/B%2B_tree#Overview;②http://hedengcheng.com/?p=525。而下面B+树的图尚未最终确定是否有问题,请读者注意)
- 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)
- 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)