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

HASH GAME - Online Skill Game ET 300第八章-哈希表pdf

发布时间:2025-01-24 10:51:36  点击量:

  HASH GAME - Online Skill Game GET 300

HASH GAME - Online Skill Game GET 300第八章-哈希表pdf

  1、查找 第八章 查找 8.1 查找的基本概念 8.2 基于线.3 基于树的排序 8.3.1 二叉排序树 8.3.2 平衡二叉排序树 8.3.3 B树 8.4 哈希表 哈希表 8.4 计算式查找法哈希法计算式查找法哈希法 哈希法哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表哈希表。哈希法的基本思想哈希法的基本思想:首先在元素的关键字首先在元素的关键字k和元素的存储位置和元素的存储位置p之间建立一个对应关系之间建立一个对应关系f,使得使得p

  2、=f(k),f称为哈希函数。创建哈希表时,把关键字为称为哈希函数。创建哈希表时,把关键字为k的元素直的元素直接存入地址为接存入地址为f(k)的单元;以后当查找关键字为的单元;以后当查找关键字为k的元素时,再利用哈的元素时,再利用哈希函数计算出该元素的存储位置希函数计算出该元素的存储位置p=f(k),从而达到按关键字直接存取,从而达到按关键字直接存取元素的目的。元素的目的。关关键键码码集集合合 ki ri H(ki)H 8.4.1 哈希函数的构造方法哈希函数的构造方法 构造原则:构造原则:函数本身便于计算函数本身便于计算;计算出来的地址分布均匀,即对任一关键字计算出来的地址分布均匀,即对任一关键

  3、字k,f(k)对应不同地址对应不同地址的概率相等,目的是尽可能减少冲突。的概率相等,目的是尽可能减少冲突。1.数字分析法:数字分析法:如果事先知道关键字集合,并且每个关键字的位数如果事先知道关键字集合,并且每个关键字的位数比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若比哈希表的地址码位数多时,可以从关键字中选出分布较均匀的若干位,构成哈希地址。干位,构成哈希地址。适用情况:关键码位数很多,事先知道关键码的分布。例 有80个记录,关键字为8位十进制数,哈希地址为2位十进制数 8 1 3 4 6 5 3 2 8 1 3 7 2 2 4 2 8 1 3 8 7 4 2 2 8 1 3 0

  4、 1 3 6 7 8 1 3 2 2 8 1 7 8 1 3 3 8 9 6 7 8 1 3 6 8 5 3 7 8 1 4 1 9 3 5 5.分析:只取8 只取1 只取3、4 只取2、7、5 数字分布近乎随机 所以:取任意两位或两位 与另两位的叠加作哈希地址 2.平方取中法:平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。址。对关键码平方后,按散列表大小,取中间的若干位作为散列地址(平方后截取)。例:散列地址为2位,则关

  5、键码1234的散列地址为 适用情况:事先不知道关键码的分布且关键码的位数不是很大。9 将关键码从左到右分割成位数相等的几部分,将这几部分叠加求和,取后几位作为散列地址。例:设关键码为2 5 3 4 6 3 5 8 7 0 5,散列地址为三位。2 5 3 4 6 3 5 8 7 +0 5 1 3 0 8 适用情况:关键码位数很多,事先不知道关键码的分布。移位叠加:将分割后的几部分低位对齐相加 3.折叠法折叠法:4.除留余数法:假设哈希表长为除留余数法:假设哈希表长为m,p为小于等于为小于等于m的最大素数,则的最大素数,则哈希函数为:哈希函数为:H(k)=k%p其中其

  6、中%为模为模p取余运算。取余运算。如何选取合适的 p,产生较少同义词?例:p 12 or 11 一般情况下,选p为小于或等于表长(最好接近表长)的最小素数或不包含小于20质因子的合数。适用情况?4.4.除留余数法除留余数法 除留余数法是一种最简单、也是最常用的构造散列函数的方法,并且不要求事先知道关键码的分布。5.伪随机数法:伪随机数法:采用一个伪随机函数做哈希函数,即采用一个伪随机函数做哈希函数,即h(key)=random(key)。设定哈希函数为:H(key)=Random(key)其中,Random 为伪随机函数 适用情况?此方法适用于对长度不等的关键字构造哈希函数。8.4.2 处理冲

  7、突的方法(四种)处理冲突的方法(四种)1.开放定址法开放定址法 基本思想:当关键字基本思想:当关键字key的哈希地址的哈希地址p=H(key)出现冲突时,以)出现冲突时,以p为为基础,产生另一个哈希地址基础,产生另一个哈希地址p1,如果,如果p1仍然冲突,再以仍然冲突,再以p为基础,产为基础,产生另一个哈希地址生另一个哈希地址p2,直到找出一个不冲突的哈希地址,直到找出一个不冲突的哈希地址pi,将相,将相应元素存入其中。这种方法有一个通用的再散列函数形式:应元素存入其中。这种方法有一个通用的再散列函数形式:Hi=(H(key)+di)%m i=1,2,n 其中其中H(key)为哈希函数,)为哈

  8、希函数,m 为表长,为表长,di称为增量序列。增量序列的称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:取值方式不同,相应的再散列方式也不同。主要有以下三种:l l线性探测再散列线性探测再散列,d,di i=1=1,2 2,3 3,m m-1 1,其特点是:冲突发生时,其特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。顺序查看表中下一单元,直到找出一个空单元或查遍全表。l l二次探测再散列,二次探测再散列,di=12,-12,22,-22,k2,-k2 (k=m/2),其,其特点特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。是:冲

  9、突发生时,在表的左右进行跳跃式探测,比较灵活。l l伪随机探测再散列伪随机探测再散列,d,di i=伪随机数序列。具体实现时,应建立一个伪伪随机数序列。具体实现时,应建立一个伪随机数发生器,随机数发生器,(如如i i=(=(i+pi+p)%m)%m),并给定一个随机数做起点。),并给定一个随机数做起点。例:关键码集合为 47,7,29,11,16,92,22,8,3,散列表表长为11,散列函数为H(key)=key mod 11,用线性探测法处理冲突,则散列表为:0 1 2 3 4 5 6 7 8 9 47 7 29 11 16 92 29 22 22 8 8 3 3 3 3 堆积:在处理冲突

  10、的过程中出现的非同义词之间对同一个散列地址争夺的现象。线.再哈希法再哈希法 这种方法是同时构造多个不同的哈希函数:这种方法是同时构造多个不同的哈希函数:Hi=RH1(key)i=1,2,k 当哈希地址当哈希地址Hi=RH1(key)发生冲突时,再计算)发生冲突时,再计算Hi=RH2(key),直到冲突不再产生。,直到冲突不再产生。3.链地址法链地址法 基本思想:基本思想:将所有哈希地址为将所有哈希地址为i的元素构成一个称为同义词链的单链表的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和个单元中,因

  11、而查找、插入和删除主要在同义词链中进行。删除主要在同义词链中进行。例:关键码集合 47,7,29,11,16,92,22,8,3,散列函数为H(key)=key mod 11,用拉链法处理冲突,构造的开散列表为:0 1 2 3 4 5 6 7 8 9 10 11 22 47 3 92 16 7 29 8 实例 4.建立公共溢出区建立公共溢出区 这种方法的基本思想是:将哈希表分为基本表和溢出表两部分这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。,凡是和基本表发生冲突的元素,一律填入溢出表。8.4.3 哈希表的查找过程哈希表的查找过程 当查找关

  12、键字为当查找关键字为K的元素时,首先计算的元素时,首先计算p0=hash(K)。如果单元)。如果单元p0为空,则所查元素不存在;如果单元为空,则所查元素不存在;如果单元p0中元素的关键字为中元素的关键字为K,则找,则找到所查元素;否则重复下述解决冲突的过程:按解决冲突的方法,找到所查元素;否则重复下述解决冲突的过程:按解决冲突的方法,找出下一个哈希地址出下一个哈希地址pi,如果单元,如果单元pi为空,则所查元素不存在;如果单为空,则所查元素不存在;如果单元元pii中元素的关键字为中元素的关键字为K,则找到所查元素。,则找到所查元素。哈希表的查找算法(线性探测再散列)哈希表的查找算法(线、散列)#define m#define NULLKEY typedef int KeyType;typedef struct KeyType key;.RecordType;typedef RecordType HashTablem;int HashSearch(HashTable ht,KeyType K)p0=hash(K);if (htp0.key=NULLKEY)return(-1);else if (htp0.key=K)return(p0);else /*用线性探测再散列解决冲突用线性探测再散列解决冲突*/for(i=1;i=m-1;i+)pi=(p0+i)%m;if (htpi.

【返回列表页】

顶部

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