假设我拥有100个视频游戏,我想从最受欢迎到最不喜欢的游戏中订购。很难给每个视频游戏一个表示我喜欢它的数值,所以我想把它们相互比较。
我想出的一个解决方案是挑选2个随机视频游戏,然后选择我喜欢哪个,并丢弃另一个。不幸的是,这个解决方案只让我知道#1视频游戏,因为那将是剩下的最后一个,并提供关于其他的很少的信息。然后我可以为其他99个视频游戏重复这个过程,依此类推,但这是非常不切实际的:O(n ^ 2)。
是否有任何O(n)(或合理的)算法可用于根据相对标准对数据进行排序?
答案 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 的那些值,使得实际观察到的偏好尽可能可能,因此计算出的参数代表最佳猜测关于视频游戏之间的总排序。请注意,要实现这一点,您需要将视频游戏与其他视频游戏进行多次比较 - 每个游戏至少需要进行一次比较,并且比较不能形成不相交的子集(例如,您将A到B比较为C到A,和D到E到F到D,但是来自{A,B,C}的游戏和来自{D,E,F}的游戏之间没有比较。
答案 1 :(得分:1)
您可以使用quicksort aka pivot sort。选择一个游戏,并将其他游戏与之进行比较,这样你就可以拥有一组更糟糕的游戏和更好的游戏。递归地重复每一半。平均案例表现为n log n。
答案 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!
种方式来安排游戏,每次进行比较时,都会将排列分为POSSIBLE
和IMPOSSIBLE
,抛弃后一组。 (这里可能意味着安排与你所做的比较一致)
在最糟糕的情况下,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),但成对比较是将一组元素相对于彼此进行排名的一种方法。
实施算法:
这是一些描述算法的快速伪代码:
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可能非常小,这是非常好的。
如果你真的有决心,你可以根据过去的选择使用机器学习来近似未来的游戏。