树图如何使用红黑树算法

2024-03-23

我读过很多关于红黑树的文章,其中操作需要 O(log n) 时间。我不太清楚它是如何工作的,以及与二叉搜索树相比,树图实际上如何使用红黑树算法来平衡树。

参考链接https://www.topcoder.com/community/data-science/data-science-tutorials/an-introduction-to-binary-search-and-red-black-trees/ https://www.topcoder.com/community/data-science/data-science-tutorials/an-introduction-to-binary-search-and-red-black-trees/

谁能用一个例子解释一下该算法是如何工作的。


一棵红黑树is二叉搜索树。这只是 BST 的一种风格,有一些奇特的版本insert and delete在运行时重新组织树的操作,以便树永远不会变得“又长又细”。树越长、越细,它的行为就越像链表。平均而言,链表操作需要访问一半的列表(或者在最坏的情况下是整个列表),因此运行时间呈线性变化(元素数量 n 为 O(n))。当树“茂密”或接近平衡时,每次操作都会便宜得多( O (log n) )。红黑算法保证树保持茂密。

为了具体说明这一点,这里有两棵树,用于存储键 A 到 G。左边的树又长又细。请注意它看起来像一个列表。在最坏的情况下,需要 4 次关键比较才能找到一个元素。右边的树很茂密。只需要 3 个。这里差别很小。对于一棵包含 1023 个元素的树,弦状树需要 512 次比较,而浓密树只需 10 次比较。这是 log n 的幂。

  B                    _D_
 / \                  /   \
A   D                B     F
   / \              / \   / \
  C   F            A   C E   G
     / \
    E   G

红黑树不能保证完全茂密(正确的术语是“完美平衡”),但红黑规则保证它以数学上严格的方式足够茂密,因此操作时间随着 n 的对数而变化,而不是比在 n 中呈线性关系。

红黑规则的天才在于它们是“局部的”。在违反规则的插入或删除过程中,可以通过仅调整操作涉及的每个节点的恒定数量的节点来恢复规则。因此它们很便宜并且相当容易实施。

然而,当红黑规则适用于整棵树时,可以通过巧妙的数学证明来证明它如上所述足够茂密。

那么树形图呢?映射是一个函数,其域称为键集 K,范围称为值集 V。为了实现树形映射,每个节点都存储一个键值对<k,v> where k \in K and v \in V。在上图中(以及大多数演示文稿)中,仅显示了按键(字母 A-G)。在映射中,插入、查找和删除以非常明显的方式对这些对进行操作。例如,查找使用通常的 BST 算法来搜索键。当找到键时,也会找到值,因为它位于同一对中。这就是返回的内容。在java中,该对称为Map.Entry。您可以在Java源代码 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Map.java#Map.Entry.

我不会详细介绍红黑规则如何运作,因为我无法改进维基百科页面 https://en.wikipedia.org/wiki/Red%E2%80%93black_tree。我的猜测和希望是,您错过了“大局”,所以现在讨论将有意义。好消息是,几乎所有语言都提供了经过彻底测试和性能优化的树实现,因此无需了解旋转的神秘细节。当然,如果你好奇并且只是想知道,那就去吧!恭喜!

无论如何,Top Coder 对算法的解释并不总是最清晰的。到处寻找其他人,直到有人“点击”你。受人尊敬的计算机科学教科书之所以受人尊敬是有原因的:它们的解释非常出色。科曼和里维斯特 https://en.wikipedia.org/wiki/Introduction_to_Algorithms是公认的最爱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树图如何使用红黑树算法 的相关文章

随机推荐

  • delphi 7 中的 utf8 解码

    我需要使用 delphi 7 将字符串从 utf8 转换为宽字符串 谁能告诉我为什么下面的代码在delphi 7中不起作用 Utf8Decode 函数的参数只是一个示例 var ws WideString begin ws Utf8Deco
  • C# 如何杀死阻塞的线程?

    我有一个线程 void threadCode object o doStuffHere o Blocking call Sometimes hangs 我这样称呼它 Thread t new Thread new ThreadStart d
  • 如何在 Keras 中定义自定义精度以忽略具有特定金色标签的样本?

    我想在 Keras 中编写一个自定义指标 我正在使用张量流后端 相当于categorical accuracy 但是具有特定金色标签的样本的输出 在我的例子中是 0 来自 y true 必须被忽略 例如 如果我的输出是 预测 1 金 0 预
  • 如何验证 angular2 中的 FormArray 长度

    我有一个 angular2 数据驱动形式 如下所示 this formBuilder group name Validators required description Validators required places this fo
  • android: 需要为元素 显式指定导出

    我在 AndroidManifest xml 中遇到 Flutter 构建错误 android exported 需要为元素 显式指定 面向 Android 12 及更高版本的应用需要指定 显式值android exported当相应的组件
  • 直接调用分配给对象属性的闭包

    我希望能够直接调用分配给对象属性的闭包 而无需将闭包重新分配给变量然后调用它 这可能吗 下面的代码不起作用并导致Fatal error Call to undefined method stdClass callback obj new s
  • Ruby 中的“sys.stdout.write()”等价物是什么?

    正如 Python 中所见 什么是sys stdout write Ruby 中的等价物 在 Ruby 中 您可以使用以下方式访问标准输出 stdout or STDOUT 所以你可以使用write http ruby doc org co
  • NLP 中的否定处理

    我目前正在开发一个项目 我想从文本中提取情感 由于我使用的是conceptnet5 一种语义网络 因此我不能简单地在包含否定词的句子中添加单词前缀 因为这些单词根本不会出现在conceptnet5 的API 中 这是一个例子 这部电影不太好
  • 带有内存缓存的 async/await 的线程安全

    我正在查看有关内存屏障的部分 如中所述http www albahari com threading part4 aspx http www albahari com threading part4 aspx并尝试制作 我们真的需要锁和屏障
  • 为什么 C4062 Visual C++ 警告默认关闭?

    根据 MSDN Visual C 可以发出C4062 警告 http msdn microsoft com en us library fdt9w8tf aspx when 枚举用于switch and 该枚举的至少一个元素没有标签 并且
  • 扩展自定义验证类

    我最近一直在尝试 Laravel 4 并尝试让自定义验证类发挥作用 验证类
  • 在 PHP 或 MySQL 中对小数进行排序

    我正在开发一个分类账应用程序 我的主要问题是我的客户有这样的代码的会计科目表 1 1 1 1 1 2 1 1 10 1 1 11 使用 PHP 或 MySQl 我只能设法将它们排序 1 1 1 1 1 10 1 1 11 1 1 2 有关如
  • 如何在Odoo中获取ID字段值[重复]

    这个问题在这里已经有答案了 我是 Odoo 8 的新手 在获取对象的 ID 值时遇到一些困难 例如 hr employee 的 ID 字段值 您能给我一些这方面的示例吗 请阅读v8 0 官方文档 https www odoo com doc
  • 如何使用 XAML 创建简单的 2D NURBS?

    我需要创建一个具有两个端点和 n 个控制点的样条线 据我所知 贝塞尔曲线仅允许一个控制点 而贝塞尔样条允许两个控制点 但是 我需要能够添加我认为合适的任意数量的控制点 而不仅限于一两个 Here is an example of what
  • 如果产品属于某个类别 WooCommerce,如何设置选项卡(仅)

    我设置了一个选项卡来添加一个包含 WooCommerce 规范的选项卡 我想将其包装到 if 语句中 以便仅在产品属于某个类别时才设置选项卡 add filter woocommerce product tabs woo custom pr
  • 尝试调用 getWritableDatabase() 时不断收到 NullPointerExceptions

    我是 Android 框架的新手 我无法通过 SQLite 的基础知识 我正在尝试构建一个非常简单的应用程序 它有一个 EditText 搜索框 当按下某个键时 它会在 SQLite 数据库上执行 Like word 搜索 以查找在 Edi
  • 带有 ref 变量的函数委托

    public object MethodName ref float y elided 我如何定义一个Func该方法的委托 它不能通过Func但你可以定义一个自定义delegate for it public delegate object
  • 我应该如何为 PHP 中的所有页面设置全局变量

    Question 我要实现 associate name and app key全局变量 这样我就可以在任何我想要的页面上访问它们 下面是我的头文件中的代码 获取变量将出现在索引页中 它在索引页面上工作正常 因为 GET 数据可用 但是当用
  • Powerpoint 演示文稿中可编辑 HTML、CSS 和 Javascript?

    我想知道是否可以在 powerpoint 内有一个可编辑的 HTML 演示界面 如 Plunkr 用于进行有关 HTML JavaScript 等的教育演示 有人这样做过吗 是否可以在 powerpoint 中嵌入带有 plunkr 或本地
  • 树图如何使用红黑树算法

    我读过很多关于红黑树的文章 其中操作需要 O log n 时间 我不太清楚它是如何工作的 以及与二叉搜索树相比 树图实际上如何使用红黑树算法来平衡树 参考链接https www topcoder com community data sci