基本概念顺序查找二分查找分块索引查找二叉排序树的查找.pptVIP

基本概念顺序查找二分查找分块索引查找二叉排序树的查找.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文档。上传文档
查看更多
9.1 基本概念 查找表:由具有同一类型的数据元素(或记录)组成的集合称为查找表。 关键字: 关键字是记录中某个项或组合项的值,用它可以标识一个记录。能唯一确定一个记录的关键字,称为主关键字;而不能唯一确定一个记录的关键字,称为次关键字. 查找是指按给定的某个值k,在查找表中查找关键字为给定值k的记录。 查找是计算机中经常遇到的操作。特别是当问题所涉及到的数据量相当大时,查找的效率就显得格外重要。 查找运算的主要操作是关键字的比较,所以,通常把查找过程中对关键字需要执行的平均比较次数(也称为平均查找长度)作为衡量一个查找算法效率优劣的标准。 * 查找结果: 成功、失败 * 查找算法的性能指标 时间复杂性 平均查找长度: 平均比较次数 *常用的查找算法 顺序查找 二分查找(折半查找) 分块索引查找 二叉排序树的查找 B树与B+树的查找 Hash(散列)查找 无监视哨的顺序查找: int SeqSearch(Record r[], int n, int k) { int i=0; while (inr[i].key!=k) i++; if (in) return i; else return -1; } 有监视哨的顺序查找 int SeqSearch2(Record r[], int n, int k) { int i=0; r[n].key=k; while (r[i].key!=k) i++; if (in) return i; else return -1; } 9.3 二分查找 算法分析 平均长度的计算 例如: 长度为13的有序表进行折半查找的平均查找长度ASL=(1×1+2×2+3×4+4×6)/13=41/13。 9.4 分块查找 算法分析 性质: 中序遍历二叉排序树得到的是有序序列。 class BiSortTree { BiNode *root; void Insert(BiNode *ptr, int k); //供插入函数调用 BiNode* Search(BiNode *ptr, int k); //供查找函数调用 void Delete (BiNode *ptr, int k); //供删除函数调用 void Free(BiNode *ptr); //供析构函数调用 public: BiSortTree(int a[ ], int n); //建立二叉排序树 ~BiSortTree(); //析构函数 void Insert(int k); //插入 bool Search(int k); //查找 void Delete (int k); //删除 }; 4.二叉排序树的删除操作 分三种情况 : (1)删除叶子结点 (2)删除单支结点 (3)删除双支结点 递归删除算法的步骤如下: ① 若二叉排序树为空,则表明不存在删除的结点,不进行删除操作。 ② 若给定值k小于根结点的值,则继续在根的左子树中删除。 ③ 若给定值k大于根结点的值,则继续在根的右子树中删除。 ④ 若给定值k等于根结点的值,则根结点即为要删除的结点,此时需要根据上述分析的三种结点情况:叶子结点、单支结点或双支结点,执行相应的删除操作。 void BiSortTree::Delete(BiNode *ptr, int k) //在以ptr为根的二叉排序树中删除值为k的结点 { if (ptr!=NULL) { if (kptr-key) Delete(ptr-lchild,k); //在左子树进行删除 else if (kptr-key) Delete(ptr-rchild,k); //在右子树进行删除 else //ptr指向的结点就是要删除的结点 { if (ptr-lchild!=NULLptr-rchild!=NULL) //双支结点 { temp=ptr-lchild; while (temp-rchild!=NULL) temp=temp-rchild; //寻找左子树中具有最大值的结点 ptr-key=temp-k

文档评论(0)

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

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

1亿VIP精品文档

相关文档