红黑树可以应对这种比较功能吗?

时间:2013-10-30 19:06:13

标签: algorithm data-structures

我正在考虑使用一个RedBlack树,它不支持使用与此类似的比较函数多次插入相同的键:

int compare(MyObject A, MyObject B)
{
   if (A.error > B.error) return 1;
   if (A.error < B.error) return -1;
   if (A.name == B.name) return 0;
   return 1;
}

这个技巧对于具有相同错误但具有不同“名称”的多个项目将是有用的。如果找到两个具有相同错误的项目,但该值不一致,则比较项目仅被视为“更大”。

我很确定这个技巧适用于正常的BST ......但我遇到了红黑树的麻烦。我不知道redblack树算法,我正在使用一个实现,所以我想知道为什么这不应该有效。

P.S。:名称没有比较关系...所以我唯一能做的就是检查它们是否相同。

P.P.S。:假设这不起作用并且知道我不能在“名称”值之间建立订单关系,我还有其他可能性吗?我可以使用一个允许使用相同的键插入多个值的数据结构,但这对我不起作用,因为当我删除一个值时,我必须确定我正在删除我实际传递的值(基本上是我的关键和价值是相同的,我需要一种有序的多集数据结构!)

2 个答案:

答案 0 :(得分:1)

您的二进制搜索树希望您的比较函数遵守您要插入树中的元素的total ordering的通常规则。您当前的比较函数不遵守此规则,因为如果对象A和B具有相同的error密钥但具有不同的value密钥,那么根据compare您同时A < BB < A有效。

如果您将比较功能更改为

,我认为它应该都能正常工作
int compare(MyObject A, MyObject B)
{
   if (A.error > B.error) return 1;
   if (A.error < B.error) return -1;
   if (A.value > B.value) return 1;
   if (A.value < B.value) return -1;
   return 0;
}

答案 1 :(得分:0)

您没有定义订单关系。

在您的情况下,您的对象是二维的。我从您的问题中了解到,订购时应优先考虑error字段。因此,订单关系(使用词典顺序)应为:

struct my_object {
    int error;
    int value;
};

int compare(struct my_object *a, struct my_object *b)
{
    int ret;
    if (!a) {
        return 1;
    }
    else if (!b) {
        return -1;
    }
    ret = a->error - b->error;
    if (!ret) {
        ret = a->value - b->value;
    }
    return ret;
}