繁体   English   中英

用于存储和搜索比赛结果的数据结构

[英]Data structure for storing and searching the result of tournament

有100位玩家p1,p2,...... ... p100,每位玩家与其他每位玩家进行一场比赛。 您必须存储每个组合(Pi,Pj)获胜者的比赛结果。

我应该使用哪种数据结构进行有效的存储和结果搜索?

看一下关联容器,例如std :: map 这些使您可以存储具有对数查找时间的键值对。 您可以考虑一个类似索引对的对象的映射,以便可以像这样搜索结果:

int result = myMap[PairLikeType(i,j)];

其中ij是两个玩家的指数。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM