联系hashgameCONTACT hashgame
地址:广东省广州市
手机:13988889999
电话:020-88889999
邮箱:admin@qq.com
查看更多
Rhashgamehashgame
你的位置: 首页 > hashgame

HASH GAME - Online Skill Game ET 300java数据结构和算法中哈希表知识点详解

发布时间:2026-03-26 14:06:58  点击量:

  HASH GAME - Online Skill Game GET 300ok,在这里哈希表可以看作是校长手上的那个表(其实就是一个数组),我们根据我们要存的信息生成一个表中的位置的号码(在这里这个号码就是数组的下标),根据这个号码我们就知道该数据存在数组的哪个位置,然后将数据保存进去就可以了;假如有个大小为20的数组,我要存“aaa”,我们可以想个很厉害的办法将这个字符串变成一个比较小的数字,比如是10,那么就把这个字符串存到数组的第10个位置,这样做的好处就是下次如果要从哈希表中查询(或删除)“aaa”这个字符串时,只需要将“aaa”字符串算出那个号码10,然后直接去数组中第10个位置找一个看有没有这个字符串,是不是很简单啊!

  这里我们可以假设一个字符串t数组的大小为30,String[] str = new String[30]; 要存“cats”这个单词,最容易想到的办法就是用ASCII码,但是由于ASCII码太多了不好记,于是我们可以自己设置一套规则,我就假设a到z分别对应1到26,外加空格对应0,现在一套最简陋的规则就出来了,我那么“cats”这个单词:c = 3,a = 1,t = 20,s = 19,现在“cats”有两种办法变成数组的下标;

  这种方法的好处很明显,完美解决上述冲突,不需要用什么花里胡哨的操作;缺陷就是当链表太长了,我们要查询这个链表的最后面的数据,只能慢慢遍历这个链表,而我们知道,链表的优势是插入和删除,而对于查询这种操作是比较坑爹的,而我们前面用了红黑树这样的结构来完美解决链表的缺点;最后,我们就差不多想到了一个比较实用的方法:数组的每个位置都存放一个链表,当链表的节点很少的时候,那就用链表吧!但是当链表慢慢的变长,当节点数目到达一个界限的时候,我们就把这个链表变成一个红黑树,比较完美的方案,这也叫做------链地址法

  看名字线性就知道是从前往后寻找空的位置,举个很简单的例子,当一个字符串经过运算对应于数组下标为52,然而此时52这个位置上已经有了数据,那么就尝试放到53的位置,假如53的位置也已经放了数据,那就放到54位置,就这样一直往后慢慢找,直到找到一个空的位置就把数据放进去;而此时找的次数越多,假如已经找到56的位置,那么从53到56这么多位置叫做填充序列,当填充序列很长的时候,我们就称为原始聚集,下图所示:

  二次探测也有点问题,会导致二次聚集,那什么又是二次聚集呢?其实跟原始聚集差不多吧!比如184,302,420,544这几个整数都要放到哈希表中,而且这几个数经过哈希算法算出来的数组下标都为7,302需要以1步长进行探测,而420要先以1为步长,然后以4步长进行探测,而544要先以1为步长,然后以4为步长,最后以16步长进行探测,假如后面还有数据对应的数组下标为7,那么还是要重复这个步骤,而且是越来越长....这也是一种聚集,个人感觉从某种意义来说和原始聚集性质差不多吧!

  顺便一提:再哈希法使用的前提必须保证数组的容量为一个质数,因为这样才能使得所有位置都被探测到;可以试试假如数组容量为15,步长为5,一个数据经过计算得到额数组下标为0,那么探测的位置应该为:(0+5)%15 = 5,、(5+5)%15 = 10,(10+5)%15 = 0,只会探测0、5、10这三个位置;但是如果数组容量为质数13,步长为5,第一个数据下标还是0,那么探测位置为:(0+5)%13 = 5,、(5+5)%13 = 10,(10+5)%13 = 2、(2+5)%13 = 7,(7+5)%13 = 12,(12+5)%13 = 4,(4+5)%13 = 9等等,可以看到每次探测的位置都不一样,可以探测到数组中所有位置只要有空的就把数据当进去即可;

  哈希表其实还可以用在外部存储中,也就是硬盘中,有兴趣的可以看看,不过我感觉到这里就差不多了!其实哈希表的内容没多少吧,最主要的就是哈希函数的选取,选择一个好的哈希函数可以使得我们的哈希表的效率更高!然后就是数组中存数据的方式,可以直接在数组中存数据,也可以在数组中存节点的引用,其实吧,知不知道二维数组?在我们这个数组中每个位置存的是另外一个数组的引用,这样其实也行,由于扩展起来很困难,使用链表比使用二维数组好。。。

【返回列表页】

顶部

地址:广东省广州市  电话:020-88889999 手机:13988889999
Copyright © 2018-2025 哈希游戏(hash game)官方网站 版权所有 非商用版本 ICP备案编: