哈希表
避免碰撞 — 构造哈希函数、再散列函数法、哈希表加链表
- 虽然很好的处理了碰撞的问题,但是当单链表很长时,遍历链表的速度会很慢。
- 当链表太长时(经验法则:当元素个数比 bucket <vector> 数还要多时),想办法将其打散 — 将 bucket 扩充大约两倍。选择53的倍数附近的素数 53 -> 97 -> 193........。(G2.9适用,其他的不一定。)
- 哈希表的成长过程:bucket 会增加、 所有的元素所在的 bucket 会重新计算一遍,会花费一定的时间。
- HashFcn 由元素对象抽象出哈希码的函数
- ExtraKey 如何从元素(可能是 pair 等)取出 key 值的函数
- EqualKey 如何判断 key 相等的函数
哈希表本身的大小为20个字节:3个函数对象、1个 Vector、1个 unsigned int。
hashtable_node 为节点构成的单向链表(VC中为双向链表)。
迭代器必须实现智能的 ++ 等操作,在链表末端后重新定位回 bucket ,其中有两个指针,一个指向节点,一个指向哈希表本身。