汇编语言8.ppt
《汇编语言8.ppt》由会员分享,可在线阅读,更多相关《汇编语言8.ppt(168页珍藏版)》请在沃文网上搜索。
1、第九章第九章查查 找找何谓查找表何谓查找表?查找表是由同一类型同一类型的数据元素(或记录)构成的集合集合。由于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。对查找表经常进行的对查找表经常进行的操作操作:1)查查询询某个“特定的”数据元素是否在查找表中;2)检检索索某个“特定的”数据元素的各种属性;3)在查找表中插入插入一个数据元素;4)从查找表中删去删去某个数据元素。仅作查询和检索操作的查找表。静态查找表静态查找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素。动态查找表动
2、态查找表查找表可分为两类查找表可分为两类:是数据元素(或记录)中某个数据项数据项的值,用以标识标识(识别)一个数据元素(或记录)。关键字关键字 若此关键字可以识别唯一的唯一的一个记录,则称之谓“主关键字主关键字”。若此关键字能识别若干若干记录,则称之谓“次关键字次关键字”。根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)。查找查找 若查找表中存在这样一个记录,则称“查找成功查找成功”。查找结果给出整个记录的信息,或指示该记录在查找表中的位置;否则称“查找不成功查找不成功”。查找结果给出“空记录”或“空指针”。由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查
3、找。为了提高查找的效率,需要在查找表中的元素之间人为地 附加某种确定的关系,换句话说,用另外一种结构来表示查找表用另外一种结构来表示查找表。如何进行查找?如何进行查找?查找的方法取决于查找表的结构。查找的方法取决于查找表的结构。9.1 静态查找表静态查找表9.2 动态查找树表动态查找树表9.3 哈希表哈希表9.1 静静 态态 查查 找找 表表数据对象数据对象D:数据关系数据关系R:D是具有相同特性的数据元素的集合。每个数每个数据元素含有类型相同的据元素含有类型相同的关键字关键字,可唯一标识数据元素。数据元素同属一个集合。ADT StaticSearchTable Create(&ST,n);D
4、estroy(&ST);Search(ST,key);Traverse(ST,Visit();基本操作基本操作 P:ADT StaticSearchTable构造一个含n个数据元素的静态查找表ST。Create(&ST,n);操作结果:销毁表ST。Destroy(&ST);初始条件:操作结果:静态查找表ST存在;若 ST 中存在其关键字等于 key 的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。Search(ST,key);初始条件:操作结果:静态查找表ST存在,key 为和查找表中元素的关键字类型相同的给定值;按某种次序对ST的每个元素调用函数Visit()一次且仅一次,一旦
5、Visit()失败,则操作失败。Traverse(ST,Visit();初始条件:操作结果:静态查找表ST存在,Visit是对元素操作的应用函数;typedef struct /数据元素存储空间基址,建表时 /按实际长度分配,0号单元留空 int length;/表的长度 SSTable;假设静态查找表静态查找表的顺序存储结构顺序存储结构为ElemType*elem;数据元素类型的定义为数据元素类型的定义为:typedef struct keyType key;/关键字域 /其它属性域 ElemType;,TElemType;一、顺序查找表一、顺序查找表二、有序查找表二、有序查找表三、静态查找
6、树表三、静态查找树表四、索引顺序表四、索引顺序表 以顺序表或线性链表表示静态查找表一、顺序查找表顺序查找表ST.elem回顾顺序表的查找过程:回顾顺序表的查找过程:假设给定值 e=64,要求 ST.elemk=e,问:k=?kkint location(SqList L,ElemType&e,Status(*compare)(ElemType,ElemType)k=1;p=L.elem;while(k=L.length&!(*compare)(*p+,e)k+;if(k=L.length)return k;else return 0;/locationST.elemiST.elemi60ike
7、y=64key=60i64int Search_Seq(SSTable ST,KeyType key)/在顺序表ST中顺序查找其关键字等于 /key的数据元素。若找到,则函数值为 /该元素在表中的位置,否则为0。ST.elem0.key=key;/“哨兵”for(i=ST.length;ST.elemi.key!=key;-i);/从后往前找 return i;/找不到时,i为0/Search_Seq 定义:定义:查找算法的平均查找长度平均查找长度 (Average Search Length)为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值 其中:n 为表长,Pi 为查找
8、表中第i个记录的概率,且 ,Ci为找到该记录时,曾和给定值比较过的关键字的个数。分析顺序查找的时间性能在等概率查找的情况下,顺序表查找的平均查找长度为:对顺序表顺序表而言,Ci=n-i+1ASL=nP1+(n-1)P2+2Pn-1+Pn 若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。在不等概率查找的情况下,ASLss 在 PnPn-1P2P1时取极小值 上述顺序查找表的查找算法简单,但平均查找长度较大,特别不适用于表长较大的查找表。二、有序查找表二、有序查找表 若以有序表有序表表示静态查找表,则查找过程可以基于“折半折半”进行。ST
9、.elemST.length例如例如:key=64 的查找过程如下:lowhighmidlow mid high midlow 指示查找区间的下界high 指示查找区间的上界mid=(low+high)/2int Search_Bin(SSTable ST,KeyType key)low=1;high=ST.length;/置区间初值 while(low 50时,可得近似结果 一般情况下,表长为 n 的折半查找的判定树的深度和含有 n 个结点的完全二叉树的深度相同。关键字:A B C D E Pi:0.2 0.3 0.05 0.3 0.15 Ci:2 3 1 2 3三、静态查找树表三、静态查找
10、树表 在不等概率查找不等概率查找的情况下,折半查找折半查找不是不是有序表最好的查找方法。例如例如:此时 ASL=20.2+30.3+10.05+20.3+30.15=2.4若改变Ci的值 2 1 3 2 3则 ASL=20.2+10.3+30.05+20.3+30.15=1.9 使 达最小的判定树称为最优二叉树,其中:定义定义:为计算方便,令 wi=pi选择二叉树的根结点,使 达最小 介绍一种次优二叉树的构造方法:为便于计算,引入累计权值和 并设 wl-1=0 和 swl-1=0,则推导可得023811 15 18 23例如例如:lh21 18 124310 18h9608EC21Ah53lh
11、G3013ECGABDF所得次优二叉树如下所示所得次优二叉树如下所示:查找比较查找比较“总次数总次数”=3 2+4 1+2 5+3 3 +1 4+3 3+2 5=52 查找比较查找比较“总次数总次数”=3 2+2 1+3 5+1 3 +3 4+2 3+3 5=59和折半查找相比较和折半查找相比较DBACFEGStatus SecondOptimal(BiTree&T,ElemType R,float sw,int low,int high)/由有序表Rlow.high及其累计权值表sw/递归构造次优查找树T。选择最小的选择最小的Pi值值 if(!(T=(BiTree)malloc(sizeof
12、(BiTNode)return ERROR;T-data=Ri;/生成结点构造次优二叉树的算法if(i=low)T-lchild=NULL;/左子树空else SecondOptimal(T-lchild,R,sw,low,i-1);/构造左子树 if(i=high)T-rchild=NULL;/右子树空 else SecondOptimal(T-rchild,R,sw,i+1,high);/构造右子树 return OK;/SecondOptimal次优查找树采用二叉链表的存储结构Status CreateSOSTre(SOSTree&T,SSTable ST)/由有序表 ST 构造一棵次优
13、查找树 T /ST 的数据元素含有权域 weight if(ST.length=0)T=NULL;else FindSW(sw,ST);/按照有序表 ST 中各数据元素 /的 weight 值求累计权值表 SecondOpiamal(T,ST.elem,sw,1,ST.length);return OK;/CreatSOSTree索引顺序表的查找过程:索引顺序表的查找过程:1)由索引确定记录所在区间;2)在顺序表的某个区间内进行查找。注意:索引可以根据查找表的特点来构造。可见,索引顺序查找索引顺序查找的过程也是一个“缩小区间缩小区间”的查找过程。索引顺序查找的平均查找长度索引顺序查找的平均查找
14、长度=查找查找“索引索引”的平均查找长度的平均查找长度 +查找查找“顺序表顺序表”的平均查找长度的平均查找长度ADT DynamicSearchTable 抽象数据类型抽象数据类型动态查找表动态查找表的定义如下:的定义如下:数据对象数据对象D:数据关系数据关系R:数据元素同属一个集合。D是具有相同特性的数据元素的集合。每个数据元素含有类型相同的关键字,可唯一标识数据元素。InitDSTable(&DT)基本操作基本操作P:DestroyDSTable(&DT)SearchDSTable(DT,key);InsertDSTable(&DT,e);DeleteDSTable(&T,key);Tra
15、verseDSTable(DT,Visit();ADT DynamicSearchTable操作结果:操作结果:构造一个空的动态查找表DT。InitDSTable(&DT);销毁动态查找表DT。DestroyDSTable(&DT);初始条件:操作结果:动态查找表DT存在;若DT中存在其关键字等于 key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。SearchDSTable(DT,key);初始条件:操作结果:动态查找表DT存在,key为和关键字类型相同的给定值;动态查找表DT存在,e 为待插入的数据元素;InsertDSTable(&DT,e);初始条件:操作结果:若DT中
16、不存在其关键字等于 e.key 的 数据元素,则插入 e 到DT。动态查找表DT存在,key为和关键字类型相同的给定值;DeleteDSTable(&T,key);初始条件:操作结果:若DT中存在其关键字等于key的数据元素,则删除之。动态查找表DT存在,Visit是对结点操作的应用函数;TraverseDSTable(DT,Visit();初始条件:操作结果:按某种次序对DT的每个结点调用函数 Visit()一次且至多一次。一旦 Visit()失败,则操作失败。9.2 动动 态态 查查 找找 树树 表表(n)(1)(n)(1)(nlogn)综合上一节讨论的几种查找表的特性:综合上一节讨论的几
17、种查找表的特性:查找 插入 删除无序顺序表 无序线性链表有序顺序表 有序线性链表 静态查找树表(n)(n)(logn)(n)(logn)(1)(1)(n)(1)(nlogn)1)从查找性能看,最好情况能达 (logn),此时要求表有序;2)从插入和删除的性能看,最好 情况能达(1),此时要求存储 结构是链表。可得如下结论:可得如下结论:一、二叉排序树(二叉查找树)一、二叉排序树(二叉查找树)二、二叉平衡树二、二叉平衡树三、三、B-树树四、四、B+树树五、键五、键 树树一、二叉排序树一、二叉排序树(二叉查找树)(二叉查找树)1定义定义2查找算法查找算法3插入算法插入算法4删除算法删除算法5查找性
18、能的分析查找性能的分析(1)若它的左子树不空,则左子树上 所有结点的值均小于根结点的值;1定义:定义:二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:(3)它的左、右子树也都分别是二叉 排序树。(2)若它的右子树不空,则右子树上 所有结点的值均大于根结点的值;503080209010854035252388例如例如:是二叉排序树。是二叉排序树。66不不 通常,取二叉链表作为二叉排序树的存储结构typedef struct BiTNode /结点结构结点结构 struct BiTNode *lchild,*rchild;/左右孩子指针 BiTNode,*BiTree;TElemType d
19、ata;2二叉排序树的查找算法:二叉排序树的查找算法:1)若给定值等于等于根结点的关键字,则查找成功查找成功;2)若给定值小于小于根结点的关键字,则继续在左子树上进行查找继续在左子树上进行查找;3)若给定值大于大于根结点的关键字,则继续在右子树上进行查找继续在右子树上进行查找。否则,若二叉排序树为空为空,则查找不成功查找不成功;50308020908540358832例如例如:二叉排序树二叉排序树查找关键字查找关键字=50,505035,503040355090,50809095,从上述查找过程可见,从上述查找过程可见,在查找过程中,生成了一条查找路径查找路径:从根结点出发,沿着左分支或右分支
20、从根结点出发,沿着左分支或右分支逐层向下直至关键字等于给定值的结点逐层向下直至关键字等于给定值的结点;或者 从根结点出发,沿着左分支或右分支从根结点出发,沿着左分支或右分支逐层向下直至指针指向空树为止。逐层向下直至指针指向空树为止。查找成功查找成功 查找不成功查找不成功算法描述如下:算法描述如下:Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree&p)/在根指针在根指针 T 所指二叉排序树中递归地查找其所指二叉排序树中递归地查找其 /关键字等于关键字等于 key 的数据元素,若的数据元素,若查找成功查找成功,/则返回指针则返回指针 p 指
21、向该数据元素的结点,并返指向该数据元素的结点,并返回回 /函数值为函数值为 TRUE;/SearchBST 否则表明否则表明查找不成功查找不成功,返回,返回 /指针指针 p 指向查找路径上访问的最后一个结点,指向查找路径上访问的最后一个结点,/并返回函数值为并返回函数值为FALSE,指针指针 f 指向当前访问指向当前访问 /的结点的双亲,其初始调用值为的结点的双亲,其初始调用值为NULLif(!T)else if(EQ(key,T-data.key)else if(LT(key,T-data.key)else p=f;return FALSE;/查找不成功 p=T;return TRUE;/查
22、找成功SearchBST(T-lchild,key,T,p);/在左子树中继续查找SearchBST(T-rchild,key,T,p);/在右子树中继续查找30201040352523fT设 key=48fTfT22pfTfTTTTfffp根据动态查找表的定义,“插入插入”操作在操作在查找不成功查找不成功时才进行时才进行;3二叉排序树的插入算法二叉排序树的插入算法若二叉排序树为空树空树,则新插入的结点为新的根结点新的根结点;否则,新插入的结点必为一个新的叶子结点新的叶子结点,其插入位置插入位置由查找过程得到。Status Insert BST(BiTree&T,ElemType e)/当二叉
23、排序树中不存在关键字等于当二叉排序树中不存在关键字等于 e.key 的的 /数据元素时,插入元素值为数据元素时,插入元素值为 e 的结点,并返的结点,并返 /回回 TRUE;否则,不进行插入并返回否则,不进行插入并返回FALSE if(!SearchBST(T,e.key,NULL,p)else return FALSE;/Insert BST s=(BiTree)malloc(sizeof(BiTNode);/为新结点分配空间s-data=e;s-lchild=s-rchild=NULL;if (!p)T=s;/插入 s 为新的根结点else if(LT(e.key,p-data.key)p
24、-lchild=s;/插入*s 为*p 的左孩子else p-rchild=s;/插入*s 为*p 的右孩子return TRUE;/插入成功(1)被删除的结点是叶子;(2)被删除的结点只有左子树或者只有右子树;(3)被删除的结点既有左子树,也有右子树。4二叉排序树的删除算法二叉排序树的删除算法可分三种情况讨论:和插入相反,删除在查找成功查找成功之后进行,并且要求在删除二叉排序树上某个结点之后,仍仍然保持二叉排序树的特性然保持二叉排序树的特性。50308020908540358832(1)被删除的结点是叶子结点叶子结点例如例如:被删关键字被删关键字=2088其双亲结点中相应指针域的值改为其双亲
25、结点中相应指针域的值改为“空空”50308020908540358832(2)被删除的结点只有左子树只有左子树或者只有右子树只有右子树 其双亲结点的相应指针域的值改为其双亲结点的相应指针域的值改为“指向被删除结点的左子树或右子树指向被删除结点的左子树或右子树”。被删关键字被删关键字=408050308020908540358832(3)被删除的结点既有左子树,也有右子树既有左子树,也有右子树4040以其前驱替代之,然以其前驱替代之,然后再删除该前驱结点后再删除该前驱结点被删结点前驱结点被删关键字被删关键字=50Status DeleteBST(BiTree&T,KeyType key)/若二叉
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
10 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言