在unordered_map的构造函数中,我们可以定义分配的桶计数。我曾想过我可以用它来减少重哈希时间。然而,在某些情况下,这也会影响性能。重散列发生在插入时
只有当新元素数大于
max_load_factor()*bucket_count()时才会重新散列。如果插入成功,则在节点句柄中保存时获得的元素的指针和引用无效,并且在提取该元素之前获得的指针和引用变得有效。(自C++17以来)
上面的文档来自std::unordered_map。我想boost也是一样的?但是它的文档没有说明重散列的条件。
如果我将桶计数初始化为100,并且有一个包含所有100个元素的桶,那么在插入101元素之前不会发生重散列.如果我使用默认的桶计数,我假设它是<< 100,重新散列可能会发生得更早。
如果是,我们什么时候要初始化桶计数?
发布于 2017-06-09 18:21:57
如果是,我们什么时候要初始化桶计数?
当分析显示有帮助的时候。
不能给出更具体的建议,因为这既取决于确切的数据,也取决于正在使用的散列函数。
通常情况下,如果默认值足够快,只需使用它。
发布于 2017-06-09 19:57:28
一个好的经验法则是,哈希表应该只有大约70%满(70%是负载因子)。这会导致一些碰撞,但不会太多。
如果提前知道表中的项目数是N,那么将桶数设置为((int)N/0.7)+1可能是一个很好的选择,因为这样就避免了重新散列的需要。如果您正在试验负载因子,则需要使用((int)N/load_factor)+1。
使表太大可能不会对速度产生太大影响:内存分配的成本并不很大程度上取决于您正在分配的内存数量,而且在一定大小以上,所有表对于随机访问的缓存性能都会很差。
https://stackoverflow.com/questions/44464407
复制相似问题