数据结构第25讲:第10章查找表可扩充散列c课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构第25讲:第10章查找表可扩充散列c课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 25 10 查找 扩充 课件
- 资源描述:
-
1、1 一、哈希表是什么?一、哈希表是什么?二、哈希函数的构造方法二、哈希函数的构造方法三、处理冲突的方法三、处理冲突的方法 四、哈希表的查找四、哈希表的查找9.4 哈哈 希希 表表五五.可扩充散列可扩充散列2 查找过程和造表过程一致。假设采用开放定址处理冲突,则查找过程查找过程为:四、哈希表的查找哈希表的查找 对于给定值 K,计算哈希地址 Hi=H(K)若若 rHi.key=NULL 则查找不成功若若 rHi.key=K 则查找成功否则否则“求下一地址 Hi”,直至 rHi.key=NULL (查找不成功)或 rHi.key=K (查找成功)为止。3int hashsize=997,.;/一个素
2、数序列typedef struct ElemType *elem;/数据元素存储基址 int count;/当前数据元素个数 int sizeindex;/hashsizesizeindex为当前容量 HashTable;#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1/-开放定址哈希表开放定址哈希表的存储结构-4Status HashSearch(HashTable H,KeyType K,int&p,int&c)/p指示待查数据元素K在表中的位置,c为冲突计数 /SearchHashp=Hash(K);/求得哈希地址while
3、(H.elemp.key!=NULL&/该位置有记录 !EQ(K,H.elemp.key))/且不等于K collision(p,+c);/处理冲突,求得下一探查地址 pif(EQ(K,H.elemp.key)return SUCCESS;/查找成功,返回待查数据元素位置 pelse return UNSUCCESS;/查找不成功查找算法查找算法5Status InsertHash(HashTable&H,Elemtype e)c=0;if(HashSearch(H,e.key,p,c)=SUCCESS)return DUPLICATE;/表中已有与表中已有与 e 有相同关键字的元素有相同关键
4、字的元素else if(c hashsizeH.sizeindex/2)/冲突次数冲突次数 c 未达到上限,(阀值未达到上限,(阀值 c 可调)可调)H.elemp=e;+H.count;return OK;/查找不成功时,返回查找不成功时,返回 p为插入位置为插入位置 else RecreateHashTable(H);/重建哈希表重建哈希表/InsertHash插入算法插入算法6Status DeleteHash(HashTable&H,Elemtype e)/DeleteHash else H.elemp=null;-H.count;return OK;c=0;if(HashSearch
5、(H,e.key,p,c)=UNSUCCESS)return ERROR;/表中无与 e 有相同关键字的元素删除算法删除算法H.Infop=deleted;/将待删除位置置为不可能将待删除位置置为不可能/出现的值出现的值./将待删除位置用探测序列将待删除位置用探测序列/的的下一个关键字顺序递补下一个关键字顺序递补./另外定义一个删除标志数组另外定义一个删除标志数组/并置删除标志并置删除标志pH.InfoH.elem7 1)选用的哈希函数哈希函数;2)选用的处理冲突的方法处理冲突的方法;3)哈希表饱和的程度:装载因子装载因子 =记录数记录数/表的长度表的长度 通常要求通常要求 0.5决定哈希表查
6、找的决定哈希表查找的ASL的因素的因素:哈希表查找的分析:从查找过程得知,哈希表查找的平均查找长度实际上并不等于零实际上并不等于零。8查找关键码时所需的平均查找次数查找关键码时所需的平均查找次数在散列函数中,在散列函数中,除留余数法除留余数法优于优于其它类型其它类型的散列函数,的散列函数,最差的是最差的是折叠法折叠法。对于冲突处理方法:对于冲突处理方法:链地址法链地址法优于优于开放定址法开放定址法;链地址法需要增设链接指针链地址法需要增设链接指针,增加了存储?增加了存储?由于开放定址法须保持大量的空闲空间以确保搜索效由于开放定址法须保持大量的空闲空间以确保搜索效率,如平方探查法要求装填因子率,
7、如平方探查法要求装填因子 0.5 0.5。而记录所占。而记录所占空间又比指针大得多,故链地址法反而节省存储空间。空间又比指针大得多,故链地址法反而节省存储空间。9用不同的冲突处理方法时散列表的平均查找长度用不同的冲突处理方法时散列表的平均查找长度 如果取如果取 0.5 1.5 2.5 21.251.110从以上结果可见,哈希表的平均查找长度是 的函数,而不是 n 的函数。这说明,用哈希表构造查找表时,可以选择一个适当的装填因子 ,使得平均查找长度限定在某个范围内平均查找长度限定在某个范围内。这是哈希表所特有的特点。这是哈希表所特有的特点。11例例1 1:求散列表大小并设计散列函数求散列表大小并
8、设计散列函数条件:设有一个含条件:设有一个含200个记录的散列表,要求用个记录的散列表,要求用平方探查平方探查法解决冲突,且要求按关键码查询时,找到一个法解决冲突,且要求按关键码查询时,找到一个新记录插入位置的平均探查次数不超过新记录插入位置的平均探查次数不超过1.5。问题:哈希表至少应该多大?并设计哈希函数。问题:哈希表至少应该多大?并设计哈希函数。分析:对平方探测法,查找不成功的平均搜索长度为分析:对平方探测法,查找不成功的平均搜索长度为 Un1/(1-),解答:根据要求解答:根据要求n200,且:,且:Un1/(1-)1.5 1/3 =n/m=200/m m 60012 一、哈希表是什么
9、?一、哈希表是什么?二、哈希函数的构造方法二、哈希函数的构造方法三、处理冲突的方法三、处理冲突的方法 四、哈希表的查找四、哈希表的查找9.4 哈哈 希希 表表五五.可扩充散列可扩充散列13五五.可扩充散列可扩充散列问题提出:问题提出:1 1。再散列问题:。再散列问题:对于静态散列表,无论使开发定址法还是链址对于静态散列表,无论使开发定址法还是链址法,都需要静态分配存储空间。如果表的记录太满,法,都需要静态分配存储空间。如果表的记录太满,则查找和插入的时间将很长,甚至插入操作可能失则查找和插入的时间将很长,甚至插入操作可能失败。败。由于由于静态散列表的长度不能够增加(静态散列表的长度不能够增加(
10、?),解决,解决的办法只能是另外建立一个新的散列表(原来的两的办法只能是另外建立一个新的散列表(原来的两倍),并扫描原来表中的每一个记录,并将其插入倍),并扫描原来表中的每一个记录,并将其插入到新的散列表中(到新的散列表中(复制记录复制记录)。)。数据结构数据结构用面向对象方法与用面向对象方法与C+语言描述语言描述清华大学出版社清华大学出版社 殷人昆殷人昆142 2。哈希表太长,多次访问外存。哈希表太长,多次访问外存 由于哈希表中的记录数太多,不能够一次装载到由于哈希表中的记录数太多,不能够一次装载到内存。只能根据内存缓存区的大小分段载入内存。内存。只能根据内存缓存区的大小分段载入内存。对于象
11、平方探测这样的开放定址处理冲突方法,对于象平方探测这样的开放定址处理冲突方法,进行一次哈希查找就需要进行多次访问外存的操作。进行一次哈希查找就需要进行多次访问外存的操作。p段段1 1段段2 2段段3 315 可扩充散列是一种动态散列方法,它对传统的可扩充散列是一种动态散列方法,它对传统的散列技术进行了扩充。它采用树型结构实现哈希散列技术进行了扩充。它采用树型结构实现哈希表的存储结构,使之能够表的存储结构,使之能够动态动态(再散列不需要复制再散列不需要复制)地适应对文件存储容量的需求,并能保持地适应对文件存储容量的需求,并能保持高效高效(访访问外存次数少问外存次数少)的搜索效率。)的搜索效率。1
12、.1.二叉二叉 Trie Trie 树树2.2.将二叉将二叉TrieTrie树转换为目录表树转换为目录表3.3.插入与目录扩充插入与目录扩充4.4.删除与目录收缩删除与目录收缩160 1(A)3 4 5(E)9(I)268(H)4(D)19(S)22(V)0 18(R)7(G)190 5(E)THADHAS HAVE HEHERHEREHIGHHIS表示关键字集合HAD,HAS,HAVE,HE,HER,HERE,HIGH,HIS Trie 树树1 1。多叉。多叉2 2。按字符划分。按字符划分3 3。查找需要比较。查找需要比较17 根据关键字二进制码的最低根据关键字二进制码的最低 2 2 位进行
13、划分,可以把这些位进行划分,可以把这些关键字分成关键字分成 4 4 类。假设把它们类。假设把它们 4 4 个页块的文件中个页块的文件中,每页最多每页最多可以容纳可以容纳2 2个关键码。这样就可以利用各关键码的最低个关键码。这样就可以利用各关键码的最低2 2位(位(00,00,01,10,1101,10,11)来决定它们的存储页块。)来决定它们的存储页块。001011A0,B0C2C3A1,B1标识符标识符 A0 A1 B0 B1 C2 C3 C2 C3二进位二进位 100 100 101 101 110 110 110 110 表示表示 000 001 000 001 010 011 010
14、011 1.二叉二叉 Trie 树树 设关键字序列设关键字序列 A0,A1,B0,B1,C2,C3。若每一个关键码由。若每一个关键码由 2 个字符组成个字符组成,而每一个字符用而每一个字符用 3 个二进制位表示。则有:个二进制位表示。则有:页块页块(桶桶)18二叉二叉TrieTrie树:树:根据各关键码的二进制位表示根据各关键码的二进制位表示,从从最低位最低位到最高到最高位进行划分位进行划分,各页块的索引构成一个二叉树结构。各页块的索引构成一个二叉树结构。二叉二叉TrieTrie树树构造方法:构造方法:首先首先,在根结点处按各关键码的最低位是在根结点处按各关键码的最低位是 1 1 还还是是 0
15、,0,划分为两组。对于每一组再按次低位是划分为两组。对于每一组再按次低位是 1 1 还还是是 0 0 继续分组继续分组,如此分下去如此分下去,直到每组剩下不多于直到每组剩下不多于 2 2 个关键码为止。个关键码为止。二叉二叉TrieTrie树组成树组成:在二叉在二叉TrieTrie树中有两类结点:树中有两类结点:分支结点分支结点和和叶结点叶结点。分支结点分支结点按其相关二进位是按其相关二进位是 1 1 还是还是 0,0,分为两个分分为两个分支支;叶结点叶结点包含指向关键码存放页块的指针。包含指向关键码存放页块的指针。19 根据关键字二进制码的最低根据关键字二进制码的最低 2 2 位进行划分,可
16、以把这些位进行划分,可以把这些关键字分成关键字分成 4 4 类。假设把它们类。假设把它们 4 4 个页块的文件中个页块的文件中,每页最多每页最多可以容纳可以容纳2 2个关键码。这样就可以利用各关键码的最低个关键码。这样就可以利用各关键码的最低2 2位(位(00,00,01,10,1101,10,11)来决定它们的存储页块。)来决定它们的存储页块。001011A0,B0C2C3A1,B1标识符标识符 A0 A1 B0 B1 C2 C3 C2 C3二进位二进位 100 100 101 101 110 110 110 110 表示表示 000 001 000 001 010 011 010 011
17、1.二叉二叉 Trie 树树 设关键字序列设关键字序列 A0,A1,B0,B1,C2,C3。若每一个关键码由。若每一个关键码由 2 个字符组成个字符组成,而每一个字符用而每一个字符用 3 个二进制位表示。则有:个二进制位表示。则有:页块页块(桶桶)1 1。二叉。二叉2 2。按二进制位划分。按二进制位划分3 3。查找不需要比较。查找不需要比较20二叉二叉trietrie树是一种树型结构的哈希表树是一种树型结构的哈希表 哈希函数:哈希函数:是一种从关键字到二进制码的映射。是一种从关键字到二进制码的映射。哈希地址:哈希地址:根据二进制码的最低位进行划分,关根据二进制码的最低位进行划分,关键字的二进制
18、码对应键字的二进制码对应trietrie二叉树从根到叶子二叉树从根到叶子结点的路径。叶子结点中存放记录的指针。结点的路径。叶子结点中存放记录的指针。二叉二叉trietrie树树 与与 哈希表哈希表A0,B0C2C3001011A1,B1哈希表的大小哈希表的大小:可以动态扩展。:可以动态扩展。?冲突处理方法:?冲突处理方法:?B1101 001 01散列散列取低位取低位找叶子结点找叶子结点 页块号页块号找记录指针找记录指针21A0,B0C2C3001011A1,B1C501 插入插入 新的关键码新的关键码 C5 C5(110101110101)A0,B0C2C3001011A1,B1标识符标识符
19、 A0 A1 B0 B1 C2 C3 C2 C3二进位二进位 100 100 101 101 110 110 110 110 表示表示 000 001 000 001 010 011 010 011 应把应把 C5C5 放到放到A1,B1A1,B1所在的所在的第第3 3页中。但是此时该页块已满页中。但是此时该页块已满,发生了溢出(冲突)。为此发生了溢出(冲突)。为此,将将第第3 3页页扩充一倍,分裂为两页扩充一倍,分裂为两页。22 再插入再插入 一个新关键码一个新关键码 C1(110001)C1(110001)A0,B0C2C3001011C501B101A1,C1A0,B0C2C300101
20、1A1,B1C501 应将应将C C插入到插入到A1,B1A1,B1所在的页块中。这时又发生溢出所在的页块中。这时又发生溢出,需要再需要再分裂分裂A1,B1A1,B1所在页块:根据所在页块:根据A1,B1,C1A1,B1,C1 的最低的最低4 4位将它们重新分配位将它们重新分配到这两个页块中。到这两个页块中。标识符标识符 A0 A1 B0 B1 C2 C3 C2 C3二进位二进位 100 100 101 101 110 110 110 110 表示表示 000 001 000 001 010 011 010 011 23从上面的例子得出两个结论:从上面的例子得出两个结论:如何存储二叉如何存储二
展开阅读全文