You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于std::unordered_map构造参数及(max_code*11)/10取值的技术疑问

LZW压缩代码中std::unordered_map构造参数的疑问解答

1. 构造参数的作用

std::unordered_map<std::string, unsigned int> codes( (max_code * 11)/10 );里的unsigned int参数,是给哈希表指定初始桶数量。

unordered_map基于哈希表实现存储,桶是哈希表的核心存储单元。桶数越多,不同元素哈希到同一桶的概率越低(哈希冲突越少),插入、查找操作的速度就越快;但桶数过多会造成内存浪费。这个参数的作用就是提前设定哈希表的初始桶数,避免默认桶数过小导致频繁哈希冲突。

2. 为什么用(max_code * 11)/10作为初始桶数

先看代码逻辑:max_code是这个map能容纳的最大条目数(默认32767),一开始会插入256个单字符条目,之后最多再插入max_code - 256个新条目,总条目数顶格就是max_code。

(max_code *11)/10的本质是给最大条目数加了10%的冗余量,这么做的核心原因是:

  • unordered_map默认的最大负载因子是1.0,当元素总数超过「桶数 × 负载因子」时,哈希表会自动触发扩容(重新计算所有元素的哈希值,分配到更多桶中),这个过程会拖慢压缩速度。
  • 提前设置比最大条目数多10%的初始桶数,能保证即使插入到max_code个条目,元素总数也不会超过桶数×1.0,从而避免自动扩容的性能开销,让压缩过程更高效。
  • 用(max_code *11)/10这种整数运算,是为了绕开浮点计算,直接得到一个比max_code大10%的整数(比如32767×11÷10=36043),符合哈希表桶数必须为整数的要求。

内容的提问来源于stack exchange,提问作者mandybuot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:55:21