有100名玩家p1,p2,...... p100,每位玩家与其他玩家进行比赛。您必须存储每个组合(Pi,Pj)的赢家的匹配结果。
我应该使用什么数据结构来高效存储和搜索结果?
答案 0 :(得分:3)
查看关联容器,例如std::map。这些允许您存储键值对,具有对数查找时间。您可以考虑一个类似索引对象的映射,以便您可以像这样搜索结果:
int result = myMap[PairLikeType(i,j)];
其中i
和j
是两个玩家的指数。
std::map
是作为二叉搜索树实现的,但也有基于哈希表的映射,例如C ++ 11的std::unordered_map(在tr1/unordered_map
中可用,至少在gcc上) ),或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>
提供自己的哈希函数。
答案 1 :(得分:1)
我会使用具有聪明功能的一维数组来计算索引。
我会将数组构造为数据包数组:
0
1 0
2 0 1
3 0 1 2
4 0 1 2 3
//and so on
第一列对应i
玩家。原始对应于j
玩家可以玩i
以下是数组在内存中的外观:
||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数组,但没有存储重复和自我结果。
答案 2 :(得分:0)
您是否考虑过二维数组?如果你只需要存储结果,那么我认为这将是最好的选择。
答案 3 :(得分:0)
采用100x100阵列。
将获胜者存放在每个位置
p1 p2 p3
p1 0 p2 p1
p2 p2 0 p3
p3 p1 p3 0
空间复杂度O(n ^ 2)
存储和查询O(1)
的时间复杂度