简单说就是按照哈希函数关系建立的表具体内容请参考数据结构相关知识~下面引用一些别的地方
1基本原理我们使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方。但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中。后面我们将看到一种解决"冲突"的简便做法。总的来说,"直接定址"与"解决冲突"是哈希表的两大特点。
2函数构造构造函数的常用方法(下面为了叙述简洁,设h(k)表示关键字为k的元素所对应的函数值):a)除余法:选择一个适当的正整数p,令h(k)=kmodp这里,p如果选取的是比较大的素数,效果比较好。而且此法非常容易实现,因此是最常用的方法。b)数字选择法:如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值。
3冲突处理线性重新散列技术易于实现且可以较好的达到目的。令数组元素个数为S,则当h(k)已经存储了元素的时候,依次探查(h(k)+i)modS,i=1,2,3……,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误。当然这是可以通过扩大数组范围避免的)。
4支持运算哈希表支持的运算主要有:初始化(makenull)、哈希函数值的运算(h(x))、插入元素(insert)、查找元素(member)。设插入的元素的关键字为x,A为存储的数组。初始化比较容易,例如constempty=maxlongint;//用非常大的整数代表这个位置没有存储元素p=9997;//表的大小proceduremakenull;vari:integer;beginfori:=0top-1doA[i]:=empty;End;哈希函数值的运算根据函数的不同而变化,例如除余法的一个例子:functionh(x:longint):Integer;beginh:=xmodp;end;我们注意到,插入和查找首先都需要对这个元素定位,即如果这个元素若存在,它应该存储在什么位置,因此加入一个定位的函数locatefunctionlocate(x:longint):integer;varorig,i:integer;beginorig:=h(x);i:=0;while(i<S)and(A[(orig+i)modS]<>x)and(A[(orig+i)modS]<>empty)doinc(i);//当这个循环停下来时,要么找到一个空的存储单元,要么找到这个元//素存储的单元,要么表已经满了locate:=(orig+i)modS;end;插入元素procedureinsert(x:longint);varposi:integer;beginposi:=locate(x);//定位函数的返回值ifA[posi]=emptythenA[posi]:=xelseerror;//error即为发生了错误,当然这是可以避免的end;查找元素是否已经在表中proceduremember(x:longint):boolean;varposi:integer;beginposi:=locate(x);ifA[posi]=xthenmember:=trueelsemember:=false;end;这些就是建立在哈希表上的常用基本运算。
上一篇:日语的一级学科是什么
下一篇:炫耀 的近义词