通过一次显示两个项目,根据用户的偏好对列表项目进行排名的最有效方法是什么?

问题描述

在某些情况下,我建议您观看 Tom Scott 的这段视频,他在视频中确定什么是最好的“事物”:https://youtu.be/ALy6e7GbDRQ。我认为这有助于解释我的问题。


基本上,我正在尝试制作一种算法/程序,让一个用户通过一次在两个项目中选择他最喜欢的项目来对列表中的所有项目进行排名。

例如,最基本的列表有 3 个项目:A、B 和 C。 操作顺序如下所示:

  1. 用户可以选择:A 或 C。
  2. 他更喜欢 C。
  3. 用户可以选择:B 或 C。
  4. 他更喜欢 C。
  5. 用户可以选择:A 或 B。
  6. 他更喜欢 A。

所以我们知道在 3 次比较中排名顺序是 [C > A > B]。

但是如果在第 4 步,用户会选择 B 呢?我们可以通过逻辑假设他在第 5 步之前更喜欢 B 而不是 A。所以我们知道排名列表将是 [B > C > A] 在只有 2 次比较中,它和第一种情况一样准确。因此,我们可以看到步骤的数量取决于用户的选择。


那么在最少的比较次数中对所有项目进行排名的正确或最有效的方法是什么?我想从字面上比较每一个可能的组合,并为每个项目都有一个计数器,每次选择一个项目而不是另一个项目时都会增加。但是通过这种方式,要进行的比较次数只会根据列表的大小呈指数增长,并且不会像上面的示例那样是最有效的方式。我还考虑过使用一种简单的排序算法,用户可以在其中“手动”进行比较,但我对排序算法一般不太熟悉。

在 Tom Scott 的视频中,网站随机选择了两个项目,他使用了如此庞大的用户群,问题只是通过概率和统计来纠正自己,他不需要担心每个项目都被平等地选择准确的。由于我只希望一个用户对项目进行排名,因此我需要找到一种方法来选择正确的项目进行比较,以使其尽可能高效(我认为)。另一个区别是我不会像 Tom 的版本那样拥有超过 7000 个项目。我想用它来对例如“所有迪士尼电影”、“某些音乐类型”或“所有塞尔达视频游戏”进行排名,所以我我很确定我将拥有 最大 大约 100 个项目。

我的问题是:我在正确的轨道上吗?我应该使用简单的排序算法(如果是的话我应该使用哪个?)还是唯一有效地做到这一点的数学方法是比较每个组合?还是我错过了可以帮助我的东西?如果我对每个组合都进行暴力破解,这显然是对项目进行排名的最简单和准确的方法,但肯定不是最有效的。我想比较的顺序和我们比较的项目真正重要的是最有效,这就是我迷失的地方。

我知道在这里问这不是一个传统的问题,但感谢您帮助我或引导我走上正确的道路。

解决方法

假设用户将创建项目的总排序,该算法应该维护一个由越来越多的项目组成的完全有序列表。取下一个无序项并使用二分搜索所需的比较将其插入有序列表中。

取下一个无序项并使用两个项的二分搜索比较来插入它。

重复直到所有商品都订购完毕。

二分搜索应该尽量减少每个阶段的比较,并随着时间的推移向用户展示每个新项目的更有意义的比较。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...