Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 快速相对排序算法_Algorithm_Ranking - Fatal编程技术网

Algorithm 快速相对排序算法

Algorithm 快速相对排序算法,algorithm,ranking,Algorithm,Ranking,假设我拥有100个电子游戏,我想从最喜欢到最不喜欢。很难给每个视频游戏一个数字值来表示我有多喜欢它,所以我想把它们相互比较一下 我想出的一个解决办法是随机挑选两款视频游戏,选择我更喜欢的一款,然后丢弃另一款。不幸的是,这个解决方案只让我知道#1视频游戏,因为那将是剩下的最后一个,而提供的关于其他游戏的信息很少。然后我可以对其他99款视频游戏重复这个过程,以此类推,但这是非常不切实际的:O(n^2) 是否有任何O(n)(或合理的)算法可用于根据相关标准对数据进行排序?我理解很难量化您对某项内容的喜

假设我拥有100个电子游戏,我想从最喜欢到最不喜欢。很难给每个视频游戏一个数字值来表示我有多喜欢它,所以我想把它们相互比较一下

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


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

我理解很难量化您对某项内容的喜爱程度,但如果您创建了几个“字段”,您可以根据这些字段来判断每一场比赛,该怎么办

graphics
story
multiplayer
etc...
每种类别的权重为1-5(改变你认为更重要的类别的权重)。尝试创建客观的评判量表(可能使用外部来源,例如元批评)

然后你把它们全部加起来,这会给你一个你有多喜欢它们的总体评分。然后使用排序算法(MergeSort?InsertionSort?)将它们按顺序排列。这将是
O(n*m+nlogn)[n=games,m=categories]
,考虑到m可能非常小,这非常好


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

另一种方法是扩展你的想法。显示2个以上的游戏,并根据您的评分进行分类。我的想法类似于给你的游戏评分。如果你选择的游戏评级正确,你就不需要做很多迭代。只是一个小圈子。IMO O(n)将非常困难,因为你(作为一个人)的观察是有限的。

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

然而,有一种特殊情况。如果您有一个唯一且有界的首选项,那么您可以执行所谓的桶排序

如果没有两场比赛平局,则偏好是唯一的。 如果您的首选项有最小值和最大值,则首选项是有界的

1。。m
成为您的游戏集的绑定

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

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


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

您可以使用快速排序,也就是枢轴排序。选择一个游戏,并将其他游戏与之进行比较,这样你就有了一组更差的游戏和更好的游戏。每半个循环重复一次。平均案例性能为n log n


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

我还确信,除非我误解了你的意思,否则你不能打败
O(n logn)
。基本上,您要告诉我的是,您希望能够仅使用比较对某些元素(在您的示例中是视频游戏)进行排序

把你的算法想象成这样:你从
n开始安排游戏的可能方式,每次进行比较时,将安排分为
可能
不可能
,丢弃后一组。(此处可能表示安排与您进行的比较一致)


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

一种可能是创建多个标准
C1,C2,…,Cn

  • 视频质量
  • 困难
  • 情景兴趣
每一场比赛都要通过这个筛子

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

好的算法不会让你随机选择配对,但会建议你根据非支配子集比较配对

请参阅维基百科,它提供了一些有用的链接,并准备好做/阅读一些数学知识


或者买一个像ModeFrontier这样的软件,其中嵌入了一些算法(如果只是对一个库进行排名,就有点贵)。

如果你想按顺序展示游戏,你需要做出决定

可以从一组成对比较中得出顺序

这里有一个例子。你有100个电子游戏。我们假设每个视频游戏都与一个参数ai关联(其中i的范围为1到100)。这是一个真实的数字来描述你有多喜欢这个游戏。我们还不知道这些参数的值。然后,我们选择一个函数,它描述了在参数方面您更喜欢视频游戏i而不是视频游戏j的可能性。我们选择logistic曲线并定义

p[i优先于j]=1/(1+eaj-ai)

现在,当ai=aj时,你有p=0.5,当ai=1和aj=0时,你有p=1/(1+e-1)=0.73,这表明相对较高的参数值增加了相应的视频游戏被首选的概率

现在,当您在表格中有实际的比较结果时,您可以使用的方法来计算参数ai的实际值。然后对视频进行排序
Object[][] Games = new Object[100][2];
Games[0][0] = "Game Title1";
Games[0][1] = 2;
Games[1][0] = "Game Title2";
Games[1][1] = 1;

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