C++ O(N)中锦标赛的获胜者和O(NLogN)中球员的排名

C++ O(N)中锦标赛的获胜者和O(NLogN)中球员的排名,c++,c,algorithm,data-structures,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,

在由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;
int-winner=0;
对于(int i=1;i
为了获得玩家的排名,我想拓扑排序将是一个很好的选择。如果玩家1赢了玩家2,那么将在P1->P2中添加一条边。如果玩家1是这里的赢家,那么它对所有其他玩家都有优势。然后以胜利者为源顶点进行拓扑排序,得到玩家的排名。 我的解决方案正确吗?还有其他有效的解决方案吗?任何帮助都会很好,提前谢谢。

条件

如果球员P1与P2赢得比赛,而球员P2与P3赢得比赛


定义总排序,即,如果我们为“
P2
失败的
P1
”定义
P1
”,我们有一个传递排序关系
您寻找赢家的方法似乎是正确的。事实上,假设真正的赢家是
W
。当你的循环中有
i==W
时,你将始终有
win[i][winner]==1
,因为玩家
W
赢得了其他所有人。因此,您将设置
winner=W
,并且不会再更改它,因为没有人赢过
W

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

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

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

严格总顺序的概念还为您提供了另一种算法证明,以找到一个赢家


下面是示例的完整代码:

显示您的代码。如果有特定错误,请随时询问。这不是“做我的家庭作业”、代码审查或教程网站。你提到的一直适用的条件太强了。这个条件将使一个玩家赢得所有人。这应该是搜索功能的条件。根据我的眼球,在这种情况下,它是玩家2。C和C++是不同的语言。我认为这是一个理想的世界,每个玩家都有一个可量化的技能水平,而更好的玩家总是赢,因此消除了大部分真实数据的复杂性。@ Jefffrey你不必遍历整个矩阵。你从随机玩家开始,然后找到赢得那个家伙的人,然后迭代,直到你找不到任何人赢得他。我认为这确实是一种O(n)的味道。但在这种情况下,我们必须对每个球员进行比较,对吗?所以,这使得O(N2)正确吗?@vignesh,许多排序算法只使用
O(nlogn)
比较。不,我是问这个函数bool-less(int-playerA,int-playerB)@vignesh,这个函数只是比较两个给定的玩家,并在
O(1)
中进行比较。因此,对
less
的每次调用都是
O(1)
,而此类调用的总数是
O(N logn)
。请您用一个4个玩家的简单例子来解释一下。我们如何部署小于谓词来对N logn进行排序?@abksrv选择在
O(N logn)
中运行的任何合适的排序算法(合并排序,堆排序)并在其中使用此谓词进行比较,而不是使用
Quickselect和Quicksort,这在实践中是一个不错的选择,但需要进行修改,以保证在最坏的情况下O(n)和O(n log n)。