Data structures 用于存储两人游戏结果的最具时间效率的数据结构

Data structures 用于存储两人游戏结果的最具时间效率的数据结构,data-structures,Data Structures,如果有两个玩家,一个是赢家,一个是输家,那么在我需要的情况下,存储这些数据的最有效方式是什么 检查一个给定的玩家是否击败了另一个给定的玩家 列出一个给定玩家击败的所有玩家 列出给定玩家输给的所有玩家 列出一个给定玩家玩过的所有玩家 列出所有游戏结果 我曾考虑使用关键玩家的散列图,并为输家列表赋值,但当列出一个玩家输给的所有玩家时,这似乎并不有效,因为时间复杂度为n^2,而散列图,其中键为玩家,值为输家列表或{对手,结果}将是最容易实现的解决方案,我想说它不是最节省空间的解决方案 对于每个用户

如果有两个玩家,一个是赢家,一个是输家,那么在我需要的情况下,存储这些数据的最有效方式是什么

  • 检查一个给定的玩家是否击败了另一个给定的玩家
  • 列出一个给定玩家击败的所有玩家
  • 列出给定玩家输给的所有玩家
  • 列出一个给定玩家玩过的所有玩家
  • 列出所有游戏结果

我曾考虑使用关键玩家的散列图,并为输家列表赋值,但当列出一个玩家输给的所有玩家时,这似乎并不有效,因为时间复杂度为n^2

,而
散列图
,其中键为玩家,值为输家列表或
{对手,结果}
将是最容易实现的解决方案,我想说它不是最节省空间的解决方案

对于每个用户,您必须维护一个
HashMap
,并且该映射将具有重复的条目。例如,如果一个玩家
a
玩了
B
并且赢了,
a
HashMap
将有一个
{B,“赢”}
的条目,而玩家
B
将有一个
{a,“输”}
的条目,这不是必需的,因为我们可以暗示如果玩家
a
赢了,玩家
B
一定输了

我建议使用
图形
数据结构来解决这个问题。一个图形
G=(V,E)
V
作为一组用户,而
E
则作为一组边,这些边在用户之间具有一个以上的属性,玩家获胜

以下是获得更好想法的视觉表示:

通过此实现,您可以避免在出现
HashMap

查询:

1.检查一个给定的玩家
(X)
是否击败了另一个给定的玩家
(Y)

仅从
X
执行一级
DFS
。检查当前播放机是否为
Y
。如果播放机是
Y
,请检查边缘值。如果边缘值为
X
X
获胜,否则
Y
获胜。如果
Y
不在边缘列表中,则玩家
X
从未玩过
Y

时间复杂度:
O(E)
其中
E
是节点
X
上发生的边缘列表

2.列出某个特定玩家(X)击败的所有玩家
X
执行一级
DFS
。检查边值。如果边值为
X
X
获胜,则将边另一端的节点添加到列表中。
时间复杂度:
O(E)
其中
E
是节点
X
上的边事件列表


3.列出一个给定玩家(X)输给的所有玩家
与2相同


4.列出给定玩家与之一起玩过的所有玩家
与2相同


5.列出所有比赛结果
执行完整的DFS。

时间复杂度:
O(E)
其中
E
是边的列表。

与其是玩家的哈希图和输家的值列表,不如是玩家的哈希图和{对手,结果}的值lis。这样你就能知道谁是球员,以及每场比赛的结果。