我想到了一种解决方案,即选择两个随机的视频游戏,然后选择我更喜欢哪一个,并放弃另一个。不幸的是,这种方法只能让我知道第一名视频游戏,因为那将是最后剩下的,而对其他游戏提供的信息很少。我可以重复这个过程来处理其他99个视频游戏,以此类推,但是这非常不切实际:O(n^2)。
是否有任何可用于基于相对标准对数据进行排序的O(n)(或合理的)算法?
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]
槽中,然后您可以根据此进行排序。虽然不是O(n),但成对比较是一种将集合元素相对排名的方法。
实现算法的步骤:
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()
另一种方法是扩展您的想法。显示超过2个游戏,并按您的评分进行排序。这个想法类似于归并排序来评估您的游戏。如果您正确选择评分游戏,则不需要进行很多迭代。只需要几个。在我看来,O(n)会相当困难,因为您(作为人)的观察是有限的。
关于是否有一种 O(n)
的方法来排序 n 个对象,实际上是没有的。这样一种排序的下限将会是 O(nlogn)
。
然而,有一个特殊情况。如果您有一个独特且有界的偏好,那么您可以使用所谓的桶排序。
如果没有两个游戏并列,则偏好是独特的。 如果您的偏好有最小值和最大值,则偏好是有界的。
让 1 .. m
成为您的游戏集的边界。
只需创建一个具有 m
个元素的数组,并根据您的偏好将每个游戏放置在相应的索引中。
现在,您只需对数组进行线性扫描即可获得排序后的顺序。
但当然,这不是基于比较的。
一种可能的方法是创建几个标准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这样的软件,它内置了一些这些算法(如果只是为了排列图书馆,则有点昂贵)。
我认为这不能在O(n)时间内完成。我们能得到的最好结果是使用归并排序或快速排序,达到O(nlogn)。
我知道很难量化你对某件事的喜爱程度,但如果你创建了几个“领域”,你将根据每个游戏来评判:
graphics
story
multiplayer
etc...
为每个类别评定一个1-5分的等级(可以根据你认为更重要的类别改变权重)。尝试创建一个客观的评判标准(可能使用外部来源,例如metacritic)
然后将它们全部加起来,这将给出你喜欢它们的总体评分。然后使用排序算法(MergeSort?InsertionSort?)将它们按顺序排列。这将是 O(n*m+nlogn) [n = 游戏,m = 类别]
,考虑到m很可能非常小,这相当不错。
如果你真的下定决心,可以使用机器学习来近似预测未来的游戏,基于你过去的选择。