关闭

块状链表及其实现

标签: 数据结构块状链表
189人阅读 评论(0) 收藏 举报
分类:

数组和链表是编程中存储数据的常用方法,两者都用优缺点,数组根据下标直接访问元素,但数组是静态的,有时会造成空间的浪费;链表可以动态申请空间,但访问需要进行遍历。于是乎,块状链表就出来了。

块状链表的结构如下图:


每个节点存储m个数据。节点的定义如下:

struct data{
	int s,a[2*m+5];
	data *next;
};
data *root;

next指向下一个节点,s是该节点的存储的实际数据的大小,a是存储数据的数组。

块状链表支持数据的插入、删除、查询等操作。

(1)插入(insert):数据插入的时候,插入的位置(pos)必须是合法的,也就是说不能大于数据的总数(n)。

数据插入过程:首先找到Pos位于哪个节点中,先将该节点pos及pos后面的数据(如果存在的话)向后移一位,然后将值x插入,将s加1。每个节点的存储的数据上限为2*n,如果达到这个上限,这需要在该节点后面新加一个节点,将m+1到2*m的数据复制到新建的节点。


void insert(int x,int pos){
	if(root == NULL){
		root = new(data);
		root->s = 1;
		root->a[1] = x;
		return ;
	}
	data *k = root;
	while(pos > k->s && k->next != NULL){
		pos -= k->s;
		k = k->next;
	}
	memmove(k->a+pos+1,k->a+pos,sizeof(int)*(k->s - pos +1));
	k->s++;
	k->a[pos] = x;
	if(k->s == 2*m){
		data *t = new(data);
		t->next = k->next;
		k->next = t;
		memcpy(t->a+1,k->a+m+1,sizeof(int)*m);
		t->s = k->s = m;
	}
}

(2)删除(delete):插入和删除类似,首先找到pos所在的节点,把Pos后面的数据向前移动一位,然后该节点的s-1。


void del(int pos){
	data *k = root;
	while(pos > k->s && k->next != NULL){
		pos -= k->s;
		k = k->next;
	}
	memmove(k->a+pos,k->a+pos+1,sizeof(int)*(k->s - pos));
	k->s--;
}

(3)查找(find):查找位置为Pos的数,找到pos所在节点,返回该值即可。


int find(int pos){
	data *k = root;
	while(pos > k->s && k->next != NULL){
		pos -= k->s;
		k = k->next;
	}
	return k->a[pos];
}


(此段from:点击打开链接)(董的博客)

关键点和复杂度分析

该算法的核心是确定链表长度和每个节点的数组长度,以及怎么保证这个长度值?设块状链表中元素总个数为X,链表长度为n,每个节点中数据长度为m,则当m=n=sqrt(X)时,可保证m和n同时最小,此时各种操作的时间复杂度最低。在实际应用时,需维持块状链表的每个节点大小在[sqrt(n)/2, 2*sqrt(n)],否则,块状链表会退化。维护方法是,适当的时候,对节点进行合并与分裂(维护本身不会使复杂度增加)。


0
0
查看评论

bzoj 1507: [NOI2003]Editor (块状链表)

1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 3164  Solved: 1276 [Submit][Status][D...
  • clover_hxy
  • clover_hxy
  • 2016-06-17 20:23
  • 637

块状链表之代码剖析

对块状链表不熟悉的请移步 块状链表解析 1.链表节点(block): block加入模板 template 构造函数 block(block* to,block* p):next(to),pre(p) ①:属性 ElemType data[MAXN]; int l...
  • bin314
  • bin314
  • 2012-08-23 16:14
  • 2341

块状链表(附NOI 2003 Editor,POJ 2131 Key Insertion)

这两天学习了一下块状链表,也谈不上学习,可以说是练习。因为块状链表这种东西,猛一听起来好像很高端,但是拆开来说就是:分块+链表。根本上就是暴力,就是分块。只不过“分”的对象从数组变成了链表而已。知道了是什么,顺水推舟的就会写了——如果写过分块。块状链表==分块+链表==数组+链表。链表上的每一个节点...
  • qq_25978793
  • qq_25978793
  • 2015-12-22 19:32
  • 901

块状链表(分块)2016.10.3

参考:http://dongxicheng.org/structure/blocklink/ 苏煜《对块状链表的一点研究》 一、概述 我们常用的两种线性数据结构是数组和链表,它们各有优缺点 数组特点是元素在内存中紧挨着存储,因而优点是定位快 O(1),缺点是插入删除慢 O(n) 而链表则...
  • Only_AiR
  • Only_AiR
  • 2016-09-21 10:34
  • 603

块状链表基本操作及相关例题

部分内容参考自 论文 苏煜《对块状链表的一点研究》 1. 数组和链表对比: 数组和链表对比 操作 数组 链表 存储结构 地址连续的存储单元,物理位置相邻 地址不连续,物理位置不相邻 定位 O(1...
  • bin314
  • bin314
  • 2012-08-23 14:50
  • 5536

块状链表 代码小记

含有简单教程
  • lycheng1215
  • lycheng1215
  • 2017-12-09 10:42
  • 35

初识块状数组/块状链表(讲解+ 例题)

As we all known.数组定位的复杂度为O(1),插入删除的复杂度是O(n) 链表定位的复杂度是O(n),插入删除的复杂度是O(1) 块状数组结合了链表和数组的优点,使得所有操作的复杂度均为O(√n) 代码:#include #include #include #include #...
  • qq_30241305
  • qq_30241305
  • 2016-07-30 16:48
  • 2029

块状链表基本操作及其相关例题

http://blog.csdn.net/bin314/article/details/7899934 部分内容参考自 论文 苏煜《对块状链表的一点研究》 1. 数组和链表对比:   数组和链表对比 操作 数组 链表 存储结构 ...
  • miao6664659
  • miao6664659
  • 2012-12-17 10:51
  • 696

数据结构:块状链表

已转到:http://www.wypblog.com/archives/166一、概述           有时候我们需要设计这样一种数据结构:它能快速在要求位置插入或者删除一段数据。先考虑...
  • w397090770
  • w397090770
  • 2012-12-15 21:32
  • 11436

【POJ2887】【块状链表】Big String

【POJ2887】【块状链表】Big String 转载自:http://www.cnblogs.com/hoskey/p/4322417.html Description You are given a string and supposed to...
  • zsc2014030403015
  • zsc2014030403015
  • 2016-04-22 11:32
  • 332
    个人资料
    • 访问:45102次
    • 积分:1110
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:1篇
    • 译文:2篇
    • 评论:2条
    最新评论