【C++标准库-体系结构与内核分析】hashtable深度探索

1.哈希表的运作方式

没有很多数学在里面,很多经验值在里面.

2的32次方 = 4294967296

假设有2的32次方个对象,每个对象有T个字节,当空间足够的时候,可以存下,但是2的32次方就4个G了,
但怎么能保证有那么大的内存呢?

世界上没有那么多理想的状态.
我们可能也没有那么多元素,可能也没有那么多的变化,通常也不会有.



处理哈希碰撞,使用了separate chaining这种方法.但是这个还是会有问题.
篮子(筒子),什么时候过长了呢?没有一个定论.
这里大家采用的共同的约定是与篮子的个数作比较,如果哈希表中的元素的个数大于篮子的个数,
那么我们可以认为它是危险的,需要扩容,重新做哈希,一般来说篮子的个数是素数,一开始也不
一定要是53,但是GNUC中一开始使用的就是53个.当需要扩充的时候就选择53倍数附近的素数,
53篮子会扩充成97个.


就像vector的成长是痛苦的(要重新找一块内存重新放元素),rehash也是痛苦的,不但篮子要增加,所
有的元素也得重新算一遍,看看落在哪个篮子上.

为了节省时间,GNUC提供了篮子的增长数字,53->97->193->389->769...




2.容器 

(1)key
(2)value
(3)hashfunc
通过hashfunc计算出来的一个编号hashcode,就是我们用来取余的那个数字.
所以hashfunc的作用是帮助我们计算出hashcode.比如说原始的key是"yyyyyyyyy",
通过这个hashfunc我们可以得到1这个hashcode,这样理解对吗?
(4)ExtractKey,需要告诉它如何从这一包东西里拿出我想要的那个,这是一个function.
(5)EqualKey,需要告诉它什么叫做key相等,这个也是一个function,比如一个key是一个石头的话,
            你需要告诉它石头怎么比大小.
(6)Alloc=alloc

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值