完全不了解RB树可以吗?[关闭]


15

所以我刚在科门学到了红黑的树,哇!通常,我喜欢理解所有算法和数据结构,以至于我可以从头开始重建它们而不必欺骗伪代码。我非常喜欢算法,因此我喜欢学习它们的工作原理,并且通常逐行阅读代码并检查是否发生了我理解应该发生的情况,从而尝试某些情况。

仅仅了解正在发生的事情,就花了我很多时间去做RB树。即使有本书的解释,我仍然很难理解代码。更不用说我不明白轮换的方式/原因。我根本不觉得它直观。我的意思是,插入的三个(实际上是六个)不同的案例,然后是四个删除的案例?有可能了解这件事吗?对我而言,如果不作弊就无法重建此代码。在使用二叉树之前,我可以通过一些调整将这些东西付诸实践,但总能奏效,但是RB树我什至不会尝试。我的意思是,即使老师有时也会感到困惑,所以我想这确实不是那么容易,但同时,我们是否不应该了解正在发生的一切,或者至少是为什么?这本书没有 不能真正解释有人是如何提出轮换的想法的。有人怎么注意到2圈旋转可以解决任何插入问题?棒极了!

我的问题是,我真的必须100%了解RB树吗?在没有完全理解它的情况下,我感到有些不愉快。在此先感谢大家!(PS:RB树没有标签,实际上树甚至没有标签,只有二叉树,所以我只放算法)


18
“年轻人,在数学中你不了解事物。你只是习惯它们。” -约翰·冯·诺依曼(John von Neumann)

2
@Clash在什么情况下?我认为我从来不需要知道RB树如何在专业环境中工作,但这可能会因您想要执行的操作而异。我想你可以跳过它们直到你需要它们。
亚当李尔

4
@Clash让我感到非常困扰的是,您说在外部来源的指导下实施任何事情都是“欺骗”。伪代码的存在是有原因的-它们消除了从内存中进行伪代码的需要。我完全同意温斯顿的观点:从记忆中理解和了解是两个互斥的东西。记住!=理解和理解!=记忆。
doppelgreener

3
不用关心RB树是可以的-直到我需要它们为止?
史蒂文·劳

1
也许了解何时应该使用RB树,而不是所有其他类型的树实现。知道他们解决了什么问题,以及选择RB树的所有原因。但是,如果您必须实施一项考试(当然是在考试之外),则可以进行查找;那么为什么还要从内存中知道如何做呢?
达伍德说恢复莫妮卡

Answers:


13

您似乎将“理解”的概念等同于“无需看书就能编写代码”。这是两件事。如果您看到旋转树节点如何重新排列树以保持平衡,那么您就可以理解它。能够立即调出所有适用轮换的情况并不是重点。

我自己,如果我有笔/纸/几个小时玩,我可能会想出轮换的方法。但是我当然不能不加思索地写下来。如果实际上必须编写这样的算法,我会查找一下以确保我正确地掌握了所有细节。当然,在几乎任何情况下,我都会使用已经编写的代码。

使用所有这些功能的地方是当您遇到一种不太适合任何算法的情况。您将不需要编写自己的树实现。但是,例如,您可能发现自己需要拼凑成倍的双向链接列表。在这种情况下,了解旋转背后的基本思想可能会很有帮助。


2
“您似乎将“理解”的概念等同于“无需看书就能编写代码”。这是两件事。嗯...不 如果您正在写这篇文章,那可能意味着您甚至还没有上大学一两年的数学。在某些时候,“理解”数学(图灵提供的等同于计算)只是能够证明您“理解”了什么。没有解决方法,也没有ifs或mays或foo或bar或baz。在那个水平上,如果您无法证明自己的数学断言,那您就敬酒了。(除非您叫Fermat。)
Denis de Bernardy 2011年

14
@Dennis,我拥有CS硕士学位,该专业的数学课程数量高于平均水平。恐怕您还不明白我的意思。能够证明或证明您的理解非常重要。不能记住证明或方法的细节。您应该能够编写代码。但是我看不到能够从MEMORY编写代码的要求。
温斯顿·埃韦特

2
也要小心查找-IIRC,一些教科书在其红黑树算法中存在重大错误。
Steve314 2011年

2
@ Steve314,那么您甚至不需要了解RB即可成为教科书的作者!;)
Winston Ewert

谢谢温斯顿,这让我放心了!我可能在不久的将来发布的代码中只有几件事我不理解。但是,我很高兴不了解(通过理解,我的意思是写代码而不作弊)可以理解为什么/如何注意到3/6插入和4/8删除。
贝尔纳多·皮雷斯

4

如果您完全熟悉函数式编程,那么可能会发现这种方法对他们更好(Okasaki 1999):

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

如果没有,请至少从开头的句子中振作起来:

每个人都在其入门的计算机科学课程中学习平衡的二叉搜索树,但是即使是胆怯的人也为真正实现这种野兽而发抖。


哈哈瑞恩!那确实让我松了一口气!非常感谢!今天,我还注意到关于RB树的问题很少。所以我想他们真的很棘手。
贝尔纳多·皮雷斯

2
我认为,除了大学计算机科学专业的学生外,他们是每种编程语言大约实施一次的事情。(或更少。我认为,最流行的Scheme RB代码是从OCaml的RB代码移植而来的。)
Ryan Culpepper

链接已损坏:镜像1镜像2。万一两个镜在将来的某个时刻都无法使用,请完整引用:克里斯·冈崎(Chris Okasaki),“功能环境中的红黑树”,功能编程杂志,9(4),pp471-477,1999
Snowball,

3

您无需详细了解轮换。您应该了解RB树和2-3-4树之间的关系(请参阅Sedgewick)。当您将它们视为2-3-4棵树时,所有这些疯狂的旋转都更加有意义。如果您的教授没有将RB树作为2-3-4树的实现细节讲授,则您可能应该阅读2-3-4树。(Sedgewick的治疗效果非常好;维基百科没有。)

更一般而言,了解算法为何起作用的实现细节有时才有用。了解为什么算法起作用的逻辑几乎总是有用的。通常不需要自己提出算法,尽管您了解的算法越多,获得的机会就越大。


1

如果您下周需要“ RB Trees Heart”作为考试对象,则必须硬着头皮学习它们。在这种情况下,您应该重新考虑您的学习方法。也许尝试向同班同学解释RB树将比一整天寂寞的代码编写对您有更多帮助。

如果RB Trees是假期结束后您的下一个课程的基础,请立即跳过它们(没有不好的感觉),然后专注于本学期的课程。但是,请您为可以准备第二次尝试RB Trees的话题保持双眼。

如果您诚实地感觉到您永远不需要它们(请参阅Anna Lear的评论),请不要遗憾地亲吻他们,再见-没有人知道知识之流的下降(太糟糕了,老师经常认为他们的下降是最严重的)重要)。


1

编程成功的关键是永不放弃

今天,它的RB树明天将是另一回事。更大的教训是不放弃

对我来说,这是编程的核心要素之一,不放弃...

我建议您继续尝试,失败时再做一次

“直到得到它,直到它发出咔嗒声,直到它运行为止。”

因为一旦您克服了山脉,天空就会变得晴朗。您的思维在理解上转移了,您在时间上得到提升(直到下一座山)。这种时间上的涨价比世界上所有金钱都值钱。


谢谢,这正是我的恐惧!如果我放弃这一点,是什么阻止我放弃下一件事?这就是为什么我几乎整天都在浪费时间,只是为了了解插入和删除。
贝尔纳多·皮雷斯

相信我,这绝不浪费,当它“点击”海拔时,弥补了所有汗水和眼泪。
2011年

0

理解它的最好方法是尝试一下

  • 有3或6个旋转。拿一张纸,一张一张地写出来。
  • 一旦获得它,就去实施一棵红黑树。如果必须查几件事也可以。

这就是我们在大学里做到的方式。对于考试,我们必须解释其中的一部分是如何工作的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.