块状链表

一,块状链表

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

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

而链表则不同,它通过指针将不同位置的元素链接起来,因而优缺点与数组正好相反:

定位慢 O(n),插入删除快 O(1)

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

二:块状链表的操作

1.定位

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

2.分裂

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

3、插入

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

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

4.删除

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

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

5、及时合并小分块

注意

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

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

来自:https://blog.csdn.net/Only_AiR/article/details/52592912

posted @ 2019-11-02 14:27  月亮茶  阅读(416)  评论(1编辑  收藏  举报