【问题标题】:How does RBTree's color trick work? [closed]RBTree 的色彩技巧是如何工作的? [关闭]
【发布时间】:2013-04-23 20:22:24
【问题描述】:

在维基百科中:Red-black_tree

跟踪每个节点的颜色只需要每个节点的 1 位信息,因为只有两种颜色。该树不包含任何其他特定于它是红->黑树的数据,因此它的内存占用几乎与经典(未着色)二叉搜索>树相同。在许多情况下,额外的信息位可以存储而无需额外的内存>成本。

我在 C 中找到了 rbtree 的实现:

#ifdef UINTPTR_MAX

static inline enum rb_color get_color(const struct rbtree_node *node)
{
    return node->parent & 1;
}

static inline void set_color(enum rb_color color, struct rbtree_node *node)
{
    node->parent = (node->parent & ~1UL) | color;
}

static inline struct rbtree_node *get_parent(const struct rbtree_node *node)
{ 
    return (struct rbtree_node *)(node->parent & ~1UL);
}

static inline void set_parent(struct rbtree_node *parent, struct rbtree_node *node)
{
    node->parent = (uintptr_t)parent | (node->parent & 1);
}

#else
...
#endif

我的问题是这个颜色技巧是如何工作的?谢谢。

【问题讨论】:

标签: c red-black-tree


【解决方案1】:

它使用了一个(非常粗略的)技巧来改变指向父级的指针以存储一个位,该位指示颜色。该指针中的最低有效位包含颜色:

static inline enum rb_color get_color(const struct rbtree_node *node)
{
    return node->parent & 1;
}

如果低位为0,则颜色为红色,如果低位为1,则颜色为黑色。 (意识到红色是0 和黑色是1 无关紧要,反之亦然)。


@Daniel Fischer commented 带有保证被带出 cmets 的链接:

http://en.wikipedia.org/wiki/Pointer_tagging

...这正是这里使用的技术。

【讨论】:

  • 这行得通的原因是因为指针需要正确对齐?所以指针永远不会自然设置 1 位?
  • 我认为你强调的 令人难以置信的草图 不够。谁写这样的代码?!?然后发布它... GAG.
  • @Nik Bougalis 为了好玩而写 C 的人
  • @Patashu 是和否。这是一个可怕的假设。考虑这个例子:struct rbtree_node *n = (struct rbtree_node *)(1 + (unsigned char *)malloc(1 + sizeof(struct rbtree_node)));。出于某种奇怪的原因,我想分配一个额外的内存字节并将其存储在指针旁边。完全有效的事情。除了现在你的红黑树完全无聊
  • @NikBougalis “完全有效的事情”可能是错误的。 struct rbtree_node 可能有对齐要求。另外:en.wikipedia.org/wiki/Pointer_tagging
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2011-02-05
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多