C++中字典比数组更占内存的原因?是否可以用数组实现字典功能
c语言吧
全部回复
仅看楼主
level 8
jolinbuxia 楼主
C++中,
字典:unordered_map<int, int> c; c.reserve(100000000);
数组:int *c = new unsigned int[100000000];
为什么字典占用空间是数组的好几倍?这个字典底层逻辑好像是链表,所以链表到底多存了什么东西?
字典的优势是检索快,但空间比数组占用大得多,
那能否用数组实现字典功能?将存储内容经过哈希函数映射为数组索引,字典中链表中经过哈希发生冲突碰撞,直接存在next中,数组中发生冲突,则存在索引+1处,或者再哈希?是否可行?
2025年03月20日 14点03分 1
level 13
链表节点起码一个data, 一个next指针,数组元素就单纯一个data, 链表当然用空间多
2025年03月20日 14点03分 2
那字典用链表的优势是啥?又不是每个元素经过哈希都会发生冲突,太浪费空间了
2025年03月20日 14点03分
level 13
你在说的是开放寻址哈希表,并且是开放寻址中最直接的线性探测,效率也相对低,和链表哈希是不一样的东西。
2025年03月20日 14点03分 3
level 13
unordered_map的reserve预留的是存储元素的数量。虽然标准库哈希表的最大负载因子通常是1,预留一亿个元素的位置并不意味着预留一亿个桶,因为桶的数量通常是质数或2的幂,所以实际比一亿要大一些。况且桶可以理解为链表,单个桶占用的内存通常也比int大,unordered_map比int数组更占内存很合理。如果采用开放寻址法的话最大负载因子会更低,譬如说0.7,因此reserve相同值后也会比int数组更占内存。
2025年03月20日 14点03分 6
1