【发布时间】:2011-09-15 21:42:02
【问题描述】:
假设我们有项目列表,每个项目都有(未知)数量的属性。按单个属性排序是一种简单的排序算法。 问题是:如何按所有属性对相同的列表排序? 每个属性都有一个权重,所以我们可能会先用最不重要的属性排序,然后再用更重要的属性使用稳定排序算法等等,但这显然效率不高。
谢谢。
【问题讨论】:
假设我们有项目列表,每个项目都有(未知)数量的属性。按单个属性排序是一种简单的排序算法。 问题是:如何按所有属性对相同的列表排序? 每个属性都有一个权重,所以我们可能会先用最不重要的属性排序,然后再用更重要的属性使用稳定排序算法等等,但这显然效率不高。
谢谢。
【问题讨论】:
SORT BY A,B,C
您在排序中的比较将: A,B,C 的优先级从高到低
这可以通过一个简单的循环外推到 A..n 标准。
以上都假设您的比较功能是比较(元素1,元素2)
【讨论】:
创建一个函数 f:A1xA2x..->R [即根据优先级和属性为每个元素赋值]。该函数非常依赖于属性[例如,如果属性值在 (0,9) 范围内,则给出一个值很简单:Sigma[val(i)*10^prio(i)] for each attribute i。
迭代列表,计算函数值,并缓存这个函数结果,并根据它进行排序。复杂度为 O(nk+nlogn),其中 k 是属性数,n 是元素数。
【讨论】:
prio(i) 是第 i 个属性的优先级,其中 i=0 在本例中最不重要。
a,b,c 使得 a 占主导地位,c 占主导地位,并且每个属性都在范围 [0,9] 内,您可以为其指定值 val(a)*100 + val(b) * 10 + val(c)。因此,如果您有一个带有a=3,b=0,c=9 的对象,您会得到一个数字 309。现在,您可以使用常规排序算法根据这个数字对所有对象进行排序。
大多数排序算法可以将单个比较函数作为输入,该函数可以组合多个排序条件。
最后,为了能够排序,所有元素之间必须存在单一的排序关系(例如,A肯定在元素B之前,反之亦然,或者两者是等价的;关系必须满足传递/对称/自反性质),因此这意味着在给定有效比较函数的情况下,必须可以通过一次排序算法进行排序。
【讨论】: