快速相对排名算法

10
假设我拥有100个视频游戏,并希望按最喜欢到最不喜欢的顺序对它们进行排序。很难给每个视频游戏一个数量值来表示我喜欢程度,因此我考虑将它们相互比较。
我想到了一种解决方案,即选择两个随机的视频游戏,然后选择我更喜欢哪一个,并放弃另一个。不幸的是,这种方法只能让我知道第一名视频游戏,因为那将是最后剩下的,而对其他游戏提供的信息很少。我可以重复这个过程来处理其他99个视频游戏,以此类推,但是这非常不切实际:O(n^2)。
是否有任何可用于基于相对标准对数据进行排序的O(n)(或合理的)算法?

好的,为了让这个方法起作用,你需要以某种方式为每款游戏分配一个值来显示你喜欢它的程度。 - PaulG
由于绝对值是“不准确”的,也许有一种折中的方法:以某种方式利用绝对排名和相对排名。 - Lanaru
你真的需要一个精确的顺序吗?为什么不只是把它们放在五个桶里(讨厌,不喜欢,中立,喜欢,爱)?或者你是将这个例子作为其他排名问题的代理? - Jim Mischel
有一个精确的顺序并不是必要的,因此桶建议可能会非常有效。谢谢。 - Lanaru
我怀疑你甚至无法就唯一的排名达成一致(我认为我自己的游戏、电影或其他事物也做不到这一点);你对自己的游戏的偏好可能不是传递的,因此如果在这三个之间有几对配对,你很可能会陷入像a > b,b > c,a < c这样的情况。 - G. Bach
10个回答

3
如果你想按顺序呈现游戏,你需要对此进行决定。
可以从一组成对比较中推导出一个连续的顺序。
这是一个例子。您有100个视频游戏。我们假设每个视频游戏都与参数a i(其中i范围从1到100)相关联。这是描述您喜欢该游戏的程度的实数。 我们还不知道这些参数的值。然后,我们选择描述您更喜欢哪个视频游戏的可能性的函数。我们选择了逻辑曲线,并定义
P [i优于j] = 1 /(1 + e a j - a i
现在当ai = aj时,您拥有P = 0.5,而当,例如,ai=1且aj=0时,您拥有P = 1 /(1 + e -1 )= 0.73,显示对应的视频游戏具有相对较高的参数值会增加其被优先选择的概率。
现在,当您在表格中拥有实际比较结果时,您使用最大似然方法来计算参数ai的实际值。然后您按计算参数的降序对视频游戏进行排序。
发生的情况是最大似然法计算出使实际观察到的偏好尽可能可能的参数值ai,因此计算出的参数表示关于视频游戏之间的总排序的最佳猜测。请注意,为了使它起作用,您需要充分多次比较视频游戏-每个游戏至少需要一次比较,并且比较不能形成不相交的子集(例如,您将A与B与C与A进行比较,将D与E与F与D进行比较,但在 {A,B,C}之间没有游戏与{D,E,F}的比较)。

1
你可以使用快速排序,也叫做枢轴排序。选择一个游戏,并将每个其他游戏与其进行比较,这样你就有了一组更差的游戏和更好的游戏。对于每个子集递归重复此过程。平均情况下的性能为n log n。

http://en.wikipedia.org/wiki/Quicksort


当然了!我不知道为什么这个问题对我来说没有被看做简单的排序问题。我的最初解决方案类似于冒泡排序。最终,我实现了快速排序算法,其中比较函数提示用户在两个游戏之间进行选择。 - Lanaru

0
我处理这个问题的方式是使用一个包含游戏标题和计数槽的数组。
Object[][] Games = new Object[100][2];
Games[0][0] = "Game Title1";
Games[0][1] = 2;
Games[1][0] = "Game Title2";
Games[1][1] = 1;

每次投票都应该将一个添加到Games [*] [1]槽中,然后您可以根据此进行排序。

0

虽然不是O(n),但成对比较是一种将集合元素相对排名的方法。

实现算法的步骤:

  1. 创建一个100x100的矩阵
  2. 每行代表一部电影,每列也代表一部电影。r1处的电影与c1处的电影相同,r2=c2...r100=c100。

Here is some quick pseudo-code to describe the algorithm:


    for each row
        for each column
            if row is better than column
                row.score++
            else 
                column.score++
            end
        end
    movie_rating = movie[row] + movie[column]
    sort_by_movie_rating()


0

另一种方法是扩展您的想法。显示超过2个游戏,并按您的评分进行排序。这个想法类似于归并排序来评估您的游戏。如果您正确选择评分游戏,则不需要进行很多迭代。只需要几个。在我看来,O(n)会相当困难,因为您(作为人)的观察是有限的。


0

关于是否有一种 O(n) 的方法来排序 n 个对象,实际上是没有的。这样一种排序的下限将会是 O(nlogn)

然而,有一个特殊情况。如果您有一个独特且有界的偏好,那么您可以使用所谓的桶排序。

如果没有两个游戏并列,则偏好是独特的。 如果您的偏好有最小值和最大值,则偏好是有界的。

1 .. m 成为您的游戏集的边界。

只需创建一个具有 m 个元素的数组,并根据您的偏好将每个游戏放置在相应的索引中。

现在,您只需对数组进行线性扫描即可获得排序后的顺序。

但当然,这不是基于比较的。


0
作为一种初始方法,您可以使用二分查找来保持列表并逐个插入每个元素,这样您就可以获得 O(n log n) 的排序方法。
我确信,除非我误解了您的意思,否则您无法超越 O(n log n)。基本上,您告诉我的是,您希望能够仅使用比较来对某些元素(在您的示例中为视频游戏)进行排序。
将您的算法想象成这样:您从 n! 种可能的排列方式开始,每次进行比较时,将排列分成 POSSIBLE 和 IMPOSSIBLE 两组,并丢弃后者。(这里的 POSSIBLE 意味着排列与你所做的比较相一致)
在最坏的情况下,POSSIBLE 组总是至少与 IMPOSSIBLE 组一样大。在这种情况下,您的比较都不能使搜索空间缩小至少 2 倍,这意味着需要至少 log_2(n!) = O(n log n) 的比较才能将空间减少到 1,从而给您提供游戏的排序结果。

0

一种可能的方法是创建几个标准C1,C2,...,Cn,例如:

  • 视频质量
  • 难度
  • 情节趣味性
  • ...

您可以通过这个筛子来评估每个游戏。

然后,您可以比较游戏对的子集(2级选择),并告诉我们您更喜欢哪一个。存在一些多标准决策分析(MCDM或MCDA)算法,它们将把您的2级选择转换为多标准排名函数,例如,您可以计算系数a1,...,an以构建线性排名函数a1*C1+a2*C2+...+an*Cn

好的算法不会让您随机选择对,而是会根据非支配子集为您提出要比较的对。

请参阅维基百科http://en.wikipedia.org/wiki/Multi-criteria_decision_analysis,其中提供了一些有用的链接,并准备做/读一些数学。

或者购买像ModeFrontier这样的软件,它内置了一些这些算法(如果只是为了排列图书馆,则有点昂贵)。


0

我认为这不能在O(n)时间内完成。我们能得到的最好结果是使用归并排序或快速排序,达到O(nlogn)。


-1

我知道很难量化你对某件事的喜爱程度,但如果你创建了几个“领域”,你将根据每个游戏来评判:

graphics
story
multiplayer
etc...

为每个类别评定一个1-5分的等级(可以根据你认为更重要的类别改变权重)。尝试创建一个客观的评判标准(可能使用外部来源,例如metacritic)

然后将它们全部加起来,这将给出你喜欢它们的总体评分。然后使用排序算法(MergeSort?InsertionSort?)将它们按顺序排列。这将是 O(n*m+nlogn) [n = 游戏,m = 类别],考虑到m很可能非常小,这相当不错。

如果你真的下定决心,可以使用机器学习来近似预测未来的游戏,基于你过去的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接