【问题标题】:Which Multiple-Criteria Sorting algorithm to use?使用哪种多标准排序算法?
【发布时间】:2011-09-15 21:42:02
【问题描述】:

假设我们有项目列表,每个项目都有(未知)数量的属性。按单个属性排序是一种简单的排序算法。 问题是:如何按所有属性对相同的列表排序? 每个属性都有一个权重,所以我们可能会先用最不重要的属性排序,然后再用更重要的属性使用稳定排序算法等等,但这显然效率不高。

谢谢。

【问题讨论】:

    标签: algorithm sorting


    【解决方案1】:
    SORT BY A,B,C
    

    您在排序中的比较将: A,B,C 的优先级从高到低

    • 比较元素 1 的 A 和元素 2 的 A
      • 如果大于或小于返回结果
      • 其他比较 B
        • 如果大于或小于返回结果
        • Else 比较 C 返回结果

    这可以通过一个简单的循环外推到 A..n 标准。

    • 对于条件列表中的每个条件
      • 比较元素 1 和元素 2 的标准
        • 如果大于或小于返回结果
        • 否则继续 // 为清楚起见
    • 返回相等

    以上都假设您的比较功能是比较(元素1,元素2)

    【讨论】:

    • 这也是 O(knlogn),其中 k 是属性数,n 是元素数,与简单排序 k 次相同。跨度>
    • 问题在于,一个标准 A 比其他所有标准都具有无限的权重。假设学生擅长数学,我希望有人加入我的机器人团队。但是学生在道德、专业、编码、毒品问题等等方面都很糟糕,但是因为数学是开始的重要因素,所以算法会建议最好的学生是这样的,至少他会成为顶尖学生
    • @MuhammadUmer - 你想要一个 scoring 算法而不是 sorting 算法。因此,您需要根据您认为令人钦佩的内容为每个学生生成一个分数,然后您将仅按该分数进行排序。
    【解决方案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 在本例中最不重要。
    • 嘿!我刚看到你的答案(晚了 2 年..).. 我试图理解它将近两天.. 你能试着解释一下算法或将我链接到一些参考资料吗?
    • @AlmogBaku 我目前正在旅行。请在 10 天内推荐提醒我,我会更好地解释。
    • @AlmogBaku 这个想法基本上是给每个属性一个数值,这样属性的重要性在数字本身中占主导地位。例如,如果您有具有 3 个属性的对象,a,b,c 使得 a 占主导地位,c 占主导地位,并且每个属性都在范围 [0,9] 内,您可以为其指定值 val(a)*100 + val(b) * 10 + val(c)。因此,如果您有一个带有a=3,b=0,c=9 的对象,您会得到一个数字 309。现在,您可以使用常规排序算法根据这个数字对所有对象进行排序。
    【解决方案3】:

    大多数排序算法可以将单个比较函数作为输入,该函数可以组合多个排序条件。

    最后,为了能够排序,所有元素之间必须存在单一的排序关系(例如,A肯定在元素B之前,反之亦然,或者两者是等价的;关系必须满足传递/对称/自反性质),因此这意味着在给定有效比较函数的情况下,必须可以通过一次排序算法进行排序。

    【讨论】:

    • 这也是 O(knlogn) 最坏的情况,[k 是属性的数量,n 是元素的数量] 因为你需要检查 k 个元素每次比较。与使用稳定算法排序 k 次的界限相同。
    • true,并且性能可能会比排序 k 次更好,因为您不需要对所有元素进行所有 k 比较,只需指出它会渐近相同 [至少对于最坏情况分析]
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-11-02
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多