用于存储双人游戏结果的大多数时间有效的数据结构

时间:2018-04-09 13:43:05

标签: data-structures

鉴于有两个玩家,其中一个是胜利者,一个是失败者,考虑到我需要,最有效的方式来存储这些数据

  • 检查某位玩家是否击败了其他玩家
  • 列出给定玩家击败的所有玩家
  • 列出给定玩家失去的所有玩家
  • 列出给定玩家玩过的所有玩家
  • 列出所有游戏结果

我正在考虑使用关键玩家的哈希地图,并评估输家的列表,但是当列出玩家失去的所有玩家时,这似乎并不高效,因为时间复杂度为n ^ 2

1 个答案:

答案 0 :(得分:1)

虽然以密钥作为播放器的HashMap和作为输家列表或{ opponent, outcome }的值将是最容易实现的解决方案,但我会说它不是最节省空间的解决方案。< / p>

对于每个用户,您必须维护HashMap,并且该地图会有重复的条目。例如,如果玩家A玩过B并赢了,则HashMap A会有{ B, "WON" }和玩家B的条目将有一个{ A, "LOST" }的条目,这不是必需的,因为我们可以暗示如果玩家A获胜,则玩家B必定已经丢失。

我建议使用Graph数据结构来解决问题。图表G = (V, E)V作为一组用户,E作为一组边缘之间的边缘,其中一个玩家赢得了另一个属性。

这是一个可视化表示,以获得更好的想法:

players as graph nodes

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

的情况下出现重复

查询:

1。检查指定的玩家(X)是否击败了另一位玩家(Y)
&gt; 仅从DFS执行一级X。检查当前播放器是否为Y。如果播放器为Y,请检查边缘值。如果边缘值为X,则X赢了,否则Y赢了。如果Y不在边缘列表中,则播放器X从未使用过Y时间复杂度:O(E)其中E是列表节点X上的边缘事件。

2. 列出给定玩家(X)击败的所有玩家 &gt; DFS执行一级X。检查边缘值。如果边缘值为X,则X赢了,因此,将Edge另一端的Node添加到列表中。
时间复杂度:O(E)其中E是节点X上的边缘列表。


3. 列出给定玩家(X)失去的所有玩家 &gt; 与2相同。


4. 列出给定玩家玩过的所有玩家 &gt; 与2相同。


5. 列出所有游戏结果
&gt; 执行完整的DFS 时间复杂度:O(E)其中E是边缘列表。