《数据结构》课件ds-06.pptVIP

  1. 1、本文档共176页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《数据结构》课件ds-06

* 搜索成功的平均搜索长度 搜索不成功的平均搜索长度 每一散列位置的移位量有10种:1, 2, ?, 10。先计算每一散列位置各种移位量情形下找到下一个空位的比较次数, 求出平均值; 再计算各个位置的平均比较次数的总平均值。 0 1 2 3 4 5 6 7 8 9 10 22 (1) 41 (1) 53 (1) 46 (1) 30 (3) 13 (2) 01 (1) 67 (4) * Rehash()的取法很多。例如, 当m是质数时, 可定义 ReHash(key) = key % (m-2) +1 ReHash(key) = ?key / m? % (m-2)+1 当 m 是 2 的方幂时,ReHash(key) 可取从 0 到 m-1 中的任意一个奇数。 * 处理冲突的开散列方法(链地址法) 开散列方法首先对关键码集合用某一个散列函数计算它们的存放位置。 若设散列表地址空间的位置从 0~m-1, 则关键码集合中的所有关键码被划分为 m 个子集,具有相同地址的关键码归于同一子集。我们称同一子集中的关键码互为同义词。每一个子集称为一个桶。 通常各个桶中的表项通过一个单链表链接起来,称之为同义词子表。 * 所有桶号相同的表项都链接在同一个同义词子表中,各链表的表头结点组成一个向量。 向量的元素个数与桶数一致。桶号为i的同义词子表的表头结点是向量中第 i 个元素。 示例:给出一组表项关键码 { Burke, Ekers, Broad, Blum, Attlee, Alton, Hecht, Ederly }。散列函数为:Hash (x)=ord (x)-ord (‘A’)。 用它计算可得: Hash (Burke) = 1 Hash (Ekers) = 4 Hash (Broad) = 1 Hash (Blum) = 1 * Hash (Attlee) = 0 Hash (Hecht) = 7 Hash (Alton) = 0 Hash (Ederly) = 4 散列表为 HT[0..25],m = 26。 (看下页) (看下页) 通常,每个桶中的同义词子表都很短,设有n 个关键码通过某一个散列函数,存放到散列表中的 m 个桶中。那么每一个桶中的同义词子表的平均长度为 n / m。以搜索平均长度为 n / m 的同义词子表代替了搜索长度为 n 的顺序表,搜索速度快得多。 * 0 1 2 3 4 5 6 7 8 9 Attlee Alton Burke Broad Blum Ekers Ederly Hecht * 使用开散列法的散列表类定义 #include assert.h const int defaultSize = 100; template class E, class K struct ChainNode { //各桶中同义词子表的链结点定义 E data; //元素 ChainNodeE, K *link; //链指针 }; template class E, class K class HashTable { //散列表(表头指针向量)定义 * public: HashTable (int d, int sz = defaultSize); //散列表的构造函数 ~HashTable() { delete [] ht; } //析构函数 bool Search (K k1, E e1); //搜索 bool Insert (K k1, E e1); //插入 bool Remove (K k1, E e1); //删除 private: int divisor; //除数(必须是质数) int TableSize; //容量(桶的个数) ChainNodeE, K **ht; //散列表定义 ChainNodeE, K *FindPos (K k1); //散列 }; * 用开散列法定义的散列表的操作 template class E, class K

您可能关注的文档

文档评论(0)

ligennv1314 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档