如何处理红黑树中的重复项?
How to deal with duplicates in red-black trees?
所以我一直(到目前为止没有成功)尝试使我的红黑树实现与重复项一致地工作,但它似乎总是遗漏了一些小东西,所以我来了。
我试着让树向一侧倾斜,但它似乎没有适当地平衡它(从颜色的角度来看)。我想问一下应该如何将重复项添加到红黑色树?(除了明显使节点变胖,持有或指向重复的键值)。
不是真的在寻找代码审查,对建议更感兴趣。所以基本上我用于插入和平衡的方法(取自算法导论,第三版)是这些(虽然旋转非常明显):
如果你看看你在这里写的伪代码,它完全不知道键是否重复的问题。这里的代码只看比较键的结果,并不关心它们是否相同。事实上,唯一键的实现需要不遗余力地让 RB-Insert
检测到重复的键。数据结构自然不关心这个,算法和证明持有是否有重复键。如果您正确实现了这些功能,它应该可以正常工作。
我也不同意建议你持有你所谓的"fat nodes"的评论。例如,持有多个键是 C++ std::multimap
的常见实现。并不是说从计算复杂性的角度来看,假设您总共有 n 个键,但每个 k 都是一个倍数。使用 "efficient" 胖节点版本,基本查找操作的复杂度将是 Θ(log(n / k)) = Θ(log(n) - log(k));使用多密钥版本,复杂度将为 Θ(log(n))。在现实生活中,可能 k << n,这意味着相对差异可以忽略不计。
所以我一直(到目前为止没有成功)尝试使我的红黑树实现与重复项一致地工作,但它似乎总是遗漏了一些小东西,所以我来了。
我试着让树向一侧倾斜,但它似乎没有适当地平衡它(从颜色的角度来看)。我想问一下应该如何将重复项添加到红黑色树?(除了明显使节点变胖,持有或指向重复的键值)。
不是真的在寻找代码审查,对建议更感兴趣。所以基本上我用于插入和平衡的方法(取自算法导论,第三版)是这些(虽然旋转非常明显):
如果你看看你在这里写的伪代码,它完全不知道键是否重复的问题。这里的代码只看比较键的结果,并不关心它们是否相同。事实上,唯一键的实现需要不遗余力地让 RB-Insert
检测到重复的键。数据结构自然不关心这个,算法和证明持有是否有重复键。如果您正确实现了这些功能,它应该可以正常工作。
我也不同意建议你持有你所谓的"fat nodes"的评论。例如,持有多个键是 C++ std::multimap
的常见实现。并不是说从计算复杂性的角度来看,假设您总共有 n 个键,但每个 k 都是一个倍数。使用 "efficient" 胖节点版本,基本查找操作的复杂度将是 Θ(log(n / k)) = Θ(log(n) - log(k));使用多密钥版本,复杂度将为 Θ(log(n))。在现实生活中,可能 k << n,这意味着相对差异可以忽略不计。