提问者:小点点

/*来自 Java 树状图实现中的 CLR*/


我在查看Java(JDK 1.6 _ 45)的树形图代码,以理解我遇到的一个问题,在一些方法上,我看到一个注释说/**来自CLR */。

我的印象是CLR是微软对其常见运行时的术语。CLR 术语也用于 Java 吗?如果没有,那么是否有使用彼此实现的共同协议(当然转换后),或者只是一些自动生成的评论?

实例

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

共2个答案

匿名用户

“CLR”是三个人的缩写,即Cormen、Leiserson和Rivest,他们是《算法导论》第一版的作者。

EmirCalabuch在另一个帖子中回答说

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

“CLRS”与“CLR”指的是同一本书。由于这种方法紧跟算法简介,因此用 /** 来自 CLR */ 进行注释是合理的。

匿名用户

看起来Java的树状图从JabberNet的树中“借用”了部分实现,这是用C#编写的 - 这里是完整的C#源代码。

Java<code>TreeMap</code>的作者之一很可能包含了反映这一事实的注释(因此注释中的“CLR”实际上意味着“公共语言运行时”)。

下面是Java的< code>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) {
            ...

这里是JabberNet C#代码的相应片段:

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#代码自动生成的,参见Java代码中的注释:

/**
 * 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.
 */