直接寻址法hash

来源:互联网 发布:贝叶斯网络引论 编辑:程序博客网 时间:2024/06/11 14:03

我们希望通过利用在一个非常大的数组上直接寻址的方式来实现字典。开始时,该数组中可能包含废料,但要对整个数组进行初始化时不实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个储存的对象占用O(1)的空间;操作SEARCH,INSERT和DELETE的时间为O(1);对数据结构初始化的时间为O(1)。(提示:可以利用另外一个栈,其大小等于实际存储在字典中的关键字数目,以帮助确定大型数组中某个给定的项是否是有效的。)

数组T表示直接寻址表,栈S中储存有效关键字。故S的大小等于有效关键字的数量。栈S用数组实现,为其分配的空间大小应为字典的最大条目数。如果关键字k在T中是有效的,则T[k]储存一个索引值j,使得S[j]=k,1<=T[k]<=top[S],S[T[k]]=k,T[S[j]]=j。
假设直接寻址表中还需要储存指向对象的指针,则可以将它们储存到一个与T和S平行的数组S'中(为S'分配的空间应与S等大)。如果字典中的一个对象x对应关键字k,那么S'[T[k]]指向x。

下面是有关字典的一些操作:

Initialization:top[S]置零;

SEARCH:对于给定的关键字k,检测(1<=T[k]<=top[S] and S[T[k]]=k)是否成立,如果成立则返回S'[T[K]],否则返回NIL。

INSERT:以关键字k插入对象x,假设这个对象不在字典中,操作如下:
    top[S]<-top[S]+1
    S[top[S]]<-k
    S'[top[S]]<-x
    T[k]<-top[S]

DELETE:删除关键字k对应的对象x,假设这个对象在字典中,操作如下:
    S[T[k]]<-S[top[S]]
    S'[T[k]]<-S'[top[S]]
    T[S[T[k]]]<-T[k]
    T[k]<-0
    top[S]<-top[S]-1

以上每种操作都能在O(1)时间内完成。

原创粉丝点击