折半查找判定树及平均查找长度

合集下载

C++ 二分法查找

C++ 二分法查找

二分法查找1、二分查找(Binary Search)二分查找又称折半查找,它是一种效率较高的查找方法。

二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。

不妨设有序表是递增有序的。

2、二分查找的基本思想二分查找的基本思想是:(设R[low..high]是当前的查找区间)(1)首先确定该区间的中点位置:(2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下:①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1..mid-1]中,故新的查找区间是左子表R[1..mid-1]。

②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n]。

下一次查找是针对新的查找区间进行的。

因此,从初始的查找区间R[1..n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。

这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。

3、二分查找算法int BinSearch(SeqList R,KeyType K){ //在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零int low=1,high=n,mid;//置当前查找区间上、下界的初值while(low<=high){ //当前查找区间R[low..high]非空mid=(low+high)/2;if(R[mid].key==K) return mid;//查找成功返回if(R[mid].kdy>K)high=mid-1; //继续在R[low..mid-1]中查找elselow=mid+1;//继续在R[mid+1..high]中查找}return 0;//当low>high时表示查找区间为空,查找失败} //BinSeareh二分查找算法亦很容易给出其递归程序【参见练习】4、二分查找算法的执行过程设算法的输入实例中有序的关键字序列为(05,13,19,21,37,56,64,75,80,88,92)要查找的关键字K分别是21和85。

折半查找判定树的特点

折半查找判定树的特点

折半查找判定树的特点
折半查找(Binary Search)判定树是一种用于分析二分查找算法的数据结构。

以下是折半查找判定树的一些特点:
1.平衡性:折半查找判定树是一棵平衡二叉树。

在最坏情况下,每一层的节点数量都接近于对数的底数为2,这保证了查找的效率。

2.查找时间复杂度:对于包含n个元素的有序数组,折半查找的时间复杂度为O(log n)。

这是因为每一次比较都会将搜索范围缩小一半。

3.插入和删除的复杂度:插入和删除操作不如查找高效。

由于需要保持有序性,插入和删除的平均时间复杂度为O(log n),但在最坏情况下可能需要O(n)的时间来调整平衡。

4.节点结构:每个节点表示一个比较操作,包含有关元素和比较值的信息。

树的叶子节点表示查找成功的结束点,而非叶子节点表示查找的比较过程。

5.路径长度:对于n个元素的有序数组,折半查找判定树的路径长度为log₂(n)+1。

路径长度是指从根节点到达叶子节点的最短路径的长度。

6.对数性质:折半查找的效率主要依赖于对数的性质。

每一次比较都将搜索范围缩小一半,因此查找的时间复杂度是对数级别的。

7.适用性:折半查找适用于有序数组,因为它依赖于元素的有序性。

如果数据经常需要进行查找而不是插入和删除,折半查找是一种高效的算法。

总的来说,折半查找判定树是一种用于分析二分查找算法行为的有用工具,它展示了查找过程中关键比较的次数和顺序。

折半查找判定树的规则

折半查找判定树的规则

折半查找判定树的规则一、折半查找的原理折半查找,也称为二分查找,是一种高效的查找算法。

它的基本思想是将待查找的区间不断二分,直到找到目标元素或确定目标元素不存在。

具体步骤如下:1. 首先,将待查找的区间的左右边界确定为列表的起始位置和结束位置。

2. 然后,计算区间的中间位置,即将左右边界相加除以2得到的整数。

3. 接下来,将中间位置的元素与目标元素进行比较。

4. 如果中间位置的元素等于目标元素,则查找成功,返回该元素的位置。

5. 如果中间位置的元素大于目标元素,则将区间的右边界更新为中间位置减1,并继续查找。

6. 如果中间位置的元素小于目标元素,则将区间的左边界更新为中间位置加1,并继续查找。

7. 重复步骤2至6,直到找到目标元素或确定目标元素不存在。

二、折半查找判定树的规则折半查找判定树是一种用来描述折半查找过程的树状结构。

它由若干个节点组成,每个节点表示一个子问题的解决过程。

根据折半查找的原理,我们可以总结出折半查找判定树的规则如下:1. 根节点表示待查找的区间。

2. 若当前区间为空,则查找失败,返回-1。

3. 若当前区间只包含一个元素,且该元素等于目标元素,则查找成功,返回该元素的位置。

4. 若当前区间只包含一个元素,且该元素不等于目标元素,则查找失败,返回-1。

5. 若当前区间包含多个元素,则按照中间位置划分左右子区间。

6. 若中间位置的元素等于目标元素,则查找成功,返回该元素的位置。

7. 若中间位置的元素大于目标元素,则在左子区间中继续查找,否则在右子区间中继续查找。

三、折半查找的应用折半查找是一种非常高效的查找算法,因此在实际应用中被广泛使用。

它主要应用于以下场景:1. 有序列表的查找:折半查找适用于已经排序的列表,通过不断二分查找的方式可以快速定位目标元素。

2. 数据库索引的实现:数据库中的索引通常采用B+树结构,而B+树的查找过程就是基于折半查找的。

3. 数组中的查找:对于有序数组,折半查找可以在O(logn)的时间复杂度下找到目标元素。

自-《数据结构》习题集:第9章查找(第1次更新2012-5)

自-《数据结构》习题集:第9章查找(第1次更新2012-5)

第9章查找一、选择题1.顺序查找一个共有n个元素的线性表,其时间复杂度为(),折半查找一个具有n个元素的有序表,其时间复杂度为()。

【*,★】A.O(n)B. O(log2n)C. O(n2)D. O(nlog2n)2.在对长度为n的顺序存储的有序表进行折半查找,对应的折半查找判定树的高度为()。

【*,★】A.nB. ⌊log2n⌋C. ⌊log2(n+1)⌋D. ⌈log2(n+1)⌉3.采用顺序查找方式查找长度为n的线性表时,平均查找长度为()。

【*】A.nB. n/2C. (n+1)/2D. (n-1)/24.采用折半查找方法检索长度为n的有序表,检索每个元素的平均比较次数()对应判定树的高度(设高度大于等于2)。

【**】A.小于B. 大于C. 等于D. 大于等于5.已知有序表(13,18,24,35,47,50,62,83,90,115,134),当折半查找值为90的元素时,查找成功的比较次数为()。

【*】A. 1B. 2C. 3D. 46.对线性表进行折半查找时,要求线性表必须()。

【*】A.以顺序方式存储B. 以链接方式存储C.以顺序方式存储,且结点按关键字有序排序D. 以链接方式存储,且结点按关键字有序排序7.顺序查找法适合于存储结构为()的查找表。

【*】A.散列存储B. 顺序或链接存储C. 压缩存储D. 索引存储8.采用分块查找时,若线性表中共有625个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分()个结点最佳。

【**】A.10B. 25C. 6D. 6259.从键盘依次输入关键字的值:t、u、r、b、o、p、a、s、c、l,建立二叉排序树,则其先序遍历序列为(),中序遍历序列为()。

【**,★】A.abcloprstuB. alcpobsrutC. trbaoclpsuD. trubsaocpl10.折半查找和二叉排序树的时间性能()。

【*】A.相同B. 不相同11.一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有()个结点。

《数据结构》第九章作业参考答案

《数据结构》第九章作业参考答案

第九章查找9.3 画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。

解:判定树应当描述每次查找的位置:9.9已知如下所示长度为12的表:(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)(1)试按表中元素的顺序依次插入一棵初始为空的二叉排序树,画出插入完成之后的二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。

(2)若对表中元素先进行排序构成有序表,求在等概率的情况下对此有序表进行折半查找时查找成功的平均查找长度。

(3)按表中元素顺序构造一棵平衡二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。

解:9.19解:H(22)=(3×22) mod 11=0 H(41)=(3×41) mod 11=2 H(53)=(3×53) mod 11=5 H(46)=(3×46) mod 11=6H(30)=(3×30) mod 11=2 冲突d1=(7×30) mod 10+1=1 H1(30)=(2+1)/11=3 H(13)=(3×13) mod 11=6 冲突d1=(7×13) mod 10+1=2 H1(13)=(6+2)/11=8 H(01)=(3×01) mod 11=3冲突d1=(7×1) mod 10+1=8 H1(01)=(3+8)/11=0冲突d2=2*((7×1) mod 10+1)=16 H2(01)=(3+16)/11=8冲突d3=3*((7×1) mod 10+1)=24 H3(01)=(3+24)/11=5冲突d4=4*((7×1) mod 10+1)=32 H4(01)=(3+32)/11=2冲突d5=5*((7×1) mod 10+1)=40 H5(01)=(3+40)/11=10H(67)=(3×67) mod 11=3冲突d1=(7×67) mod 10+1=10 H1(67)=(3+10)/11=2冲突d2=2*((7×67) mod 10+1)=20 H2(67)=(3+20)/11=1哈希表:ASL=(1+1+1+1+2+2+6+3)/8=17/8X。

具有12个关键字的有序表,折半查找的平均查找长度

具有12个关键字的有序表,折半查找的平均查找长度

具有12个关键字的有序表,折半查找的平均查
找长度
折半查找是一种在有序序列中查找某个给定值的方法,它是一种加速搜索的算法,并且有着高效、可靠的特点,在每次搜索次数减半的情况下,无论序列的长度多大,其查找代价是固定的,能大大减少存储器和 CPU 占用,节省时间和空间。

折半查找时,先取出中间位置记录,将查找值和中间位置记录进行比较,子表长度缩小,重复上述查找操作,直到找到等于查找值的记录,或子表不存在为止。

如果有12个关键字的有序表,用折半查找方法来查找,那么平均查找长度(ASL)是[log2(n)]+1=4。

从0开始计数,折半查找找到元素最多需要3步:第一步,查找中间位置的元素;第二步,比较查找元素与中间位置的元素的大小,如果查找元素小于中间位
置的元素,就在中间位置的左半边的子序列中继续查找;如果查找元素大于中间位置的元素,就在中间位置的右半边的子序列中继续查找;第三步,不断进行折半查找,直到找到查找元素,或者查找范围为空,则查找失败,结束。

总的来说,折半查找是一种非常有效的搜索算法
它可以在有序表中大大加快搜索速度,在12个关键字有序表中,折半查找的平均查找长度是4,在节省时间和空间的同时,能够很好地用于搜索、匹配等需要的操作中。

数据结构中的查找算法总结

数据结构中的查找算法总结

数据结构中的查找算法总结静态查找是数据集合稳定不需要添加删除元素的查找包括:1. 顺序查找2. 折半查找3. Fibonacci4. 分块查找静态查找可以⽤线性表结构组织数据,这样可以使⽤顺序查找算法,再对关键字进⾏排序就可以使⽤折半查找或斐波那契查找等算法提⾼查找效率,平均查找长度:折半查找最⼩,分块次之,顺序查找最⼤。

顺序查找对有序⽆序表均适⽤,折半查找适⽤于有序表,分块查找要求表中元素是块与块之间的记录按关键字有序动态查找是数据集合需要添加删除元素的查找包括: 1. ⼆叉排序树 2. 平衡⼆叉树 3. 散列表 顺序查找适合于存储结构为顺序存储或链接存储的线性表。

顺序查找属于⽆序查找算法。

从数据结构线形表的⼀端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相⽐较,若相等则表⽰查找成功 查找成功时的平均查找长度为: ASL = 1/n(1+2+3+…+n) = (n+1)/2 ; 顺序查找的时间复杂度为O(n)。

元素必须是有序的,如果是⽆序的则要先进⾏排序操作。

⼆分查找即折半查找,属于有序查找算法。

⽤给定值value与中间结点mid的关键字⽐较,若相等则查找成功;若不相等,再根据value 与该中间结点关键字的⽐较结果确定下⼀步查找的⼦表 将数组的查找过程绘制成⼀棵⼆叉树排序树,如果查找的关键字不是中间记录的话,折半查找等于是把静态有序查找表分成了两棵⼦树,即查找结果只需要找其中的⼀半数据记录即可,等于⼯作量少了⼀半,然后继续折半查找,效率⾼。

根据⼆叉树的性质,具有n个结点的完全⼆叉树的深度为[log2n]+1。

尽管折半查找判定⼆叉树并不是完全⼆叉树,但同样相同的推导可以得出,最坏情况是查找到关键字或查找失败的次数为[log2n]+1,最好的情况是1次。

时间复杂度为O(log2n); 折半计算mid的公式 mid = (low+high)/2;if(a[mid]==value)return mid;if(a[mid]>value)high = mid-1;if(a[mid]<value)low = mid+1; 折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向⼀个实际上不存在的结点——外结点,所有外界点都是查找不成功的情况,如图所⽰。

《数据结构》习题集:第9章查找(第1次更新2019-5)

《数据结构》习题集:第9章查找(第1次更新2019-5)

第9章查找一、选择题1.顺序查找一个共有n个元素的线性表,其时间复杂度为(),折半查找一个具有n个元素的有序表,其时间复杂度为()。

【*,★】A.O(n)B. O(log2n)C. O(n2)D. O(nlog2n)2.在对长度为n的顺序存储的有序表进行折半查找,对应的折半查找判定树的高度为()。

【*,★】A.nB.C.D.3.采用顺序查找方式查找长度为n的线性表时,平均查找长度为()。

【*】A.nB. n/2C. (n+1)/2D. (n-1)/24.采用折半查找方法检索长度为n的有序表,检索每个元素的平均比较次数()对应判定树的高度(设高度大于等于2)。

【**】A.小于B. 大于C. 等于D. 大于等于5.已知有序表(13,18,24,35,47,50,62,83,90,115,134),当折半查找值为90的元素时,查找成功的比较次数为()。

【*】A. 1B. 2C. 3D. 46.对线性表进行折半查找时,要求线性表必须()。

【*】A.以顺序方式存储B. 以链接方式存储C.以顺序方式存储,且结点按关键字有序排序D. 以链接方式存储,且结点按关键字有序排序7.顺序查找法适合于存储结构为()的查找表。

【*】A.散列存储B. 顺序或链接存储C. 压缩存储D. 索引存储8.采用分块查找时,若线性表中共有625个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分()个结点最佳。

【**】A.10B. 25C. 6D. 6259.从键盘依次输入关键字的值:t、u、r、b、o、p、a、s、c、l,建立二叉排序树,则其先序遍历序列为(),中序遍历序列为()。

【**,★】A.abcloprstuB. alcpobsrutC. trbaoclpsuD. trubsaocpl10.折半查找和二叉排序树的时间性能()。

【*】A.相同B. 不相同11.一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有()个结点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

折半查找判定树及平均查找长度
从折半查找的过程看,以有序表的中间记录作为比较对象,并以中间记录将表分割为两个子表,对子表继续上述操作。

所以,对表中每个记录的查找过程,可用二叉树来描述,二叉树中的每个结点对应有序表中的一个记录,结点中的值为该记录在表中的位置。

通常称这个描述折半查找过程的二叉树为折半查找判定树。

长度为n的折半查找判定树的构造方法为:⑴当n=0时,折半查找判定树为空;
⑵当n>0时,折半查找判定树的根结点是有序表中序号为mid=(n+1)/2的记录,根结点的左子树是与有序表r[1] ~ r[mid-1]相对应的折半查找判定树,根结点的右子树是与r[mid+1] ~ r[n]相对应的折半查找判定树。

例如,长度为10的折半查找判定树的具体生成过程为:
⑴在长度为10的有序表中进行折半查找,不论查找哪个记录,都必须先和中间记录进行比较,而中间记录的序号为(1+10)/2=5(注意是整除即向下取整),即判定树的根结点是5,如图7-2(a)所示;
⑵考虑判定树的左子树,即将查找区间调整到左半区,此时的查找区间是[1,4],也就是说,左分支上为根结点的值减1,代表查找区间的高端high,此时,根结点的左孩子是(1+4)/2=2,如图7-2(b)所示;
⑶考虑判定树的右子树,即将查找区间调整到右半区,此时的查找区间是[6,10],也就是说,右分支上为根结点的值加1,代表查找区间的低端low,此时,根结点的右孩子是(6+10)/2=8,如图7-2(c)所示;
⑷重复⑵⑶步,依次确定每个结点的左右孩子,如图7-2(d)所示。

历史老照片不能说的秘密慈禧军阀明末清初文革晚清
对于折半查找判定树,需要补充以下两点:
⑴折半查找判定树是一棵二叉排序树,即每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值;
⑵折半查找判定树中的结点都是查找成功的情况,将每个结点的空指针指向一个实际上并不存在的结点——称为外结点,所有外结点即是查找不成功的情况,如图7-2(e)所示。

如果有序表的长度为n,则外结点一定有n+1个。

在折半查找判定树中,某结点所在的层数即是查找该结点的比较次数,整个判定树代表的有序表的平均查找长度即为查找每个结点的比较次数之和除以有序表的长度。

例如,长度为10的有序表的平均查找长度为:
ASL=(1×1+2×2+3×4+4×3)/10=29/10
在折半查找判定树中,查找不成功时的比较次数即是查找相应外结点时与内结点的比较次数。

整个判定树代表的有序表在查找失败时的平
均查找长度即为查找每个外结点的比较次数之和除以外结点的个数。

例如,长度为10的有序表在查找失败时的平均查找长度为:
ASL=(3×5+4×6)/11=39/11。

相关文档
最新文档