面试题总结15 自己构建一个哈希表



不使用hash库函数可以使用其他如链表类的函数来构建一个哈希表,《stl源码剖析》中讲到hashtable是如何构建的,大致思路如下:

采用开链的方法使表格的负载系数小于1。

哈希散射来将大数映射为小数,索引为k = X%TableSize,tableSize需要一个质数,stl中自带了28个质数,可以调用。

stl中采用桶子和链表的方式,整个桶子就是一张简单的哈希表,整个桶子可以用一个数组表示,数组中的元素其实是一个链表的节点,保存键值和指针,指向key值为桶子内键值的链表。

注意下面几点:

(1)哈希表要求的查找时间是O(N),在合理假设下,平均时间为O(1)。

(2)如果直接将键值作为桶子位置存放,当数据量较少时会造成空间的大量浪费,应该对一个hashfunction进行缩小,同时key值如果不一定按序存放,这样会浪费一定的查找时间,这里要寻求一个时间与空间的平衡,就是动态数组大小来平衡。

(3)整个桶子用vector来表示,因为可以动态扩展,初始化时先赋予一个vector的大小,可以为最小的一个质数,当插入时,每次扩展为大于vector长度的最小质数。

(4)当vector动态扩展时,此时哈希函数的值就改变了,需要对原来的桶子进行重新配置,新桶子的创建中不需要拷贝链表,只要将每个桶子中的指针指向原来的链表即可。

(5)当插入(key,value)时,首先要使用哈希函数检测key位于哪个桶子,如果没有查找到桶子,则在桶子表后面插入一个新的桶子,里面保存key值和一个含有一个元素的链表结点,如果检测到key值已经存在某个桶子中,则直接在后面的链表中插入一个新结点。

(6)当输入key值得到value值时,只需在size中找到key值的位置,然后遍历链表,如果key单一时不需要链表结构直接在桶子中保存value即可。

(7)得到键值总数,也就是桶子的个数,直接返回vector的大小,其实有点问题,这桶子的大小其实有部分是没有存放数据的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值