【问题标题】:Data structure required for arranging objects based on a rule基于规则排列对象所需的数据结构
【发布时间】:2017-07-12 16:16:10
【问题描述】:

一个班的 N 名学生互相对战,每个学生与班上的所有其他学生对战。

而且,班长还要把学生排成一排,每个学生都输掉了与他前面的学生的比赛。

例如:

假设有 4 个学生 A、B、C 和 D

匹配总数:6( (A,B), (A,C), (A,D), (B,C), (B,D), (C,D) )

匹配结果:

A 定义 B

C 定义 A

A 定义 D

C 定义 B

B 定义 D

C 定义 D

所以顺序是:C A B D

为了存储学生对象,我使用以下数据结构:

struct node {
    int student_id;
    int wins;
}

我正在使用优先级队列来安排学生,将更多优先级分配给获胜者。

如果两个或多个对象具有相同的优先级,那么我该如何排列它们?

我正在考虑根据谁赢谁来保留一个有向图,然后进行拓扑排序。它会起作用吗?

【问题讨论】:

  • 第一句话和你的问题有关系吗?第二个似乎不相关且缺少信息。你有什么意见?
  • 是的,这里的学生就是对象。现在清楚了吗?
  • 不,不是。你有什么意见?
  • 很抱歉呈现不佳,我会修改它以使其更清晰
  • 我不确定当图形是循环时该怎么办,但如果它是非循环的,最好的办法是让优先级队列从高到低排列。制作相同优先级成员的有向图,对其进行拓扑排序以确定其顺序。这是作业吗?

标签: c algorithm sorting


【解决方案1】:

第一个学生将与 N-1 名玩家对战

第二个学生将与剩下的 N-2 名玩家对战

.

.

.

N-1 将与剩下的 1 名玩家比赛。

Nth 玩家已经与所有人交手了。

因此比赛场数:

N-1+N-2....+1+0= N(N-1)/2


我正在考虑根据谁赢得谁来保留有向图, 然后做一个拓扑排序,行吗?

当图形是非循环的时它应该可以工作。只需确保当 A def 时方向是从 A 到 B。 B. 否则,您将不得不反转堆栈跟踪。

我对循环场景持怀疑态度。但是有一个更简单的方法:

假设有 5 个玩家:A B C D E

根据获胜次数对列表进行排序,如下所示:

x def y(x->y)

A->B

A->D

B->C

B->D

B->E

C->A

D->C

D->E

E->A

E->C

现在从上面列出的第一个胜利开始。

A->B 字符串:A B

A->D 现在 D 可以出现在 B 之前或 B 之后。 查找时,B->D。隐含字符串:A B D

B->C 查找时,D->C 字符串:A B D C

B->E 查找时,E->C 这意味着 E 必须在 C 之前。 查找 D->E

字符串:A B D E C

字符串长度为 5。STOP。

【讨论】:

  • 不确定您的算法是否提供通用解决方案。
  • @MadPhysicist 这个问题可以有多种解决方案。即使您进行拓扑排序,也存在多种解决方案。这应该有效,因为按照字母顺序,您从最低位开始,然后是输家。这将为您提供一种解决方案
  • 至少您应该首先检查是否有学生赢得了所有比赛以及是否有学生输掉了所有比赛。每个只能有一个,并且必须分别放在列表的开头和结尾,否则解决方案将不起作用。
  • @MadPhysicist 它应该自动放置,因为您正在查找当前字符串和获胜列表(按字母顺序)。我也试过了
【解决方案2】:

那个数据结构行不通。无论您选择什么结构,都必须能够存储学生殴打/被殴打的人。像这个世界一样的东西:

struct node{
    int student_id
    bool wins[n]
}

wins[n] 代表对学生 ID==n 的胜利 从那里开始,这是寻路,但在“正常”情况下,您可以总结胜利,按此排序并检查是否正确,如果不正确则进行更改

【讨论】:

  • 好的,但是你能指定如何对列表进行排序
  • 在我的结构中,我将“获胜”作为总和。如果 2 名学生的胜利相同,那么如何排序。如果这种情况永远不会出现,我将需要证明这一点。
  • 证明你有一个正确的答案是微不足道的:顺着列表检查每个人输给了前面的人。对于 i = 1;i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2017-08-20
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多