数据结构总结--更新中

数据结构:


  1. 线性表
    • 顺序表
    • 链表
  2. 栈和队列
    • 优先级队列
    • 双端队列
  3. 集合
    • 散列表
    • 跳表(Redis利用跳表实现有序集合Sorted Set)
    • 二叉树
    • 线索二叉树
    • 树与森林
    • 树与森林的遍历
    • Huffman树
    • 图的遍历
      • 深度优先
      • 广度优先
    • 最小生成树
      • Kruskal算法
      • Prim算法
    • 最短路径
  4. 搜索结构
    • 二分查找
    • 二叉搜索树
    • 平衡二叉树(AVL树)
    • 红黑树
  5. 索引结构
    • 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 散列表
  1. 散列方法
    • 除留余数法
    • 数字分析法
    • 平方取中法
    • 折叠法
  2. 处理哈希冲突的方法
    • 开放定址法
      • 线性探测法
      • 二次探测法
      • 伪随机数探测法
    • 再哈希法
    • 链地址法
    • 建立一个公共溢出区
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树的异同点在于:

  1. 有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+树的图尚未最终确定是否有问题,请读者注意)
  2. 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)
  3. 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值