算法导论 11.2-4 散列表内未占用槽链接成自由链表

本文探讨了如何使用散列表并通过自由链表管理未占用槽位,以实现O(1)期望运行时间的字典操作。在散列表中,未占用的槽位被链接成一个自由链表,用于动态分配和释放存储空间。插入、删除和查找操作的详细步骤被逐一分析,确保高效执行。
摘要由CSDN通过智能技术生成

一、题目

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


二、思考

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

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

struct node
{
	int key;
	bool flag;//0:free,1:used
	int pre;
	int next;
};


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

struct node
{
	int key;//没有意义,初始化为-1
	bool flag;//0:free
	int pre;//自由链表中上一个空闲slot,没有则为-1
	int next;//自由链表中下一个空闲slot,没有则为-1
};

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

struct node
{
	int key;//关键字
	bool flag;//1:used
	int pre;//具有相同Hash值的下一个结点
	int next;//具有相同Hash值的上一个结点
};

 

插入操作时,从自由链表中取出一个空闲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&#

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值