勤思考研数据结构讲义查找.docVIP

  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文档。上传文档
查看更多
勤思考研数据结构讲义查找

查找 有关概念 查找表,静态查找表(只进行“查找”),动态查找表(可“查找”,“插入”,“删除”)。 关键字,平均查找长度 pi第i个关键字出现的概率,ci比较的关键字的个数。 静态查找表,顺序查找表,折半查找表,静态树表,次优查找树,索引顺序表。 动态查找表,二叉排序树,平衡二叉树(AVL树),B-树,B+树,键树,哈希表。 顺序查找 思路 按顺序逐个比较,直到找到或找不到。 算法 程序,要灵活应用。 例如:在数组a的前n个元素中查找x int Search ( int a[], int n, int x ) { for ( i=n-1; i=0; i-- ) if ( a[i]==x ) return i; return -1; // -1表示找不到 } 编程技巧:所有执行路径都要有正确的返回值,不要忘记最后那个return语句。 应试技巧:题目要求不明确时,按照方便的方法做,用适当的注释说明。 分析 顺序查找特点:思路简单(逐个比较),适用面广(对查找表没有特殊要求)。 平均查找长度 一般在等概率情况下,查找成功时,平均查找长度 思路:假设对每个元素进行1次查找,共进行n次查找,计算出进行比较的关键字的个数,然后除以查找次数n,就求得平均查找长度。 例:10个元素的表等概率情况下查找成功时的平均查找长度 判定树 判定树是一种描述查找中比较过程的直观形式,每个关键字所在层次就是其查找长度,有利于分析查找过程。顺序查找的判定树是一棵深度为n的单分支的树。课本上顺序查找从an开始,当然也可以从a1开始。 时间复杂度 从平均查找长度看顺序查找的时间复杂度是O(n)。 折半查找 思路 待查找的表必须是有序的,先从中间开始比较,比较一次至少抛弃一半元素,逐渐缩小范围,直到查找成功或失败。 算法 要熟练掌握该算法。设a[]升序有序,有以下算法: int BinarySearch ( DataType a[], int n, DataType x ) { low = 0; high = n-1; while ( low = high ) { mid = ( low + high )/2; // 折半 if ( a[mid]==x ) return mid; // 找到 else if ( xa[mid] ) // x位于低半区 [low..mid-1] high = mid – 1; else // x位于高半区 [mid+1..high] low = mid + 1; } return -1; // -1表示未找到 } 或者有递归版本: int BinarySearch ( DataType a[], int low, int high, DataType x ) { if ( lowhigh ) return -1; // 查找失败 mid = (low+high)/2; // 折半 if ( a[mid]==x ) return mid; // 找到 else if ( xa[mid] ) return BinarySearch (a, low, mid-1, x); else return BinarySearch (a, mid+1, high, x); } 另外,程序可有多种写法。 例:a[]递减有序,折半查找,请填空。 int bs ( T a[], int n, T x ) { i = n-1; j = 0; while (____a____) { m = ____b____; if (____c____) return m; // succeeded else if (____d____) i = ____e____; else ____f____; } return -1; // not found } 分析 特点:速度很快,要求查找表是有序的,而且随机访问(以便计算折半的下标)。所以,链表不能进行折半查找(但可以采用二叉排序树等形式进行快速的查找)。 判定树 折半查找的判定树类似于完全二叉树,叶子结点所在层次之差最多为1,其深度为。 查找过程就是走了一条从根到该结点的路径。 如:表长n=10的有序表折半查找的判定树如下。 平均查找长度 结论:等概率查找成功时的平均查找长度 分析方法:对等概率情况,假设查找n次,且每个查找1次,共比较关键字c次,则平均c/n次。 例:表长为n = 10,平均查找长度如下。 时间复杂度 结论:O(logn),根据

文档评论(0)

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

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

1亿VIP精品文档

相关文档