• 高级数据结构(一)


    .自顶向下伸展树

    伸展树考虑到局部性原理,为使整个查找时间更小,将被频繁查找的节点调整到根部,即通过不断改变树的结构,从而使其的操作保持了O(logN)的摊还时间界。

    伸展树的单旋转、一字形旋转和之字形旋转的旋转示意图如下,

    1-1 伸展树的单旋转、一字形旋转和之字形旋转的展开旋转示意图

    在执行完最后一步的展开后,需要对L、R以及中间树进行合并,形成单一的树,合并的示意图如下

    1-2 伸展树执行完伸展后的合并

    伸展树的自顶向下的展开代码如下,

    1-3 伸展树自顶向下的展开代码

    伸展树将最近搜索的节点放在最容易搜索的根节点的位置,让其在许多环境中得到应用,比如网络应用中,某些固定内容会被大量重复访问。伸展树可以让这种重复搜索以很高的效率完成。

    .红黑树

    红黑树是一种自平衡二叉查找树,和AVL树类似,都是在进行插入和删除操作时通过特定操作使树保持平衡,从而获得较高的查找性能。

    红黑树的特性:

    (1) 每个节点或者是黑色,或者是红色。

    (2) 根节点是黑色。

    (4) 如果一个节点是红色的,则它的子节点必须是黑色的。

    (5) 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

    2-1 常规的红黑树

    在红黑树上查找操作不需要对其修改,但在插入和删除操作中,红黑树的性质可能遭到破坏,需要恢复红黑属性,不过其插入和删除的操作的时间复杂度仍为O(log n),但是这些操作却有些复杂。

    红黑树的插入和删除可以与伸展树以自顶向下的方式进行。

    设当前节点为Current,其兄弟节点为Brother,父节点为Parent,祖父节点为Grand,曾祖父为Great(空节点的默认颜色是黑色)。

    在自顶向下的插入过程中,若Current节点有两个红孩子时,进行颜色翻转(使Current为红,其两孩子为黑,不管Current是否为根,都令根为黑)。

    颜色翻转后,若Current的父节点Parent为红,则进行旋转。

    自顶向下的插入操作实现代码如下,

    2-2 红黑树自顶向下的插入过程

    在自顶向下的删除过程中,与AVL树同样将删除非叶子节点转换为删除叶子节点,具体过程如下

    第一步,检查根,并将根变为红色,

    1. 若根有两个黑儿子,向下并进入第二步

    2. 其他则进入第二步B情况

    第二步,

    A情况,当前节点Current有两个黑儿子

    A1.兄弟节点Brother节点也有两个黑儿子,翻转Current、Parent和Brother节点的颜色,向下(示意图如下)

    2-3 红黑树自顶向下删除A1的情况

    A2.兄弟节点Brother节点的左儿子为红,进行之字形旋转,并翻转Current和Parent颜色,向下(示意图如下)

    2-4 红黑树自顶向下删除A2的情况

    A3.兄弟节点Brother节点的右儿子为红,进行一字形旋转,并翻转Current、Parent、Brother和Brother右儿子节点的颜色,再向下(示意图如下)

    2-5 红黑树自顶向下删除A3的情况

    B情况,当前节点Current至少有一个红儿子,

    Current节点继续向下,若新的Current节点为红,继续向下。若新的Current节点为黑,则单旋转Brother节点和Parent节点,同时翻转Brother和Parent节点,回到第二步;

    第三步,最终找到要删除节点,这是一个叶节点,将节点以红节点身份删除,否则转换为删除叶子节点;

    第四步,将根恢复为黑色。

  • 相关阅读:
    flask2 未整理
    flask1 未整理
    libvirt创建kvm虚拟机步骤
    libvirt之 virsh命令总结
    kvm的xml文件解释
    virsh命令和调用libvirt api的区别
    KVM
    libvirt
    kvm
    oracle中正则表达式的使用
  • 原文地址:https://www.cnblogs.com/lincz/p/11141838.html
Copyright © 2020-2023  润新知