【问题标题】:Red-Black Tree Delete Fixup in CLRS Second Edition, in ClojureClojure 中 CLRS 第二版中的红黑树删除修复
【发布时间】:2013-06-21 09:32:49
【问题描述】:

我正在执行 CLRS 第 2 版,第 4 次印刷,第 288-9 页之后的区间树的红黑树删除。

错误总结:

RB-删除-修复

如果 x 和 w 是标记节点,这是 RB-Delete 的可能结果,则分别计算 color(left(w))。 RB-Delete-Fixup 中的 color(right(w)) 在 while 循环的第一次迭代中遇到空指针异常。

(if (and (= (get-color (get-left @w)) black) 
         (= (get-color (get-right @w)) black)) ;; Bug here!

这个问题的所有代码都在 Clojure 中:

https://github.com/mobiusinversion/interval-trees

下面是抛出异常时的红黑树状态图:

http://gorillamatrix.com/files/rb-delete-fixup.jpg

失败的单元测试是

(deftest insert-seven-delete-three-test ... )

在文件中

test/interval_trees/interval_tree_test.clj 

lein test 的输出如下所示:

$ lein test

lein test interval-trees.interval-test

lein test interval-trees.interval-tree-test

lein test :only interval-trees.interval-tree-test/insert-seven-delete-three-test

ERROR in (insert-seven-delete-three-test) (core.clj:2108)
Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.NullPointerException: null
 at clojure.core$deref_future.invoke (core.clj:2108)
    clojure.core$deref.invoke (core.clj:2129)
    interval_trees.interval_tree$get_color.invoke (interval_tree.clj:61)
    interval_trees.interval_tree$delete_fixup.invoke (interval_tree.clj:451)
    interval_trees.interval_tree$delete$fn__323.invoke (interval_tree.clj:528)

问题好像是在赋值之后

w <- right(p(x))

的 CLRS,第 1 页。 289 rb-delete-fixup 伪代码第7行,w指向sentinel节点,因此伪代码第9行没有左右检查颜色。

Clojure 实现中抛出异常的行在这里

src/interval_trees/interval_tree.clj:451 (where you see Bug here! comment)

勘误表中似乎没有提交错误:

http://www.cs.dartmouth.edu/~thc/clrs-bugs/bugs-2e.php

我很抱歉这个问题非常具体和密集,但非常感谢您的帮助,我这几天一直在努力解决这个问题。

这个人似乎问了同样的问题,但没有得到答案 Red Black Tree deletion algorithm

更新:我在第三版第三版中实现了delete和delete fixups例程,但未能解决问题。

【问题讨论】:

    标签: clojure red-black-tree clrs interval-tree


    【解决方案1】:

    事实证明这是我的错误,我认为节点“颜色”是其卫星数据的一部分。它不是。

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 2014-07-05
      • 2011-08-23
      • 2016-08-03
      • 2013-09-01
      • 1970-01-01
      • 2012-02-05
      • 2021-10-17
      相关资源
      最近更新 更多