首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

算法导论-11.2-四

2013-11-08 
算法导论-11.2-4题目:说明在散列表内部,如何通过将所有未占用的槽位链成一个自由表,来分配和去配元素的存

算法导论-11.2-4

题目:

说明在散列表内部,如何通过将所有未占用的槽位链成一个自由表,来分配和去配元素的存储空间。假定一个槽位可以存储一个标志、一个元素加上一个或两个指针。所有的字典操作和自由链表操作应具有O(1)的期望运行时间。该自由链表是双链表吗?或者,是不是单链表就足够了?

思考:

已知(1)所有未占用的槽位链成一个自由链表(2)槽位即slot(3)Hash(x)返回x所属于的slot

一个slot存储以下内容,占用和未占用时表示的含义不同


当这个slot未占用时,取值如下:

当这个slot被占用时,取值如下:

 

插入操作时,从自由链表中取出一个空闲slot,填入关键字x,修改指针,链表相应的队列中,具体可以分为以下几种情况:

(1)x所属的slot未被占用,则

step1:把这个slot从自由链表中移出

step2:填入关键字x

step3:修改指针,在这种情况下其next和pre都置为-1

(2)x所属的slot已经被占用,令占用这个slot的关键是y,y也属于这个slot,则

step1:从自由链表中取出一个空闲的slot,这个slot肯定不是x所属的slot,只是拿过来用

step2:填入关键字x

step3:修改指针,把slot链表入到“以x所属的slot为头结点的队列”中

(3)x所属的slot已经被占用,令占用这个slot的关键是y,y不属于这个slot,通过(2)可知,这个情况是有可能的

step1:从自由链表中取出一个空闲的slot,这个slot肯定不是x所属的slot,也不是y所属的slot,只是拿过来用

step2:在新slot中填入关键字y,修改指针,让y使用这个新slot,而把原来的slot空出来还给x

step3:在x所属的slot中填入关键字x

step4:修改“x所属的slot”指针,类似(1)-step3

 

删除操作时,令待删除的关键字是x,释放x所占用的slot,具体可以分为以下几种情况

(1)x所占用的slot正是x所属的slot,且slot->next=-1,即所有关键字中只有x属于这个slot,x被删除后,slot就空闲了

step1:释放slot到自由链表中

(2)x所占用的slot正是x所属的slot,但还有别的关键字中只有x属于这个slot,应该优先使用关键所属于的slot,而释放“不自己关键字的、临时拿过来用的”slat

step1:从以slot为头结点的队列中另选一个slot2,slot2的关键字属于slot而不属于slot2,只是因为slot被占用,所以才用slot2

step2:把slot2的内容填入slot

step3:修改指针,让slot代替slot2存在于队列中,不同的是slot还是队列头

step4:释放slot2到自由链表中

(3)x所占用的slot不是x所属的slot,这个种情况下,这个slot一定不是队列头,还有别的关键字存在于队列中,并且占用了x所属的slot

step1:把x所占用的slot从“以x所属的slot为头的队列”中移出

step2:释放slot到自由链表中

 

查找操作,如果理解了插入和删除,查找操作就比较简单了,令待查找的关键字是x,也可分为几种情况

(1)x所属的slot未被占用,即不存在与x相同slot的关键字,当然也不存在x了

(2)x所属的slot被占用了,但它所存的关键不属于这个slot,与(1)相同,不存在与x相同slot的关键字

(3)x所属的slot被占用了,且它所存的关键属于这个slot,即存在与x相同slot的关键字,只是不知这个关键字是不是x,需要进一步查找

 

插入和删除过程中反复提到的“从自由链表中取出一个空闲的slot”和“释放slot到自由链表中”这两个操作比较简单,见代码中的解释

 

代码:


 

 

1楼liuzhanchen1987昨天 20:52
代码好多,注释很详细!很好!

热点排行