加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Boost multi_index:检索非唯一键的唯一值

发布时间:2020-12-16 06:55:45 所属栏目:百科 来源:网络整理
导读:我有一个boost :: multi_index_container,其元素是这样的结构: struct Elem { A a; B b; C c;}; 主键(在数据库意义上)是a和b的composite_key.其他 存在用于执行各种类型的查询的密钥. 我现在需要检索一组c的所有不同值.这些值是 通过各种方式不是唯一的,但
我有一个boost :: multi_index_container,其元素是这样的结构:

struct Elem {
    A a;
    B b;
    C c;
};

主键(在数据库意义上)是a和b的composite_key.其他
存在用于执行各种类型的查询的密钥.

我现在需要检索一组c的所有不同值.这些值是
通过各种方式不是唯一的,但迭代所有条目(尽管有序),
或者使用std :: unique似乎是一种浪费,考虑到这一点
预期c的不同值的数量<<<比总数
条目数(例如,10到1000).

我错过了一种更有效地获得此结果的简单方法吗?

解决方法

我搜索了Boost.MultiIndex文档,似乎无法找到一种方法来做你想要的.我很想知道它是否可行.

也许你能做的最好的就是维护一个std :: map< C,size_t> (或哈希映射)与multi_index_container一起使用并保持它们“同步”.

该映射将C值与其出现次数(频率)相关联.它本质上是C值的直方图.每次将elem添加到multi_index_container时,都会增加直方图中的相应频率.从multi_index_counter中删除Elem时,会减小直方图中的相应频率.当频率达到零时,您从直方图中删除该条目.

要检索一组不同的C值,只需遍历< key,value>即可.在直方图中配对并查看每对的关键部分.如果你使用了std :: map,那么不同的C值将被排序.

如果您要仅检查一次(或很少)不同C值的集合,那么我上面描述的方法可能有点过分.更简单的方法是将所有C值插入到std :: set< C>中.然后遍历该集合以检索不同的C值.

你说过,不同C的集合比C的总数要小得多. std :: set< C>因此,方法应该比将C复制到std :: vector,排序向量,然后运行std :: unique浪费更少的空间.

让我们比较复制到集合的时间复杂度与复制到向量,排序,然后运行唯一.令N为C值的总数,并且令M为不同C值的数量.通过我的计算,设定的方法应该具有O(N * log(M))的时间复杂度.由于M很小并且随着N的增加不会增长很多,因此复杂性有效地变为O(N).另一方面,排序唯一技术应该具有O(N * log(N))的时间复杂度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读