北京师范大学数据结构教学资料 第7章——搜索结构.pptVIP

北京师范大学数据结构教学资料 第7章——搜索结构.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 使用开散列法的散列表类定义 #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 //构造函数 HashTableE, K::HashTable (int d, int sz) { divisor = d; TableSize = sz; ht = new ChainNodeE, K*[sz]; //创建头结点 assert (ht != NULL); //判断存储分配成功否 }; template class E, class K ChainNodeE, K *HashTableE, K:: FindPos (K k1) { * //在散列表ht中搜索关键码为k1的元素。函数返回 //一个指向散列表中某位置的指针 int j = k1 % divisor; //计算散列地址 ChainNodeE, K *p = ht[j]; //扫描第j链的同义词子表 while (p != NULL p-data != k1) p = p-link; return p; //返回 }; 其他如插入、删除操作可参照单链表的插入、删除等算法来实现。 * 应用开散列法处理冲突, 需要增设链接指针,似乎增加了存储开销。事实上, 由于闭散列法必须保持大量的空闲空间以确保搜索效率,如二次探查法要求装填因子?≤0.5,而表项所占空间又比指针大得多,所以使用开散列法反而比闭散列法节省存储空间。 散列表直接出计算表项存放地址,在关键码与存储位置之间直接建立了映象。 散列表分析 * 当选择的散列函数能够得到均匀的地址分布时, 在搜索过程中可以不做多次探查。 由于很难避免冲突, 增加了搜索时间。冲突的出现, 与散列函数选取(地址分布是否均匀), 处理冲突方法(是否产生堆积)有关。 在实际应用中使用关键码进行散列时, 如在用作关键码的许多标识符具有相同的前缀或后缀,或者是相同字符的不同排列的场合,不同的散列函数往往导致散列表具有不同的搜索性能。 下图给出一些实验结果。 * 搜索关键码时所需对桶的平均访问次数 * 可以看出,开散列法优于闭散列法;在散列函数中,用除留余数法作散列函数优于其他类型的散列函数,最差的是折叠法。 对散列表技术进行的实验评估表明, 它具有很好的平均性能, 优于一些传统的技术, 如平衡树。但散列表在最坏情况下性能很不好。如果对一 个有 n 个关键码的散列表执行一次搜索或插入操作,最坏情况下需要 O(n) 的时间。 Knuth对不同的冲突处理方法进行了概率分析。 * 若设 ? 是散列表的装填因子: Sn 是搜索一个随机选择的关键码 xi (1≤i ≤n) 所需的关键码比较次数的期望值 Un 是在长度为 m 的散列表中 n 个桶已装入表项的情况下,装入第 n+1 项所需执行的关键

文档评论(0)

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

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

1亿VIP精品文档

相关文档