快速相对排名算法

时间:2013-07-16 20:22:21

标签: algorithm ranking

假设我拥有100个视频游戏,我想从最受欢迎到最不喜欢的游戏中订购。很难给每个视频游戏一个表示我喜欢它的数值,所以我想把它们相互比较。

我想出的一个解决方案是挑选2个随机视频游戏,然后选择我喜欢哪个,并丢弃另一个。不幸的是,这个解决方案只让我知道#1视频游戏,因为那将是剩下的最后一个,并提供关于其他的很少的信息。然后我可以为其他99个视频游戏重复这个过程,依此类推,但这是非常不切实际的:O(n ^ 2)。

是否有任何O(n)(或合理的)算法可用于根据相对标准对数据进行排序?

10 个答案:

答案 0 :(得分:2)

如果你想按顺序呈现游戏,你需要做出决定。

可以从一组成对比较中派生顺序次序。

这是一个例子。你有100个视频游戏。我们假设每个视频游戏都与参数a i (其中i的范围从1到100)相关联。这是一个真实的数字,描述了你喜欢游戏的“多少”。 我们还不知道这些参数的值。然后我们选择一个函数来描述您在视频游戏j中参与视频游戏的可能性。我们选择逻辑曲线并定义

P [i偏爱j] = 1 /(1 + e a j - a i

现在当 i = a j 时,你有P = 0.5,比如说, i = 1和 j = 0你有P = 1 /(1 + e -1 )= 0.73,表明相对较高的参数值增加了相应视频游戏首选的概率。 / p>

现在,当您在表中获得实际比较结果时,使用maximum likelihood方法计算参数a i 的实际值。然后按照计算出的参数的降序对视频游戏进行排序。

最大似然法是计算参数a i 的那些值,使得实际观察到的偏好尽可能可能,因此计算出的参数代表最佳猜测

答案 1 :(得分:1)

您可以使用quicksort aka pivot sort。选择一个游戏,并将其他游戏与之进行比较,这样你就可以拥有一组更糟糕的游戏和更好的游戏。递归地重复每一半。平均案例表现为n log n。

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

答案 2 :(得分:0)

其他方式是扩展你的想法。显示更多2个游戏并按您的评分排序。这个想法类似于merge sort来评价你的游戏。如果您选择正确评级的游戏,则不需要进行大量迭代。只是一个fiew。 IMO O(n)会很难,因为你(作为一个人类)的观察是有限的。

答案 3 :(得分:0)

至于是否有O(n)方式对n个对象进行排序,则没有。这种排序的下限是O(nlogn)

然而,有一个特例。如果您有一个独特且有界的偏好,那么您可以执行所谓的桶排序。

如果没有两场比赛,则偏好是唯一的。 如果您的偏好有最小值和最大值,则偏好是有限的。

1 .. m成为您游戏组的界限。

只需创建一个包含m元素的数组,并根据您的偏好将每个游戏放入索引中。

现在,您可以对数组进行线性扫描,以获得排序顺序。

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

答案 4 :(得分:0)

首先,您可以保留一个列表并使用二进制搜索逐个插入每个元素,为您提供O(n log n)方法。

我也确定你不能击败O(n log n),除非我误解了你想要的东西。基本上,你告诉我的是你希望能够仅使用比较来对一些元素(在你的例子中,视频游戏)进行排序。

将您的算法视为:您可以使用n!种方式来安排游戏,每次进行比较时,都会将排列分为POSSIBLEIMPOSSIBLE ,抛弃后一组。 (这里可能意味着安排与你所做的比较一致)

在最糟糕的情况下,POSSIBLE组始终至少与IMPOSSIBLE组一样大。在这种情况下,您的所有比较都不会将搜索空间减少至少2倍,这意味着您需要至少log_2(n!) = O(n log n)次比较才能将空间减少到1,从而为您提供游戏顺序。

答案 5 :(得分:0)

一种可能性是创建几个标准C1, C2, ..., Cn,如:

  • 视频质量
  • 困难
  • 场景的兴趣
  • ...

你通过这个筛子传递每场比赛。

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

好的算法不允许您随机选择对,但会根据非支配子集建议您进行比较。

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

或者购买像ModeFrontier这样的软件,其中嵌入了一些这样的算法(如果仅用于排名库,则有点贵)。

答案 6 :(得分:0)

我不认为它可以在O(n)时间内完成。我们可以得到的最好是O(nlogn)使用合并或快速排序。

答案 7 :(得分: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]广告位中添加一个,然后您可以根据该排序对其进行排序。

答案 8 :(得分:0)

虽然不是O(n),但成对比较是将一组元素相对于彼此进行排名的一种方法。

实施算法:

  1. 创建100x100矩阵
  2. 每行代表一部电影,每列代表一部电影。 r1的电影与c1的电影相同,r2 = c2 ... r100 = c100。
  3. 这是一些描述算法的快速伪代码:

    
        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()
    

答案 9 :(得分:-1)

我理解很难量化你喜欢什么,但是如果你创造了几个“领域”,你会判断每个游戏:

graphics
story
multiplayer
etc...

为每个类别提供5个中的每个1-5个(更改您认为更重要的类别的权重)。尝试创建一个客观的评判标准(可能使用外部来源,例如,metacritic)

然后你将它们全部添加起来,给出你喜欢它们的总体评级。然后使用排序算法(MergeSort?InsertionSort?)将它们按顺序放置。那将是O(n*m+nlogn) [n = games, m = categories],考虑到m可能非常小,这是非常好的。

如果你真的有决心,你可以根据过去的选择使用机器学习来近似未来的游戏。