【问题标题】:/*From CLR*/ in Java TreeMap implementation/*来自 CLR*/ 在 Java TreeMap 实现中
【发布时间】:2016-11-23 18:40:33
【问题描述】:

我正在查看 Java (JDK 1.6_45) TreeMap 代码以了解我遇到的问题,并且在几个方法中我看到一条评论说 /** From CLR */。

我的印象是 CLR 是 Microsoft 对其通用运行时的术语。 CLR 术语是否也用于 Java?如果没有,那么是否有一个共同的协议来使用彼此的实现(当然是在转换之后)还是只是一些自动生成的评论?

例子

/** From CLR */
    private void fixAfterInsertion(Entry<K,V> x) {

【问题讨论】:

    标签: java clr


    【解决方案1】:

    “CLR”是Introduction to Algorithms第一版作者Cormen、Leiserson和Rivest三个人的缩写。

    EmirCalabuch 在another thread 中回答了这个

    RBT 的 TreeMap 实现没有什么特别之处。它紧跟 CLRS(Cormen、Leiserson、Rivest 和 Stein)一书中给出的伪代码,这是 99% 的实现。

    “CLRS”与“CLR”指的是同一本书。由于这种方法紧跟Introduction to Algorithms,被/** From CLR */评论是合理的。

    【讨论】:

      【解决方案2】:

      看起来 Java 的 TreeMap“借用”了 JabberNet's Tree 的部分实现,JabberNet's Tree 是用 C# 编写的——here the full C# source code

      Java 的TreeMap 的作者之一很可能包含了反映这一事实的评论(因此评论中的“CLR”确实意味着“公共语言运行时”)。

      这里是sn-p from Java's TreeMap

      /** From CLR */
      private void fixAfterDeletion(Entry<K,V> x) {
          while (x != root && colorOf(x) == BLACK) {
              if (x == leftOf(parentOf(x))) {
                  Entry<K,V> sib = rightOf(parentOf(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) {
                  ...
      

      这里对应的sn-pfrom the JabberNet C# code

      private void fixAfterDeletion(Node x)
      {
          while ((x != root) && (colorOf(x) == NodeColor.BLACK))
          {
              if (x == leftOf(parentOf(x)))
              {
                  Node sib = rightOf(parentOf(x));
      
                  if (colorOf(sib) == NodeColor.RED)
                  {
                      setColor(sib, NodeColor.BLACK);
                      setColor(parentOf(x), NodeColor.RED);
                      rotateLeft(parentOf(x));
                      sib = rightOf(parentOf(x));
                  }
      
                  if ((colorOf(leftOf(sib))  == NodeColor.BLACK) &&
                      (colorOf(rightOf(sib)) == NodeColor.BLACK))
                  ... 
      

      如您所见,代码几乎相同——除了缩进、节点类名和语法不同。

      对于标记为/** From CLR */ 的其他方法也是如此。

      但是,Java 代码不是似乎是完全从 C# 代码自动生成的,参见。 this comment in the Java code

      /**
       * Balancing operations.
       *
       * Implementations of rebalancings during insertion and deletion are
       * slightly different than the CLR version.  Rather than using dummy
       * nilnodes, we use a set of accessors that deal properly with null.  They
       * are used to avoid messiness surrounding nullness checks in the main
       * algorithms.
       */
      

      【讨论】:

      • 这不可能。 TreeMap 的实现可以追溯到 Java 1.2 (1998)。在此处查看源代码:github.com/fanhongtao/JDK/blob/jdk_1.2.1/src/java/util/… C#(1.0 版)的第一个版本是在 2002 年!
      • 但是 CLR 开始得更早,大约是 1998 年。
      • CRL 的工作始于 98 年 6 月。Java 1.2 于 12 月发布。您是否建议 Java 1.2 背后的团队从发布前 4 个月刚刚开始的另一家公司的某个未知项目中复制一个树实现?哦,在长达数年的项目开始几个月后,CLR 中实现的第一件事就是一棵树?看看赵冰的回答。这很有意义。
      • 代码不是从 C# 借来的。在这种情况下,CLR 是“算法简介”的作者 Cormen、Leiserson 和 Rivest 的缩写,如代码 cmets 中所述:Algorithms are adaptations of those in Cormen, Leiserson, and Rivest's Introduction to Algorithms.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2012-07-22
      • 2017-07-06
      • 2019-06-12
      • 1970-01-01
      • 2012-04-27
      • 2020-12-08
      相关资源
      最近更新 更多