当前位置: 首页 > 知识库问答 >
问题:

c有效的双向随机存取数据结构

宰父劲
2023-03-14

我有两个集合A和B的元素a和b。现在它们彼此相关(0...1: n基数),所以每个a在B中最多有一个伙伴,每个b可以与A中的项目有几个(至少一个)关联。A是一组整数对,B是整数。

有没有有效的方法来存储这种“双向”地图?一种简单的方法是使用两种地图:

map<pair<unsigned int, unsigned int>, unsigned int> AtoB
map<unsigned int, vector<pair<unsigned int, unsigned int> > > BtoA

但也许有更好的方法来更有效地处理这个问题。

谢谢你的帮助

共有3个答案

井嘉胜
2023-03-14

Map和Multimap的效率为O(log n),因此,我认为这是存储数据的最佳方式。我建议用

map<pair<unsigned int, unsigned int>, unsigned int> AtoB
multimap<pair<unsigned int, unsigned int>, unsigned int> BtoA
龙凯
2023-03-14

如何提升::bimap?http://www.boost.org/doc/libs/1_47_0/libs/bimap/doc/html/index.html我想是给你的。

章安易
2023-03-14

Boost包含两个库来处理这个问题:Boost。Bimap和Boost。多索引。前者专门针对双射(“双向”)映射的问题,而第二个更一般,实现了类似于具有任意索引的内存数据库的功能

考虑到你的无符号int键不能唯一地映射到你的对,我认为多索引更合适。我已经很长时间没有使用这个库了,但是看看教程,你需要

struct YourData {
     unsigned key;
     std::pair<unsigned, unsigned> value;
};

typedef multi_index_container<
    YourData,
    indexed_by<
        ordered_non_unique<member<YourData, unsigned, &YourData::key> >,
        ordered_unique<member<YourData, std::pair<unsigned, unsigned>,
                              &YourData::value> >
    >
> YourContainer;

如果不想使用Boost,那么至少可以通过替换

map<unsigned int, vector<pair<unsigned int, unsigned int> > >

std::多重映射

 类似资料:
  • 我需要一个数据结构,将能够为给定的int提供前面和后面的邻居,这是结构的一部分。 null LinkedHashSet:查找项目非常快,顺序为O(1),检索下一个邻居非常快。没有明显的方法可以在不对集合进行反向排序的情况下获得上一个邻居。仅限装箱整数对象。 int[]:非常容易存储,因为不需要装箱,获取上一个和下一个邻居非常快,但由于索引未知,需要数组遍历,所以对项的检索是O(n),这是不可接受的

  • 我在谷歌上搜索过,找不到任何可以在O(1)时间内存储和读取双向数据的DS。例如书籍和作家。有了书的名字,就必须找到作者。有了作者的名字,就必须找到书。 在数据库中,这些关系(如联接表)是如何存储的? 提前谢谢。

  • 本文向大家介绍C#产生随机双,包括了C#产生随机双的使用技巧和注意事项,需要的朋友参考一下 示例 生成介于0和1.0之间的随机数。(不包括1.0)            

  • 本文向大家介绍C++常见获取随机数的方法小结,包括了C++常见获取随机数的方法小结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++常见获取随机数的方法。分享给大家供大家参考,具体如下: 方法一: 使用 rand 函数可以获取,如下。 随机数大小是在0到RAND_MAX,值为2147483647,它是在stdlib中定义的,如果我们希望在某个范围内,可以使用 % 结合 / 来实现。 但

  • 我目前正在研究普林斯顿算法第一部分的队列分配。其中一个任务是实现随机队列。这是一个关于使用不同数据结构的实现和权衡的问题。 问题: 随机化队列类似于堆栈或队列,只是从数据结构中的项中均匀随机地选择删除的项。创建实现以下API的通用数据类型: 这里的问题是实现de队列操作和迭代器,因为de队列删除并返回随机元素,迭代器以随机顺序迭代队列。 1.数组实现: 我考虑的主要实现是数组实现。除了随机性之外,

  • 洗牌算法 洗牌算法,顾名思义,就是只利用一次循环等概率的取到不同的元素(牌)。 如果元素存在于数组中,即可将每次 random 到的元素 与 最后一个元素进行交换,然后 count—,即可。 这相当于把这个元素删除,代码如下: #include <iostream> #include <ctime> using namespace std; const int maxn = 10; int a[m