`
小篮子java的家
  • 浏览: 31077 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

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秒 
原因有待考察
  • 大小: 9.6 KB
分享到:
评论

相关推荐

    MyHash64_1.4.7.exe

    MyHash64_1.4.7.exe是一个计算文件SHA1、MD5值的工具,可以对比两个文件的完整性

    MyHash-master.zip

    查看对比md5,sha1等

    MyHash_1.4_校验工具

    一款采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。这款小巧实用的工具,原生单执行文件,采用UPX压缩后体积才几百KB,支持MD5、SHA1、CRC32、SHA256、SHA512等算法;支持哈希值比较、支持多个文件...

    MyHash 1.4.7.0

    一款采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。单文件,整合32位和64位可执行程序。作者drag0n发布的最终版,验证文件的首选。 功能特点: 1、只支持常用的CRC32、MD5、SHA1、SHA256、SHA512...

    文件校验工具 MyHash v1.4.6.7z

    MyHash是一款由drag0n编写的校验工具,采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。这款小巧实用的工具,原生单执行文件,采用UPX压缩后体积才几百KB,支持MD5、SHA1、CRC32、SHA256、SHA512等...

    一个c++实现的哈希表类

    程序的具体实现如下:本程序是用模板类myhash来实现,包括protected和public属性成员。其中protected成员有*ht(自定义散列表指针)、*empty(bool类型指针,功能是将元素值空、m(散列表容量)、p(除留余数法的除数)...

    HashFiles(计算文件各种校验参数)1.10绿色版

    HashFiles是一款免费的实用程序,用来计算CRC32,MD5文件或多个文件的​​SHA256和SHA1哈希有用。你不会觉得很难使用的应用程序,它的用户界面是不言自明,需要的用户快来下载吧。 虽然有一个专门的按钮,你可以用...

    c#哈希算法的实现方法及思路

    有想过hash[“A1”] = ... 代码如下:static void Main(string[] args) { MyHash hash = new MyHash(); hash[“A1”] = DateTime.Now; hash[“A2”] = 1; Console.WriteLine(Convert.ToString(hash[“A1”])); 

    一个c++实现的哈希表类-C++文档类资源

    在程序中我们对关键字key应用散列函数H(key)来判断关键字key是否在散列表中,...程序的具体实现如下:本程序是用模板类myhash来实现,包括protected和public属性成员。其中protected成员有*ht(自定义散列表指针)、*e

    Hash、md5校验工具-哈希计算器

    Hash md5校验工具 是一款小巧好用的哈希计算器 Hash也是一款md5校验工具 Hash支持文件拖放 速度很快 可以计算文件的 MD5 SHA1 CRC32 的值 软件特色: 支持多个文件或文件夹拖放操作; 支持参数启动 参数为一个...

    java应用开发

    1.哈西表MyHash定义如下: Hashtable MyHash=new Hashtable(); 查看下列语句: MyHash.put(“ten”,new Integer(10)); MyHash.put(“ten”,”Hello”); System.out.print(MyHash.size()); 结果为( )。

    支持文件和文件夹的Hash计算工具

    多线程hash计算工具。安全可靠,电子数据提取固定必备。支持多线程MD5、SHA256、SHA512等多种hash计算,支持批量计算。

    一致性哈希

    * $servers[$this-&gt;myHash($key) % 2] 这样得到其中一台服务器的配置,利用这个配置完成分布式部署 * 在服务器数量不发生变化的情况下,普通hash分布可以很好的运作,当服务器的数量发生变化,问题就来了 * 试想...

    Digest-HMAC:HMAC for Perl

    $digest = hmac($data, $key, \&myhash); print hmac_hex($data, $key, \&myhash); # OO style use Digest::HMAC; $hmac = Digest::HMAC-&gt;new($key, "Digest::MyHash"); $hmac-&gt;add($data); $hmac-&gt;addfile&#40;*...

    wnmp(win+nginx+php+mysql)官方安装包

    - MyHash.exe - reMe.Md # 说明 所有文档均来自官网下载文件,内附MD5校验码(与官网一致)。某些包下载速度极慢(下载共用了5小时),为方便大家而上传的资料 #更新时间 2018-5-7(安装包均是 截止今日,官网发布的...

    js/jquery解析json和数组格式的方法详解

    语法: ECMAScript v3规定了数组直接量的语法,JavaScript 1.2和JScript 3.0实现了它。可以把—个用逗号分隔的表达式列表放在方括号中,创建并初始化—个数组。这些表达式的值将成为数组元素。例如: var a = [1, ...

    total commander

    2、精选实用工具:集成 Everything、MyHash、Notepad2、SwitchOFF 等工具,可实现文 件快速搜索、校验和计算、文本编辑、智能关机等功能; 3、拼音首字母定位:集成 QuickSearch eXtended 部分组件,实现中文...

    AngularJs返回前一页面时刷新一次前面页面的方法

    要求: 页面A进入到页面B,在页面B处理完后返回页面...以 ‘http://localhost/$location/21.1 $location.html#/foo?name=bunny#myhash’ 这个路径为例: 1. 获取当前完整的url路径: $location.absUrl(): // http://loca

    Go语言常见哈希函数的使用

    myhash.go /** * Created with IntelliJ IDEA. * User: liaojie * Date: 12-9-8 * Time: 下午3:53 * To change this template use File | Settings | File Templates. */ package main import ( crypto/md5 ...

Global site tag (gtag.js) - Google Analytics