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

散列

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

二叉查找树

  • 前驱和后继
    900750-20161224155220651-89622958.png
  • 插入
    900750-20161224155720214-632329009.png
    900750-20161224155803339-1806710971.png

红黑树

  • 红黑树性质
    • 每个节点红或者黑
    • 根节点是黑的
    • 每个叶子节点是黑的
    • 红节点的子节点均为黑色
    • 任何一个节点从它本身到其子孙节点路径上抱哈相同数目的黑节点(黑高相同)
  • 黑高:从节点本身出发到叶子节点路径上黑节点的数目
  • 一颗n各节点的红黑树的高度最多为2lg(n+1)
    900750-20161224163447948-945615955.png
  • left_rotate 左旋:右孩子成为父节点
    900750-20161224164739167-1311722368.png
  • 左旋与右旋对称且只改变指针,在常量时间内完成
  • 插入
    • 以二叉排序树方法插入节点,并将节点颜色标为红色
    • 插入调整:当父节点为红色时,进入调整过程
    • 父节点为祖父节点左子
      • 叔节点为红色:父节点,叔节点同时置黑,祖父节点置红,递归调整祖父节点
      • 叔节点为黑色,且当前节点为父节点的右孩子:父节点左旋
      • 叔节点为黑色,且当前节点为父节点的左孩子:父节点置黑,祖父节点置红,右旋
    • 父节点为祖父节点右子:
      • 叔节点为红色:父节点、叔节点同时置黑,祖父节点置红,提柜调整祖父节点
      • 叔节点为黑色,且当前节点为父节点的做孩子:父节点右旋
      • 叔节点为黑色,且当前节点为父节点的右孩子:父节点置黑,祖父节点置红,左旋
    • 插入时间复杂度为O(lgn)
  • 删除
    • 以二叉排序树方法删除一个节点
      • 若待删节点为单子节点,则删除节点本身,否则寻找后继节点
      • 将找到的后继节点或者节点本身,链接为待删节点父节点的子节点
      • 如果是后继节点,则用后继节点覆盖待删节点
      • 如果删除的后继节点或者节点本身是黑色,则调整
        900750-20161224195116198-465666632.png
    • 删除调整:当删除节点不是根节点且为黑色时调整
      • 删除节点为左子节点
        • 兄弟节点为红色,改变兄弟节点和父节点颜色,并对父节点左旋(待删节点下移一层)转入情况234之一
        • 兄弟节点为黑色,且兄弟节点子节点均为黑色:兄弟节点置红(待删节点向上走一层)
        • 兄弟节点为黑色,兄弟节点左子红,右子黑:交换兄弟节点和其左子颜色,并右旋,转入情况4
        • 兄弟节点为黑色,兄弟节点左子黑,右子红:兄弟节点复制父节点颜色,父节点和兄弟节点右子均置黑,左旋父节点
        • 待删节点指向根
      • 删除节点为右子节点
        • 兄弟节点为红色:改变兄弟节点和父节点颜色,并对父节点右旋(待删节点下移一层)转入情况234之一
        • 兄弟节点为黑色:且兄弟节点子节点均为黑色:兄弟节点置红(待删节点向上走一层)
        • 兄弟节点为黑色:兄弟节点左子黑,右子红:交换兄弟节点和其右子节点颜色,并左旋,转入情况4
        • 兄弟节点为黑色:兄弟节点右子黑,左子红:兄弟节点复制父节点颜色,父节点和兄弟节点左子均置黑,右旋父节点
        • 待删节点指向根
      • 根节点置黑
    • 删除时间复杂度为O(lgn)
      900750-20161224204925386-1397767445.png

900750-20161224204957448-2087243033.png

900750-20161224201839292-305894321.png

扩展红黑树

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

数据结构扩张

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

区间树

  • 增加一个区间左界和一个区间右界,一个以该结点为根的子树的右界最大值
    900750-20161224215758198-904005452.png

转载于:https://www.cnblogs.com/zeroArn/p/6217851.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值