算法导论 系列三:数据结构

散列

  • 链接法解决碰撞问题,散列进同一个桶中元素以链接方式存储
  • 链接解决碰撞问题,依次查找不成功或成功的查找的期望时间θ(1+a)其中a为装载因子
  • 散列函数
    • 除法散列:取余数映射(m取值多去与2的整数次幂不太接近的质数)
    • 乘法散列(其中m多取2的整数次幂)
  • 开放寻址:连续检查散列表直到寻找到空槽插入元素
  • 线性探查:单向线性查找空巢
  • 二次探查:左右平法探查空巢
  • 双重散列:冲突节点,再次散列探查
  • 完全散列:保证二次散列不发生碰撞,且二次散列的期望总体空间为O(n)

二叉查找树

  • 前驱和后继
  • 插入

红黑树

  • 红黑树性质

    • 每个节点红或者黑
    • 根节点是黑的
    • 每个叶子节点是黑的
    • 红节点的子节点均为黑色
    • 任何一个节点从它本身到其子孙节点路径上抱哈相同数目的黑节点(黑高相同)
  • 黑高:从节点本身出发到叶子节点路径上黑节点的数目

  • 一颗n各节点的红黑树的高度最多为2lg(n+1)

  • left_rotate 左旋:右孩子成为父节点

  • 左旋与右旋对称且只改变指针,在常量时间内完成

  • 插入

    • 以二叉排序树方法插入节点,并将节点颜色标为红色
    • 插入调整:当父节点为红色时,进入调整过程
    • 父节点为祖父节点左子
      • 叔节点为红色:父节点,叔节点同时置黑,祖父节点置红,递归调整祖父节点
      • 叔节点为黑色,且当前节点为父节点的右孩子:父节点左旋
      • 叔节点为黑色,且当前节点为父节点的左孩子:父节点置黑,祖父节点置红,右旋
    • 父节点为祖父节点右子:
      • 叔节点为红色:父节点、叔节点同时置黑,祖父节点置红,提柜调整祖父节点
      • 叔节点为黑色,且当前节点为父节点的做孩子:父节点右旋
      • 叔节点为黑色,且当前节点为父节点的右孩子:父节点置黑,祖父节点置红,左旋
    • 插入时间复杂度为O(lgn)
  • 删除

    • 以二叉排序树方法删除一个节点
      • 若待删节点为单子节点,则删除节点本身,否则寻找后继节点
      • 将找到的后继节点或者节点本身,链接为待删节点父节点的子节点
      • 如果是后继节点,则用后继节点覆盖待删节点
      • 如果删除的后继节点或者节点本身是黑色,则调整
    • 删除调整:当删除节点不是根节点且为黑色时调整
      • 删除节点为左子节点
        • 兄弟节点为红色,改变兄弟节点和父节点颜色,并对父节点左旋(待删节点下移一层)转入情况234之一
        • 兄弟节点为黑色,且兄弟节点子节点均为黑色:兄弟节点置红(待删节点向上走一层)
        • 兄弟节点为黑色,兄弟节点左子红,右子黑:交换兄弟节点和其左子颜色,并右旋,转入情况4
        • 兄弟节点为黑色,兄弟节点左子黑,右子红:兄弟节点复制父节点颜色,父节点和兄弟节点右子均置黑,左旋父节点
        • 待删节点指向根
      • 删除节点为右子节点
        • 兄弟节点为红色:改变兄弟节点和父节点颜色,并对父节点右旋(待删节点下移一层)转入情况234之一
        • 兄弟节点为黑色:且兄弟节点子节点均为黑色:兄弟节点置红(待删节点向上走一层)
        • 兄弟节点为黑色:兄弟节点左子黑,右子红:交换兄弟节点和其右子节点颜色,并左旋,转入情况4
        • 兄弟节点为黑色:兄弟节点右子黑,左子红:兄弟节点复制父节点颜色,父节点和兄弟节点左子均置黑,右旋父节点
        • 待删节点指向根
      • 根节点置黑
    • 删除时间复杂度为O(lgn)

扩展红黑树

  • 顺序统计树:红黑树加入size域,标记以该节点为根的子树节点数
  • 检索给定序列元素

数据结构扩张

  • 选择基础数据结构
  • 确定要在基础数据结构中添加哪些信息
  • 验证可用基础数据结构上基本修改操作维护新添加的信息
  • 设计心得操作

区间树

  • 增加一个区间左界和一个区间右界,一个以该结点为根的子树的右界最大值
posted @ 2016-12-24 16:48  zeroArn  阅读(178)  评论(0编辑  收藏  举报