块状链表的长度
2026-04-14
0.引入
块状链表就是一个链表,每个节点指向一个空间大小为
给定参数
给定总元素数量
注:这里的
1.维护策略
为了完整描述这个策略,只需要考虑块状链表上的两个操作:插入和删除。
在某个节点中插入元素时,如果节点指向的数组未满,就直接在该数组中插入元素即可。
在某个节点中插入元素时,如果节点指向的数组已满,我们不得不开辟一个新的节点。此时,执行分裂操作,把数组中的元素尽可能均分到原节点和新节点,然后插入那个元素。这样操作的结果是,元素个数为
在某个节点中删除元素时,先在数组中删除这个元素,如果删除后节点为空则直接删除该节点。然后考虑该节点是否可以和左相邻的节点合并,如果数组元素个数之和
2.直观
直觉上,“分裂” 和 “合并” 让数组不会过于空。具体地,“分裂” 让分裂出的数组都至少有
- 任意一个数组的元素个数都
- 任意两个相邻数组的元素个数和都
性质
实际上,把数组的平均元素个数控制在
首先,通过不断插入得到这样的链表,数组元素个数序列如下:
然后,对奇数位置反复删除至
最后,对所有的
此时,数组的平均元素个数为
幸运的是,
3.证明
引理 1:任何时刻,对于链表上连续的两个节点,其数组元素个数分别为
证明:
对数组操作进行数学归纳:
base case:当链表为空时,命题平凡成立。
case 1:如果最后一步是不产生分裂的插入,那么设受到影响的区间是
case 2:如果最后一步是产生分裂的插入,那么设受到影响的区间是
注意,这里的
case 3:如果最后一步是不产生合并的删除,那么设受到影响的区间是
case 4:如果最后一步是产生合并的删除,那么设受到影响的区间是
证毕。
引理 2:任何时刻,对于链表上连续的三个节点,其数组元素个数分别为
证明:
对数组操作进行数学归纳:
base case:当链表为空时,命题平凡成立。
case 1:如果最后一步是不产生分裂的插入,那么设受到影响的区间是
和 保持了性质,是因为 保持了性质。如果 ,那么由引理 1, ,那么如果 ,可知 ;如果 ,那么由归纳假设, ,
case 2:如果最后一步是产生分裂的插入,那么设受到影响的区间是
保持了性质,是因为 ,若 ,则 和 保持了性质,是因为 保持了性质,是因为 ,若 ,则
case 3:如果最后一步是不产生合并的删除,那么设受到影响的区间是
case 4:如果最后一步是产生合并的删除,那么设受到影响的区间是
和 保持了性质,是因为 保持了性质,是因为由引理 1, 和 必有一个 ,不妨设是 ,那么由于 满足性质,可以知道 或 ,而 ,如果 ,则 ,如果 ,则
证毕。
引理 3:任何时刻,对于链表上连续的三个节点,其数组元素个数分别为
证明:
显然,节点非空,所以
如果
如果
结论:
证明:
这等价于
若
若
若
证毕。
4.补充
在实践中,链表操作和数组操作速度不同,要最小化的目标为
评论区
最新评论
--