发布时间:2025-01-28 12:54:50 点击量:
HASH GAME - Online Skill Game GET 300
免费在线 散列(HASH)查找 1 哈希表的概念 一般的线性表,树中,记录在结构中的相对位置是随机的,即 和记录的关键字之间不存在确定的关系,因此,在结构中查找 记录时需进行一系列和关键字的比较。这一类查找方法建立在 “比较“的基础上,查找的效率依赖于查找过程中所进行的比较 次数。 理想的情况是能直接找到需要的记录,因此必须在记录的存储 位置和它的关键字之间建立一个确定的对应关系H,使每个关键 字和结构中一个唯一的存储位置相对应 。 例:以学生学号为关键字的成绩表,1号学生的记录位置在 第一条,10号学生的记录位置在第10条... 86 王二 3 95 李四 2 100 张三 1 成绩 姓名 学号 如果我们以学生姓名为关键字,如何建立查找表,使得根据姓名 可以直接找到相应记录呢? 以编号作关键字, 构造哈希函数:H(key)=key H(1)=1 H(2)=2 … 13 12 11 10 9 8 7 6 5 4 3 2 1 … m l k j i h g f e d c b a 最小值可能为2 最大值可能为78 可放77个学生 ... 26 42 72 33 46 24 用所有首字母编号值相加求和 ... cw lqm wxy wj lhy ll 姓名中各字拼音首字母 ... 陈伟 李秋梅 吴小艳 吴军 刘宏英 刘丽 ? 用上述得到的数值作为对应记录在表中的位置,得到右表: ... 78 ? ... ... ? 吴小艳 72 ? ... ... ? 刘宏英 46 ? ... ... ? 李秋梅 42 ? ... ... ? 吴军 33 ? ... ... ? 陈伟 26 ? ... 25 95 82 刘丽 24 ? ... ... ? ... 2 成绩二... 成绩一 哈希表 问:如何查找一个叫“李秋梅”的学生的成绩? 李秋梅——lqm =12+17+13=42 问:若叫“刘丽”、“刘兰”? 刘丽、刘兰——l l =12+12=24 产生冲突现象:对不同的关键字可能得到同一哈希地址。 查找思想:根据关键字的值,不经过比较,利用某个函数直接计算出元素所在的位置。 哈希函数——在记录的关键字与记录的存储地址之间建立的一种对应关系.根据关键字而直接计算出元素所在位置的函数, 常用H表示。 哈希表——哈希表是一种存储结构,是能用散列技术进行查找的表,也叫散列存储。是通过哈希函数和解决冲突的办法把键值存放在哈希表中。主要目标是提高查找效率,即缩短查表和填表的时间 哈希查找——又叫散列查找,利用哈希函数进行查找的过程. 冲突 ----两个不同的关键字K1和K2计算出相同的存储位置的现象称为冲突, K1和K2互为同义词。 2 哈希表的构造方法 直接定址法 例如:有一个从1到100岁的人口数字统计表,其中,年龄作 为关键字,哈希函数取关键字自身。 ? ... ... ... ... ... 1050 ... 2000 3000 人数 ... ... 27 26 25 ... 2 1 年龄 100 ... 27 26 25 ... 02 01 地址 什么是好的哈希函数? 均匀的; 计算简单 取关键字或关键字的某个线性函数值作为哈希地址 H(key)=key 或 H(key)=a*key+b 例如:有一个统计解放后出生的人口统计表,关键字是年份。 哈希函数取关键字加一个常数: H(key)=key+(-1948) ? ... ... ... ... ... ... ... ... ... 人数 ... ... 1975 1974 1973 ... 1950 1949 年份 ... ... 27 26 25 ... 02 01 地址 特点:由直接定址所得地址集合和关键字集合的大小相同,因 此对于不同的关键字不会发生冲突,但实际中能使用这种哈希 函数的情况很少。 直接查找表 数字分析法 有学生的生日数据如下: 年. 月. 日 85. 10. 0385. 11. 2386. 03. 02 86. 07. 12 85. 04. 21 86. 02. 15... 分析:第一位,第二位,第三位重复的 性大,取这三位造成冲突的机会增加, 所以尽量不取前三位。后三位的随机性 比较大,取后三位作为哈希地址比较好。 都是8 不是5就是6 不是0就是1 特点:假设关键字是以r为基的数,并且 哈希表中可能出现的关键字都是事先知道 的,则可以去取键字的若干数位组成哈希 地址。 平方取中法 取关键字平方后的中间几位为哈希地址。 如:K=308,K2=94864,H(K)=486 折叠法 将关键字分割成位数相同的几部分(最后一部分的位数可以不 同),然后取这几部分的叠加和(舍去进位)作为哈希地址, 这方法称为折叠法 除留余数法 取关键字被不大于散列表表长m的数p除后所得的余数为哈希函数。 即 H(K)=K MOD p (p?m)老版p157 3.6 新版p232 3.4 例如:每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,当馆藏书种类不到10,000时,可采用此法构造一个四位数的哈希函数。如果一本书的编号为0-442-20586-4,则 (b)间界叠加 (a)移位叠加 ? ? ? ? H(key)=6092 H(key)=0088 6092 10088 ----------- ----------- 04 +) 04 +) 0224 4220 5864 5864 如果两个同学分别叫 刘丽、刘兰,当加入刘兰时,地址24发生了冲突,我们可以以某种规律使用其它的存储位置,如果选择的一个其它位置仍有冲突,则再选下一个,直到找到没有冲突的位置。选择其它位置的方法有 ... 78 ? ... ... ? 吴小艳 72 ? ... ... ? 刘宏英 46 ? ... ... ? 李秋梅 42 ? ... ... ? 吴军 33 ? ... ... ? 陈伟 26 ? ... 25 95 82 刘丽 24 ? ... ... ? ... 3 成绩二... 成绩一 3 ?处理冲突的方法 开放地址法 Hi=(H(key) +di) MOD m ,i=1,2,...,k ( k=m-1) 其中m为表长,di为增量序列 如果di值可能为1,2,3,...m-1,称线性探测再散列。 如果di取值可能为1,-1,22,-22,32,-32,...k2, -k2 (k=m/2)称二次 探测再散列 如果di取值可能为伪随机数列。称伪随机探测再散列。 例:在长度为11的哈希表中已填有关键字分别为17,60,29的记录,现有第四个记录,其关键字为38,由哈希函数得到地址为5,若用线性探测再散列,如下: (a)插入前 ? 38 29 17 60 ? 10 9 8 7 6 5 4 3 2 1 0 (b)线 ? 29 17 60 38 ? 10 9 8 7 6 5 4 3 2 1 0 (c) 二次探测再散列 ? 29 17 60 38 ? 10 9 8 7 6 5 4 3 2 1 0 (d)伪随机探测再散列 伪随机数列为9,5,3,8,1... 例3.2(老p117/新p162):将关键字序列(09,31,26,19,01,13,02,11,27,16,05,21) 依次填入n=12的线性hash表中。设hash码为 i=INT(key/3)+1冲突处理为线性探测再散列。 线性hash表的缺点: “二次聚集”,两个哈希地址不同的记录争夺同一个后继哈希 地址的现象。 思考:如果要在表中查找13、16、23 该如何处理? 线性哈希表不能填满,否则在哈希表中查找一个不存在的关键 字是会出现无穷循环。 链地址法 老p120/新p177 链地址法解决冲突的方法:把具有相同散列地址的键值存放在同一个链表中,称为同义词链表。 [例] 一组关键字为(21, 14, 19,58, 65, 32,72) 哈希函数 H(K)=K MOD 11 ∧ ∧ ∧ ∧ ∧ ∧ ∧ 0 1 2 3 4 5 6 7 8 9 10 32 65 ∧ 21 ∧ 19 ∧ 72 58 ∧ 14 *