算法导论 系列五:高级数据结构

B树

  • n节点的B树高度为O(lgn)
    • 每个节点:n[x]当前节点内关键字数,
    • n[x]个关键字本身,非降序排列;
    • leaf[x],x为叶子则为true;
    • n[x]+1个子女指针,叶节点指针域为空
    • 关键字对子树进行划分分割
    • 叶节点具有相同深度,即树高
    • 每个节点包含关键字字数有上界,即B树的最小度数t
      • 非根节点至少t-1个节点,t个子女
      • 每个节点至多2t-1关键字,内街店至多2t个节点
  • n个关键字,高度为h,最小度数为t》=2的B树有:h <= lgt((n+1)/2)
  • B树操作
    • 搜索操作:多路分支
    • 插入关键字
      • 满节点(2t-1)个关键字,按照中间关键字分裂成两个各含t-1个关键字的节点
      • 中间关键字提升到y的双亲节点
      • 插入的下降过程中每遇到一个满节点就将节点分裂,这样保证最后插入的的节点分裂时其父节点不是满节点

二项堆

  • 二项树
    • 二项树B0只包含一个节点,二项树Bk由2两颗二项树Bk-1连接而成,其中一棵树根是另一棵树根的最左孩子
    • 二项树性质
      • 共有2^k个节点
      • 树高k
      • 深度i处有Cki个节点
      • 根的度数为k,根的子女从左到右编号k-1到0,子女i是子树Bi的根
    • n个节点的二项树,任意节点的最大度数lgn
  • 二项堆
    • 堆中每个二项树都遵循最小堆性质
    • 对任意非负整数k,堆中之多有一颗二项树度数为k
  • 创建二项堆:根表头置空
  • 寻找最小关键字:在根表中寻找最小值
  • 根表度数严格递增
  • 合并两个二项堆
  • 插入:直接插入根表中
  • 抽取最小关键字:将最小关键字子树构建成一个新的二项堆,与原二项堆合并
  • 减小关键字:递归向上调整至根表
  • 删除关键字:将关键字降值为最小,然后抽取最小值,复杂度O(lgn)

斐波那契堆

  • 结构:最小堆有序树构成,不一定是二项树
  • 根表由双链表构成,且无序;min[h]指向根表中最小值
  • 可合并堆操作
    • 插入节点:构建节点,插入根表,调整最小值指针

    • 寻最小节点:直接返回最小值指针
    • 合并两个斐波那契堆:合并根表,重置最小值指针
    • 抽取最小点:删除最小值,将其子节点加入根表,然后合并根表(度相同的根合并,保证最后度数唯一)
    • 减小一个关键字和删除一个节点

    • 当节点成为另一个节点的子节点后,第一次删除孩子时置mark域为true,第二次删除时,必须级练删除将节点本身从树上删除,加入到根表中
    • 删除一个节点:将节点降值为最小,然后抽取最小值点

并查集

  • 合并策略:
    - 按秩合并(节点少的树根合并到节点多大的树根)
    - 路径压缩(查找路径上的每个节点都指向根节点)
posted @ 2016-12-25 22:35  zeroArn  阅读(174)  评论(0编辑  收藏  举报