MyHash的实现

首先制作一个hash表是有很多种方式 只要是根据关键码值(Key value)而直接进行访问的数据结构。也就是说通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
映射函数的几种类型
1. 直接寻址法:
2. 数字分析法:
3. 平方取中法:
4. 折叠法:
5. 随机数法:
6. 除留余数法:
这里要说明的是映射函数不是唯一的,你完全可以折叠法之后再除留取余,关键是要使每个value最后计算得到的数组下标
能够减少冲突 使得元素的位置尽量分布均匀的那种即可

当然每一种映射都会存在冲突 对于冲突 处理冲突的办法有
1是线性探测的开型寻址
2是再散列的开型寻址
3是链式散列

最后通过不同装载因子的情况下计算成功查找时平均检验的表元素的个数 得出链式散列的个数在不同的装载因子下都是最少的如附件图:

所以我们在这里选取链式散列来解决冲突
采用HashMap中已经定义好的映射函数经由hashcode()得到hashcode值 再调用hash()函数得到hash值最后与数组长度-1取&得到数组下标

然后还要确定的元素有初始数组大小 装载因子 (HashMap中已经定义好的分别为16的0.75)
而要明确的是α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小
而容量必须是2的幂 可以保证length-1的二进制位上全是1 最后取&之后得到的数 比较均衡 减少冲突 节约数组空间


然后针对我们要完成的这个myhash表的功能进行分析
我们所要完成的这个myhash是对两个数据进行操作分别为key/value 这里的key是比较关键的一个参数 我们所有的操作都要根据它来完成 而

value值只负责存放到myhash中。
这里要完成的主要功能有

插入以key和value的值-------------------------put<object key,object vlaue>
用key为关键字来查询value的值-----------------public object get(object key)
删除key和value的值--------------------------public object remove(object key)
是否包含关键字key和value---------------public boolean containkey(object key)/(object value)

然后为完成功能必须要涉及的重要类有:
第一在put进去的时候数组的可能超过最大存储量(loadfactor*capcity) 这时需要resize(2*table.length)
第二仅仅扩容是不可以的,因为数组长度改变后,由hash值和length-1得到index会改变 所以放进去和取得的数组地址计算出来就有差异
所以在这里需要更新数组元素 updata(chatinTable[] newTable)

最后提一点完成hash表最主要的代码
第一部分重要代码

int hash = (key == null) ? 0 : hash(key.hashCode());
int index = (hash == 0) ? 0 : indexFor(hash, table.length);
for (chainTable<K, V> c = table[index]; c != null; c = c.next) {
if (c.hash == hash || (key != null && key.equals(c.key))) {
····
}
}

不管是在插入 查询还是 删除中这段代码都是必须的 因为你必须要查到key所在的数组中的位置,put要考虑这个位置是否存在有key这个关键字 再考虑是替换 还是直接插入 查询是不仅要找到再数组中的位置 还要找到它再链表中的位置 删除亦是。

第二部分重要代码

for (int i = 0; i <oldTable.length; i++) {
chainTable<K, V> c = oldTable[i];
if (c != null) {
oldTable[i] = null;
do {
int index = indexFor(c.hash, newCapacity);
chainTable<K, V> next = c.next;// 将c后面的节点保存
c.next = newTable[index];// 将数组整条链挂在c的后面
newTable[index] = c;// 将以c节点为头得链放在数组中
c = next;// 将c后面的节点赋给c
} while (c != null);
}
}


这部分代码是将旧表中的节点移到新表中 涉及到数据结构的内容

思考:数组下标相同的链表节点 的hash值肯定是一致的 所以在新数组中肯定也是在同一位置 所以是否可以降整条链直接作为数组元素插入而不

需要一个节点一个节点的链上去
有待验证


最后测试
结果:进行5次测试 前两次和系统的HashMap速度一致 后两次我的略快2秒 最后一次系统快1秒
原因有待考察
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值