数据结构与算法经典问题解析(Java语言描述)——松散链表

综述:
松散链表是单向链表的一种简单变种,松散链表中的每个结点存储多个元素,简称为块,而每一块中的所有结点由循环链表链接在一起。如下图所示:
松散链表
假设在任何时候松散链表中元素的个数不超过n。为了简化问题,假设除了最后一块外,所有块恰好含有⌈√n⌉个元素。所以,在任何时候,松散链表中块的个数不会超过⌊√n⌋。
1.在松散链表中查找一个元素
在松散链表中查找第k个结点的时间开销为O(√n):
1)遍历块链表找到包含第k个结点的块,即⌈k/⌈√n⌉⌉个块。因为遍历过程最多经过√n个块,所以其时间开销是O(√n)。
2)在这个块的循环链表找到第(k mod ⌈√n⌉)个结点。这个过程也需要O(√n)的时间开销,因为单个块中的结点数不大于⌈√n⌉。
2.在松散链表中插入一个元素
插入操作
在插入结点时,可能需要重新调整松散链表使其保证前面提到的链表属性,即每个块包含⌈√n⌉个结点。
假设要再第i个结点的后面插入结点x,且将x放在第j块中。在第j块和第j块以后的块中的结点都需要向表尾移动,如果链表中最后一个块的空间不足,已经超过了⌈√n⌉个结点了,则还需要向表尾添加一个新块。
3.执行移动操作
每次移动操作包含从块中的循环链表的表尾移除一个结点并在下一个块中的循环链表的表头插入一个结点,时间开销仅为O(1).所以,松散链表插入操作的总时间开销是O(√n)。因为最多有O(√n)个块,所以最多执行O(√n)次操作。
(由于操作过程需要画多个图,加上我的画图本领还处于起步阶段,我就拍张书上的照片放上了。)
移动结点操作
4.性能
松散链表在时间和空间上都表现优秀!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值