块状链表(分块)2016.10.3

参考:http://dongxicheng.org/structure/blocklink/苏煜《对块状链表的一点研究》一、概述我们常用的两种线性数据结构是数组和链表,它们各有优缺点数组特点是元素在内存中紧挨着存储,因而优点是定位快 O(1),缺点是插入删除慢 O(n)而链表则不同,它通过指针将不同位置的元素链接起来,因而优缺点与数组正好相反:定位慢 O
摘要由CSDN通过智能技术生成

参考:http://dongxicheng.org/structure/blocklink/

苏煜《对块状链表的一点研究》


一、概述

我们常用的两种线性数据结构是数组和链表,它们各有优缺点

数组特点是元素在内存中紧挨着存储,因而优点是定位快 O(1),缺点是插入删除慢 O(n)

而链表则不同,它通过指针将不同位置的元素链接起来,因而优缺点与数组正好相反:定位慢 O(n),插入删除快 O(1)


块状链表:将数组和链表的优点结合来,各种操作的时间复杂度均为 O(sqrt(n))


二、块状链表

从整体上看,块状链表是一个链表, 而在链表的每个节点上,以数组的形式存储一组元素

所谓的“块状”链表如图所示



三、基本操作

1、定位

先定位元素所在的链表节点,然后再定位该元素在数组中的位置

从链表头开始往后扫,每个节点记录本节点合法数据的长度,最终会定位为某一个块及块内偏移


2、分裂

将某个节点分裂成两个节点



3、插入

首先定位要插入的位置,然后将所在节点分裂成两个节点,并将数据放到第一个节点的末尾

如果要插入的是一大块数据,首先要将数据切成多个block(每个block对应一个块状链表的一个节点)并将这些block链起来,然后将它们插入那两个节点之间



4、删除

首先定位删除元素的位置,然后按照数组删除元素的方法删除该数据

如果删除一大块数据,首先要定位数据块首元素和末元素所在的位置,然后分别将它们所在的节点分裂成两个节点,最后删除首元素和末元素之间的节点即可



5、及时合并小分块




四、关键点和复杂度分析

该算法的核心是确定链表长度和每个节点的数组长度,以及怎么保证这个数组长度值?

设块状链表中元素总个数为 x,链表长度为 n,每个节点中数据长度为 m,则当 m=n=sqrt(x) 时,可保证 m 和 n 同时最小,此时各种操作的时间复杂度最低

在实际应用时,需维持块状链表的每个节点大小在 [sqrt(n)/2, 2*sqrt(n)],否则,块状链表会退化

维护方法是,适当的时候,对节点进行合并与分裂(维护本身不会使复杂度增加)



五、例题

1、BZOJ 1507 [NOI2003] Editor

参考:

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值