C++ STL标准库与泛型编程(六)哈希表、Unordered 容器

哈希表

避免碰撞 — 构造哈希函数、再散列函数法、哈希表加链表

  1. 虽然很好的处理了碰撞的问题,但是当单链表很长时,遍历链表的速度会很慢。 
  2. 当链表太长时(经验法则:当元素个数比 bucket <vector> 数还要多时),想办法将其打散 — 将 bucket 扩充大约两倍。选择53的倍数附近的素数 53 -> 97 -> 193........。(G2.9适用,其他的不一定。)
  3.  哈希表的成长过程:bucket 会增加、 所有的元素所在的 bucket 会重新计算一遍,会花费一定的时间。

  • HashFcn 由元素对象抽象出哈希码的函数
  • ExtraKey 如何从元素(可能是 pair 等)取出 key 值的函数
  • EqualKey 如何判断 key 相等的函数

哈希表本身的大小为20个字节:3个函数对象、1个 Vector、1个 unsigned int。

hashtable_node 为节点构成的单向链表(VC中为双向链表)。

迭代器必须实现智能的 ++ 等操作,在链表末端后重新定位回 bucket ,其中有两个指针,一个指向节点,一个指向哈希表本身。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值