鉴于有两个玩家,其中一个是胜利者,一个是失败者,考虑到我需要,最有效的方式来存储这些数据
我正在考虑使用关键玩家的哈希地图,并评估输家的列表,但是当列出玩家失去的所有玩家时,这似乎并不高效,因为时间复杂度为n ^ 2
答案 0 :(得分:1)
虽然以密钥作为播放器的HashMap
和作为输家列表或{ opponent, outcome }
的值将是最容易实现的解决方案,但我会说它不是最节省空间的解决方案。< / p>
对于每个用户,您必须维护HashMap
,并且该地图会有重复的条目。例如,如果玩家A
玩过B
并赢了,则HashMap
A
会有{ B, "WON" }
和玩家B
的条目将有一个{ A, "LOST" }
的条目,这不是必需的,因为我们可以暗示如果玩家A
获胜,则玩家B
必定已经丢失。
我建议使用Graph
数据结构来解决问题。图表G = (V, E)
将V
作为一组用户,E
作为一组边缘之间的边缘,其中一个玩家赢得了另一个属性。
这是一个可视化表示,以获得更好的想法:
通过此实现,您可以避免在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
是边缘列表。