我在查看Java(JDK 1.6 _ 45)的树形图代码,以理解我遇到的一个问题,在一些方法上,我看到一个注释说/**来自CLR */。
我的印象是CLR是微软对其常见运行时的术语。CLR 术语也用于 Java 吗?如果没有,那么是否有使用彼此实现的共同协议(当然转换后),或者只是一些自动生成的评论?
实例
/** From CLR */
private void fixAfterInsertion(Entry<K,V> x) {
“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.
*/