java集合-TreeMap(红黑树四)

java集合-TreeMap(红黑树)五

红黑树的定义

  1. 根节点与叶节点都是黑色节点(注意:叶节点为Null节点哦,普通二叉树里面叶子节点是左右节点为null的节点为叶子节点,而红黑树是null节点为叶子节点)
  2. 不能有连续两个红色节点
  3. 任意节点到叶子节点所经过的黑色节点数量是相同的(比如:根节点不管走左右节点到达null节点所经过的黑色节点数都是一样的)。

红黑树最难的就是:添加和删除了。

TreeMap的添加后的修复代码

//父节点是红色
while (x != null && x != root && x.parent.color == RED) {
              //判断父节点是否左边插入
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == rightOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateLeft(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateRight(parentOf(parentOf(x)));
                }
            } else {
                //判断祖父节点的左节点是否是红色的;就是叔父节点的感觉
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    //判断是否是左边插入
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);
                        //父节点右旋转
                        rotateRight(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    rotateLeft(parentOf(parentOf(x)));
                }
            }
        }

尝试找到一些规律
父子同时为红色;
父在右,叔父也为红色,则
1.将父节点变为黑色
2.叔父节点变为黑色
3.祖父节点变为红色

父在右,叔父为黑色,则
子在左则先:父右旋转,旋转后子变父,父变子。
子在右不变。
1.将父节点着色为黑色;(这里的父节点已经是转换后的父节点了,不是第一步的父节点了)。
2.父节点的父节点着色为红色;
3.将祖父节点左旋转。

父在左,叔父也为红色,则:
1.父节点着色为黑色。
2.叔父节点着色黑色。
3.祖父节点着色为红色。

父在左,叔父为黑色,则
子在右:父左旋转,旋转后子变父,父变子。
子在左不变。
1.将父节点着色为黑色;(这里的父节点已经是转换后的父节点了,不是第一步的父节点了)。
2.父节点的父节点着色为红色;
3.将祖父节点右旋转。

删除时的修复树代码

private void fixAfterDeletion(Entry<K,V> x) {
        //x是否是黑色
        while (x != root && colorOf(x) == BLACK) {
                //是否是左节点
            if (x == leftOf(parentOf(x))) {
                Entry<K,V> sib = rightOf(parentOf(x));
                    //x的兄弟节点是否是红色的,兄弟着色为黑色,父节点着色为红色,父节点左旋转。
                if (colorOf(sib) == RED) {
                    setColor(sib, BLACK);
                    setColor(parentOf(x), RED);
                    rotateLeft(parentOf(x));//左旋转
                    sib = rightOf(parentOf(x));
                }
                    //兄弟节点的左右节点是否是黑色的,如果是则把兄弟节点着色为红色。
                if (colorOf(leftOf(sib))  == BLACK &&
                    colorOf(rightOf(sib)) == BLACK) {
                    setColor(sib, RED);
                    x = parentOf(x);
                } else {
                    //兄弟节点的右节点是否是黑色的,是则右旋转一次
                    if (colorOf(rightOf(sib)) == BLACK) {
                        setColor(leftOf(sib), BLACK);
                        setColor(sib, RED);
                        rotateRight(sib);//右旋转
                        sib = rightOf(parentOf(x));
                    }
                    setColor(sib, colorOf(parentOf(x)));//兄弟节点着色为父节点的颜色
                    setColor(parentOf(x), BLACK);//x父节点着色为黑色
                    setColor(rightOf(sib), BLACK);//兄弟节点的右节点着色为黑色
                    rotateLeft(parentOf(x));//x父节点左旋转
                    x = root;
                }
            } else { // symmetric
                Entry<K,V> sib = leftOf(parentOf(x));

                if (colorOf(sib) == RED) {
                    setColor(sib, BLACK);
                    setColor(parentOf(x), RED);
                    rotateRight(parentOf(x));
                    sib = leftOf(parentOf(x));
                }

                if (colorOf(rightOf(sib)) == BLACK &&
                    colorOf(leftOf(sib)) == BLACK) {
                    setColor(sib, RED);
                    x = parentOf(x);
                } else {
                    if (colorOf(leftOf(sib)) == BLACK) {
                        setColor(rightOf(sib), BLACK);
                        setColor(sib, RED);
                        rotateLeft(sib);
                        sib = leftOf(parentOf(x));
                    }
                    setColor(sib, colorOf(parentOf(x)));
                    setColor(parentOf(x), BLACK);
                    setColor(leftOf(sib), BLACK);
                    rotateRight(parentOf(x));
                    x = root;
                }
            }
        }

        setColor(x, BLACK);
    }

总结:
添加时,父节点为红色才需要调整;删除时,删除的是黑色节点才需要调整。
添加时,调整与叔父节点相关;删除时,调整与兄弟节点相关。

参考

http://www.importnew.com/24930.html 红黑树添加
http://www.importnew.com/25125.html 红黑树的删除。
https://tech.meituan.com/redblack-tree.html
http://www.cs.usfca.edu/~galles/visualization/RedBlack.html红黑树动态演示地址

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值