您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 是由同一类型的数据元素(或记录)构成的集合
第九章查找表查找表是由同一类型的数据元素(或记录)构成的集合。对查找表经常进行的操作:1)查询某个“特定的”数据元素是否在查找表中;2)检索某个“特定的”数据元素的各种属性;3)在查找表中插入一个数据元素;4)从查找表中删去某个数据元素。静态查找表仅作上述1)和2)操作的查找表动态查找表有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入查找表;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)若此关键字可以识别唯一的一个记录,则称之谓“主关键字”若此关键字能识别若干记录,则称之谓“次关键字”查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)若查找表中存在这样一个记录,则称“查找成功”,查找结果:给出整个记录的信息,或指示该记录在查找表中的位置;否则称“查找不成功”,查找结果:给出“空记录”或“空指针”如何进行查找?取决于查找表的结构,即:记录在查找表中所处的位置。然而,查找表本身是一种很松散的结构,因此,为了提高查找的效率,需要在查找表中的元素之间人为地附加某种确定的关系,换句话说,用另外一种结构来表示查找表。本章讨论的重点:查找表的各种表示方法及其相应的查找算法9.1静态查找表ADTStaticSearchTable{数据对象D:D是具有相同特性的数据元素的集合。每个数据元素含有类型相同的关键字,可唯一标识数据元素。数据关系R:数据元素同属一个集合。基本操作P:Create(&ST,n);操作结果:构造一个含n个数据元素的静态查找表ST。Destroy(&ST);初始条件:静态查找表ST存在;操作结果:销毁表ST。Search(ST,key);初始条件:静态查找表ST存在,key为和查找表中元素的关键字类型相同的给定值;操作结果:若ST中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。Traverse(ST,Visit());初始条件:静态查找表ST存在,Visit是对元素操作的应用函数;操作结果:按某种次序对ST的每个元素调用函数Visit()一次且仅一次,一旦Visit()失败,则操作失败。}ADTStaticSearchTableC++的语言描述:templateclassElemclassSSTable{public:virtualElem*Search(KeyTypekey);//若静态查找表中存在其关键字和key相等的//元素,则返回指向该元素的指针,否则返回//“空”指针。virtualvoidTraverse(voidvisit(Elem&item));//按某种次序对静态查找表中每个元素调用//函数visit()一次且仅一次。};//SSTable下面讨论静态查找表的各种实现方法一、顺序查找表以顺序表或线性链表表示静态查找表templateclassElemclassSqSTable:publicSSTable{private:SqListElemST;public:SqSTable(intsize);//构造函数SqSTable(SqSTablera);//复制构造函数SqSTable(intsize,constElem*elemVal);//构造一个含size个元素的静态查找表,//其元素值由elemVal给出。~SqSTable(void){};//析构函数virtualElem*Search(KeyTypekey);//若顺序查找表中存在其关键字和key相等//的数据元素,则返回指向该元素的指针,//否则返回“空指针”。virtualvoidTraverse(voidvisit(Elem&item));//对顺序查找表中每个元素,依次顺序调用函数//visit一次,并且仅调用一次};//SqSTable在此重点讨论“查找”算法的实现。templateclassElemElem*SqSTableElem::Search(KeyTypekey){inti;ifSTElem.location(key,i)returngetElem(i)elsereturnNULL}回顾顺序表的查找算法:templateclassElemintSqList::location(constElem&e){Elem*p;intk=1;p=elemPtr;while(k=cursize&&(compare(*p++,e)))k++;if(k=cursize)returnk;elsereturn0;}//location上述算法中的基本操作是:compare,为了避免“出界”,同时需作k=cursize的判断,在表长1000时,将使算法的执行时间几乎增加一倍。为此,改写顺序表的查找算法如下:templateclassElemintSqListElem::Search_Seq(constKeyTypekey){//在顺序表ST中顺序查找其关键字等于key的数//据元素。若找到,则函数值为该元素在表中的位//置,否则为0。elemPtr[0].key=key;//设“哨兵”inti=cursize;//令i指向表尾,从后往前搜索while(compare(elemPtr[i].key,key))i--;returni;//找不到时,i为0}//Search_Seq定义:查找算法的平均查找长度(AverageSearchLength)为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值niiiCPASL1其中:n为表长,Pi为查找表中第i个记录的概率,且11niiPCi为找到该记录时,曾和给定值比较过的关键字的个数对顺序表而言,Ci=n-i+1ASL=nP1+(n-1)P2++2Pn-1+Pn在等概率查找的情况下,nPi1顺序表查找的平均查找长度为:21111n)i(nnASLniss在不等概率查找的情况下,ASLss在PnPn-1P2P1时取极小值若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。二、有序查找表上述顺序查找表的查找算法简单,但平均查找长度较大,特别不适用于表长较大的查找表以有序表表示静态查找表templateclassElemclassOrdSTable:publicSSTable{pravite:OrderedListElemST;…};//OrdSTable此时的查找算法可基于折半查找来完成intOrderedListElem::Search_Bin(KeyTypekey){//在有序表中折半查找其关键字等于key的记录。//若找到,则返回该记录在表中的位置,否则为0。low=1;high=ST.length;//置区间初值while(low=high){mid=(low+high)/2;//取查找区间的中间位置if(EQ(key,elemPtr[mid].key))returnmid;//找到待查记录elseif(LT(key,elemPtr[mid].key))high=mid-1;//继续在前半区间进行查找elselow=mid+1;//继续在后半区间进行查找}return0;//有序表中不存在待查记录}//Search_Bin分析折半查找的平均查找长度先看一个具体的情况,假设:n=11i1234567891011Ci34234134234构造一棵二叉树,将Ci=i的结点放在这棵树的第i层用以描述折半查找的过程,称之谓“判定树”例如:折半查找在n=11时的判定树6391471025811一般情况下,表长为n的折半查找的判定树的深度和含有n个结点的完全二叉树的深度相同假设n=2h-1并且查找概率相等则1)1(log12112111nnnjnCnASLhjjniibs在n50时,可得近似结果1)1(log2nASLbs三、静态查找树表在不等概率查找的情况下,折半查找不是最好的查找方法例如:关键字:ABCDEPi:0.20.30.050.30.15Ci:23123此时的ASL=2.4若改变Ci的值21323则ASL=1.9定义:使111niniiCqipiCiASL达最小的判定树称为最优二叉树,其中:1111niniqipi构造最优二叉树的时间复杂度为(n3)介绍一种次优二叉树的构造方法:令wi=pi选择二叉树的根结点,使111ijjhijjiwwP达最小构造次优二叉树的算法StatusSecondOptimal(BiTree&T,ElemTypeR[],floatsw[],intlow,inthigh){//由有序表R[low..high]及其累计权值表sw//(其中sw[0]==0)递归构造次优查找树T。i=low;min=abs(sw[high]-sw[low]);dw=sw[high]+sw[low-1];for(j=low+1;j=high;++j)//选择最小的ΔPi值ifabs(dw-sw[j]-sw[j-1])min){i=j;min=abs(dw-sw[j]-sw[j-1]);}if(!(T=(BiTree)malloc(sizeof(BiTNode))))returnERROR;T-data=R[i];//生成结点if(i==low)T-lchild=NULL;//左子树空elseSecondOptimal(T-lchild,R,sw,low,i-1);//构造左子树if(i==high)T-rchild=NULL;//右子树空elseSecondOptimal(T-rchild,R,sw,i+1,high);//构造右子树returnOK;}//SecondOptimal次优查找树采用二叉链表的存储结构templateclassElemclassSOSTable:publicSSTable{pravite:SOSTreeElemST;…};//SOSTableSOSTableElem::SOSTable(OrderedListst){//由有序表st构造一棵次优查找树ST//ST的数据元素含有权域weightif(st.length=0)T=NULL;else{FindSW(sw,ST);//按照有序表ST中//各数据元素的weight域//求累计权值表swSecondOpiamal(T,ST.elem,sw,1,ST.length);}returnOK;}//SOSTree四、索引顺序表对比顺序表和有序表的查找性能之差别:顺序表有序表表的特性无序表有序表存储结构顺序结构或链表结构链表结构插删操作易于进行需移动元素ASL值大小索引顺序表=索引+顺序表一般情况下,索引是一个有序表查找方法:1)由索引确定记录所在区间;2)在顺序表的某个区间内进行查找。所以,这也是一种缩小区间的查找方法索引顺序表的平均查找长度为在索引中进行查找的平均查找长度和在顺序表中进行查找的平均查找长度之和。抽象数据类型动态查找表的定义如下:ADTDynamicSearchTable{数据对象D:D是具有相同特性的数据元素的集合。每个数据元素含有类型相同的关键字,可唯一标识数据元素。数据关系R:数据元素同属一个集合。基本操作P:InitDSTable(&DT);操作结果:构造一个空的动态查找表DT。DestroyDSTable(&DT);初始条件:动态查找表DT存在;操作结果:销毁动态查找表DT。SearchDSTable(DT,key);初始条件:动态查找表DT存在,key为和关键字类型相同的给定值;操作结果:若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或在表中的位置,否则为“空”。InsertDSTable(&DT,e);初始条件:动态查找表
本文标题:是由同一类型的数据元素(或记录)构成的集合
链接地址:https://www.777doc.com/doc-3541549 .html