如何对数据的这个“矩阵”进行排序?

时间:2015-06-19 15:05:25

标签: sorting matrix

我经营一个体育网站,根据之前的会议对人们进行排名通常很有用。

请参阅此示例数据集:

左侧是原始的“未排序”视图。右边是正确排序的(在我看来)列表。

每个方块显示他们相互竞争的次数以及胜利的百分比。根据百分比对它们进行着色。

我在网页上有这个,每行都有“向上”和“向下”控件,我可以手动轻推它们直到我得到我想要的东西。

我不太确定自动化的最佳方法。

每行末尾的数字是我粗略的想法,并且等于行的总和(百分比-50 *列号)。正如你所看到的,他们做得相当不错,只有前两行是“错误的”。他们不会对会议次数给予任何重视,只有胜利百分比。

最终列数也会根据行顺序而变化,通过比较图像中的左右表可以看出,因此对初始值进行排序不会很好。循环排序+重新计算几次可能会完成这项工作。

我希望我可以拼凑一些东西来完成这项工作......但我觉得这会有一些很多更好的想法,而且我都是耳朵。

2 个答案:

答案 0 :(得分:1)

tournament是一个图形,其中每对顶点之间只有一个有向边;要从你的输入中创建这样一个图形,你可以为每个玩家创建一个带顶点的图形,然后在赢得大多数游戏的玩家的指导下“指向”两个玩家之间的每个边缘(你需要打破关系)以某种方式)。

如果你这样做,如果没有周期A> B> ...>我在此图表的评论中提到的类型之一,然后图表是 transitive ,您可以使用图表的topological sort订购玩家。这只需要边缘数的线性时间,即n个玩家的O(n ^ 2)。

如果 这样的周期,那么玩家就没有“完美”的排序:任何排序都会在一些玩家击败后至少有一名玩家。在这种情况下,一个合理的选择是寻找最小化这些“边缘违规”数量的排序。这被证明是计算机科学中一个经过充分研究的NP难问题,称为(最小)反馈弧集在锦标赛中(FAST)。 feedback arc set是一组有向边(“弧”),如果从图中删除,将留下没有有向循环的图形 - 然后可以像以前一样使用拓扑排序轻松转换为顺序。

This paper描述了最近针对该问题的攻击。我没有读过这篇论文,但这是一个活跃的研究领域,因此算法可能相当复杂 - 但它可能会给你一些关于如何创建一个运行速度较慢的简单算法的想法(但在这样的小实例上可以快速地获得) ),或者如何创建启发式。

答案 1 :(得分:1)

只是添加到j_random的答案,您可以使用Tarjan's strongly connected components algorithm之类的东西隔离循环。在强连接组件中,您可以使用其他方法对项目进行排序。