算法导论 系列三:数据结构
散列
- 链接法解决碰撞问题,散列进同一个桶中元素以链接方式存储
- 链接解决碰撞问题,依次查找不成功或成功的查找的期望时间θ(1+a)其中a为装载因子
- 散列函数
- 除法散列:取余数映射(m取值多去与2的整数次幂不太接近的质数)
- 乘法散列(其中m多取2的整数次幂)
- 开放寻址:连续检查散列表直到寻找到空槽插入元素
- 线性探查:单向线性查找空巢
- 二次探查:左右平法探查空巢
- 双重散列:冲突节点,再次散列探查
- 完全散列:保证二次散列不发生碰撞,且二次散列的期望总体空间为O(n)
二叉查找树
- 前驱和后继
- 插入
红黑树
-
红黑树性质
- 每个节点红或者黑
- 根节点是黑的
- 每个叶子节点是黑的
- 红节点的子节点均为黑色
- 任何一个节点从它本身到其子孙节点路径上抱哈相同数目的黑节点(黑高相同)
-
黑高:从节点本身出发到叶子节点路径上黑节点的数目
-
一颗n各节点的红黑树的高度最多为2lg(n+1)
-
left_rotate 左旋:右孩子成为父节点
-
左旋与右旋对称且只改变指针,在常量时间内完成
-
插入
- 以二叉排序树方法插入节点,并将节点颜色标为红色
- 插入调整:当父节点为红色时,进入调整过程
- 父节点为祖父节点左子
- 叔节点为红色:父节点,叔节点同时置黑,祖父节点置红,递归调整祖父节点
- 叔节点为黑色,且当前节点为父节点的右孩子:父节点左旋
- 叔节点为黑色,且当前节点为父节点的左孩子:父节点置黑,祖父节点置红,右旋
- 父节点为祖父节点右子:
- 叔节点为红色:父节点、叔节点同时置黑,祖父节点置红,提柜调整祖父节点
- 叔节点为黑色,且当前节点为父节点的做孩子:父节点右旋
- 叔节点为黑色,且当前节点为父节点的右孩子:父节点置黑,祖父节点置红,左旋
- 插入时间复杂度为O(lgn)
-
删除
- 以二叉排序树方法删除一个节点
- 若待删节点为单子节点,则删除节点本身,否则寻找后继节点
- 将找到的后继节点或者节点本身,链接为待删节点父节点的子节点
- 如果是后继节点,则用后继节点覆盖待删节点
- 如果删除的后继节点或者节点本身是黑色,则调整
- 删除调整:当删除节点不是根节点且为黑色时调整
- 删除节点为左子节点
- 兄弟节点为红色,改变兄弟节点和父节点颜色,并对父节点左旋(待删节点下移一层)转入情况234之一
- 兄弟节点为黑色,且兄弟节点子节点均为黑色:兄弟节点置红(待删节点向上走一层)
- 兄弟节点为黑色,兄弟节点左子红,右子黑:交换兄弟节点和其左子颜色,并右旋,转入情况4
- 兄弟节点为黑色,兄弟节点左子黑,右子红:兄弟节点复制父节点颜色,父节点和兄弟节点右子均置黑,左旋父节点
- 待删节点指向根
- 删除节点为右子节点
- 兄弟节点为红色:改变兄弟节点和父节点颜色,并对父节点右旋(待删节点下移一层)转入情况234之一
- 兄弟节点为黑色:且兄弟节点子节点均为黑色:兄弟节点置红(待删节点向上走一层)
- 兄弟节点为黑色:兄弟节点左子黑,右子红:交换兄弟节点和其右子节点颜色,并左旋,转入情况4
- 兄弟节点为黑色:兄弟节点右子黑,左子红:兄弟节点复制父节点颜色,父节点和兄弟节点左子均置黑,右旋父节点
- 待删节点指向根
- 根节点置黑
- 删除节点为左子节点
- 删除时间复杂度为O(lgn)
- 以二叉排序树方法删除一个节点
扩展红黑树
- 顺序统计树:红黑树加入size域,标记以该节点为根的子树节点数
- 检索给定序列元素
数据结构扩张
- 选择基础数据结构
- 确定要在基础数据结构中添加哪些信息
- 验证可用基础数据结构上基本修改操作维护新添加的信息
- 设计心得操作
区间树
- 增加一个区间左界和一个区间右界,一个以该结点为根的子树的右界最大值