【发布时间】:2016-07-25 09:48:45
【问题描述】:
如何在具有大量可比较字段的对象之间提供严格的排序?
假设您有两个对象 x 和 y 必须进行比较,每个对象都有 3 个字段(a、b、c)
bool less(x, y)
return x.a < y.a || x.b < y.b || x.c < y.c
很好,但这提供了弱排序。如果 x.a less(x,y) 为真,less(y, x) 也为真。
我习惯写作
bool less(x, y)
return x.a < y.a || (x.a == y.a && x.b < y.b)
但一旦涉及的字段数量增加,它就会变得非常难看。
bool less(x, y)
return x.a < y.a ||
(x.a == y.a && x.b < y.b) ||
(x.a == y.a && x.b == y.b && x.c < y.c) ||
(x.a == y.a && x.b == y.b && x.c == y.c && x.d < y.d);
有人有更好看的算法吗?
【问题讨论】:
-
我认为你需要定义什么是最重要的领域,什么是次要的。订购应该(我认为)精确确定。基本上,你首先检查什么属性,第二个是什么,第三个是什么?
-
我很想这样做,但由于问题的性质,比较必须以某种方式考虑每个字段
-
另一种选择是创建一个函数,对三个(或四个,或十个)属性进行一些计算,为您提供一个值,that 就是您比较的值。像
val_to_compare = 1*a + 10*b + 23*c这样的东西。这为您提供了一种将权重附加到属性的方法。 -
这是关于 Java 还是 C++ 的问题?
-
将属性(引用/指向它们的指针)存储在数组中,然后使用循环 - 使用正确的优化级别,您的编译器将展开它。
标签: c++ algorithm language-agnostic boolean-logic