O(N)锦标赛冠军和O(NLogN)球员排名

时间:2015-07-23 14:00:08

标签: c++ c algorithm data-structures

在N个球员的网球锦标赛中,每个球员都与其他球员一起比赛。 以下条件始终如下─ 如果玩家P1赢得了与P2的比赛并且玩家P2从P3获胜,那么玩家P1也击败了P3。 在O(N)时间和O(1)空间中找到锦标赛的冠军。在O(NlogN)时间内找到玩家的等级。 我的解决方案: 输入是布尔矩阵,其中元素矩阵[i] [j]指示玩家i是否赢得玩家j。

bool win[][]= {
    {0, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 1, 1, 1},
    {0, 0, 0, 1, 1, 0, 0},
    {0, 0, 0, 0, 1, 0, 0},
    {0, 0, 0, 0, 0, 0, 0},
    {1, 0, 1, 1, 1, 0, 1},
    {0, 0, 1, 1, 1, 0, 0}
};

因此可以找到胜利者,

int winner = 0;
for (int i = 1; i < PLAYER_COUNT; ++i) {
    if (win[i][winner])
        winner = i;
}
return winner;

为了获得玩家的等级,我猜拓扑排序将是一个好的。如果玩家1赢得玩家2,则添加边缘,这个P1-> P2。如果玩家1在这里获胜,那么它将与所有其他玩家有优势。然后以获胜者作为源顶点的拓扑排序将给出玩家的等级。 我的解决方案是否正确还有其他有效的解决方案吗?任何帮助都会很棒,提前谢谢。

2 个答案:

答案 0 :(得分:6)

条件

  

如果玩家P1赢得了与P2的比赛并且玩家P2赢得了P3

定义总排序,即如果我们为&#34; P1 < P2击败P2&#34;定义P1,我们就会有一个传递排序关系< ,在排序或查找最大值时,可以与常规less-than关系完全一样使用。因此,对于实现,我们可以定义谓词bool lessThan(int p1, int p2),它只会在p1中的矩阵中查找p2O(1)关系。然后将谓词用于&#34;最大值&#34;搜索,线性(O(N)),或排序(排名),O(N log N)

答案 1 :(得分:1)

您找到胜利者的方法似乎是正确的。实际上,假设真正的赢家数是W。在你的循环中你有i==W,你将始终拥有win[i][winner]==1,因为玩家W赢得了其他所有人。因此,您将设置winner=W,并且永远不会更改它,因为没有人赢得W

您的代码也是O(N),所以我认为它解决了第一个问题。

对于第二个问题,是的,拓扑排序会做,但一个简单的实现将是O(N^2)。但请注意,您的win表实际上提供了strict total order。因此,您可以应用任何标准排序算法,并比较两个玩家只是检查一个人是否赢得了另一个。也就是说,只需使用

bool less(int playerA, int playerB) {
    return win[playerA][playerB];
}
std::sort中的

这种严格总命令的概念也为您找到获胜者的算法提供了另一种证明。

以下是您的示例的完整代码:http://ideone.com/99DIQk

相关问题