[英]Data structure for storing and searching the result of tournament
有100位玩家p1,p2,...... ... p100,每位玩家与其他每位玩家进行一场比赛。 您必须存储每个组合(Pi,Pj)获胜者的比赛结果。
我应该使用哪种数据结构进行有效的存储和结果搜索?
看一下关联容器,例如std :: map 。 这些使您可以存储具有对数查找时间的键值对。 您可以考虑一个类似索引对的对象的映射,以便可以像这样搜索结果:
int result = myMap[PairLikeType(i,j)];
其中i
和j
是两个玩家的指数。
std::map
被实现为二进制搜索树,但周围也有基于哈希表的映射,例如C ++ 11的std :: unordered_map (至少在gcc上的tr1/unordered_map
可用)或boost::hash_map
。
您可以通过定义自己的索引对(或使用提供小于比较的std::pair<int,int>
)作为映射的键来实现此目标,并可以使用访问器方法将其包装在类中给定一对索引,可让您检查:
struct ResultMap {
int winnerID(int playerID1, int playerID2)
{
return m_map[std::make_pair(playerID1, playerID2)]; // or use map::find
// of you want to handle
// non-existent keys specially
}
private:
std::map<std::pair<int,int>, int> m_map;
};
您可以使用std::unordered_map
实现上述功能,但必须为std::pair<int,int>
提供自己的哈希函数。
我将使用具有聪明功能的一维数组来计算索引。
我将数组构造为数据包数组:
0
1 0
2 0 1
3 0 1 2
4 0 1 2 3
//and so on
第一列对应于i
播放器。 Raw对应于可以与i一起玩的j
玩家
数组在内存中的外观如下: ||0|0 1|1 0 1|1 0 0 1|
// 0,1-布尔结果
这是计算索引的函数。 (它会犯一些错误,例如您必须在某些索引上加1,但通常是正确的)
int index(int i, int j) // i = [0, 99], j = [0, 99]
{
assert(i != j);
if ( i < j) std::swap(i, j); //i should be maximum. i == j not considered
int num_oponents = i;
int pack_start_index = num_oponents * (num_oponents + 1) / 2; //sum of 1 + 2 + 3 + ... + num_oponents
int pack_internal_index = j;
return pack_start_index + pack_internal_index;
}
在这种情况下,除了需要的数据(4950项)外,没有其他任何存储
此解决方案的想法类似于2d数组,但不存储重复项和具有自身结果的self。
您是否考虑过二维数组? 如果您只需要存储结果,那么我认为这将是最佳选择。
采取100x100的阵列。
将获胜者存储在每个位置
p1 p2 p3
p1 0 p2 p1
p2 p2 0 p3
p3 p1 p3 0
空间复杂度O(n ^ 2)
存储和查询O(1)的时间复杂度
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.