如何获得特定值的计数std::map的O(log(N))复杂度 我在思考图的特定值元素的计数问题,以及如何实现C++中的O(log(n))复杂度。只有当它按我猜的值排序时才可能,但是它不会按键排序,并且get-from映射将是O(N)
在第一个版本中,我使用如何获得特定值的计数std::map的O(log(N))复杂度 我在思考图的特定值元素的计数问题,以及如何实现C++中的O(log(n))复杂度。只有当它按我猜的值排序时才可能,但是它不会按键排序,并且get-from映射将是O(N),c++,algorithm,C++,Algorithm,在第一个版本中,我使用std::count\u if。这是我的密码: std::count_if( std::begin(_map), std::end(_map), [&val]( const std::pair<const std::string, std::string> &p ) { return p.second == val; } ); std::count\u if(std::begin(\u map),std
std::count\u if
。这是我的密码:
std::count_if( std::begin(_map), std::end(_map),
[&val]( const std::pair<const std::string, std::string> &p )
{
return p.second == val;
} );
std::count\u if(std::begin(\u map),std::end(\u map),
[&val](常数标准::对和对)
{
返回p.second==val;
} );
它具有O(N)的复杂性。你知道还有其他容器对解决这个问题有用吗?我在考虑树形图,但可能会有类似的按键排序的问题。您可以维护两个映射,这样项目将同时按键和值进行索引。您需要一个允许重复值的映射。您可以维护两个映射,这样项目将同时按键和值进行索引。你需要a来允许重复的值。根据你的容器的其他典型用法,你可以考虑使用<代码> STD::vector < /代码>而不是映射。你必须自己做排序,但是你可以对键或值进行排序,然后进行二进制搜索。根据你可以考虑的容器的其他典型用法,使用<代码> STD::vector < /COD>而不是映射。您必须自己进行排序,但您可以对键或值进行排序,然后进行二进制搜索。Boost允许按键或值进行查找
auto range = map.right.equal_range(val);
std::distance(range.first, range.second);
Boost允许通过键或值进行查找
auto range = map.right.equal_range(val);
std::distance(range.first, range.second);
我也在考虑这个问题,但它会使内存使用量翻倍,这将是大地图的问题。我正在考虑这个解决方案,因为我也在考虑这个问题,但它会使内存使用率翻倍,这将是大地图的问题。我正在考虑将此解决方案作为一种折衷方案谢谢,您建议如何排序以满足时间复杂度限制?@PPM根据值排序是
O(N logN)
,尽管您只需要排序一次,然后可以使用O(log N)
二进制搜索(std::binary\u search
)谢谢,您建议如何排序以满足时间复杂度限制?@PPM根据值排序是O(N logN)
尽管您只需要排序一次,然后就可以使用O(logN)
二进制搜索(std::binary_search
)哇,这看起来真的很好,我认为这给了我迄今为止的大部分功能哇,这看起来真的很好,我认为这给了我目前为止最强大的能力