我想实现一个性能优化的unordered_map
变体,它可以分几个阶段运行:
std::map
std::map
转换为std::unordered_map
为了尽可能快地完成“工作”阶段,我想选择一个散列函数,该函数对于给定的一组密钥没有冲突(在初始化阶段收集)。
我想衡量一下我可以从这个技巧中获得多少性能提升。所以这将是一个实验,可能会进入生产代码。
标准库是否具有此实现的功能(例如,查找给定unordered_map
有多少冲突;或更改散列函数)?或者我应该自己实现?
答案 0 :(得分:6)
以下是“碰撞管理”API:
size_type bucket_count() const;
size_type max_bucket_count() const;
size_type bucket_size(size_type n) const;
size_type bucket(const key_type& k) const;
local_iterator begin(size_type n);
local_iterator end(size_type n);
const_local_iterator begin(size_type n) const;
const_local_iterator end(size_type n) const;
const_local_iterator cbegin(size_type n) const;
const_local_iterator cend(size_type n) const;
简而言之,bucket_size(n)
为您提供第n个桶的碰撞次数。您可以使用密钥查找存储桶,并且可以使用local_iterator迭代存储桶。
为了更改散列函数,我将分配/构造一个新的容器,从旧的散列函数到新的。
答案 1 :(得分:2)
如果您有很多读取和少写,您可以使用矢量作为地图。这很常见,因为lower_bound
比map
更有效,并且从内存中使用更少的空间:
bool your_less_function( const your_type &a, const your_type &b )
{
// based on keys
return ( a < b );
}
...
std::vector<your_type> ordered-vector;
添加值时:
...
// First 100 values
ordered-vector.push_back(value)
...
// Finally. The vector must be sorted before read.
std::sort( ordered-vector.begin(), ordered-vector.end(), your_less_function );
询问数据时:
std::vector<your_type>::iterator iter = std::lower_bound( ordered-vector.begin(), ordered-vector.end(), value, your_less_function );
if ( ( iter == ordered-vector.end() ) || your_less_function( *iter, value ) )
// you did not find the value
else
// iter contains the value
不幸的是它是有序的,但非常快。
答案 2 :(得分:0)
碰撞次数取决于铲斗的数量。根据{{3}},使用rehash函数将桶数设置为100是否有用?