启程动态数组V2.0

简介

大量数据的管理是很多程序员的心病,很难找到一个速度快、效率高、支持超大规模数据的表,在1.0版本的基础上,启程花血本写下了这个强化了数据插入与删除的修正版,启程动态数组是一个功能强大的列表形数据管理链表,利用它可以轻松实现超大数据量的随机插入、删除、修改等操作,它另外一个特点就是速度极快,内存利用率高。

大量数据的管理必然需要占用大量的内存空间,如果这些数据占用的空间大小是随各种条件变化的,我们就不能使用数组来管理这些数据了(道理就不多说了),这时我们需要一个动态数组。MFC提供了一个很好的动态数组类CArray,对于少量数据,使用CArray就足够好用了,但是对于大量数据(10W级)它就力不从心了,因为它的本质就是一个数组,只不过对常用的插入、删除等操作进行了一个复杂的包装。为了解决这个问题,启程动态数组开创性地将链表与数组巧妙的结合起来,既有数组的高速随机索引的优点,又有链表的数据量灵活多变的特点。

工作原理

启程动态数组的数据结构如图(这是1.0版本的示意图,2.0版在结点中增加了一个指示当前数据段中已经使用的空间变量)。为了解决大量数据的动态存储问题,启程动态数组将数据分段存放在链表的节点中,每一段可以保存一定数量的数据,如果数据量增加,则在内存中分配一个新数据段,如果数据减少则释放空闲的数据段,从而有效地解决了该问题。相对于1.0版,2.0版中引入了每个结点中已使用空间用和总空闲空间两个变量,经过这个处理,在进行数据的插入删除时就不再需要对整个数组中的数据进行移动而只需要对目标数据段做一个简单的处理。


插入数据

如果目标数据段有空闲位置,那么只需要将该段进行曲整理并插入数据;如果目标段没有空闲空间,启程动态数据自动在内存中申请一段新的数据,并将该数据段链接到链表中。

删除数据

找到目标段后,从目标数据段中删除目标数据,如果目标段中只包含目标数据,启程动态数组自动删除目标段,并维护好链表的完整性。

添加数据

检查最后一个数据段,如果有空间就不再分配,没有就申请订报的数据段。

时间: 2024-08-31 07:48:22

启程动态数组V2.0的相关文章

c语言-动态数组赋值,实现矩阵m,n的乘积,为什么p矩阵的输出总是0元素呢

问题描述 动态数组赋值,实现矩阵m,n的乘积,为什么p矩阵的输出总是0元素呢 #include"stdio.h" #include"stdlib.h" //动态分配的函数需要包含该头文件 //void Matrix(double ,double **,double **,int ,int ,int ); int main() { int i,j,k,mWidth,mHeight,nWidth,nHeight; double **m,n,**p; //定义指向指针的指

【C/C++学院】0815-函数包装器/CPP类型转换/函数模块/动态数组

函数包装器管理内嵌函数 #include<iostream> #include<functional> //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部函数调用 //函数包装器, T数据类型, F是函数 template<typename T,typename F> T run(T v, F f) { stati

VS2013下动态数组二维数组读二进制文件的问题

问题描述 VS2013下动态数组二维数组读二进制文件的问题 int samples_to_read = 7200; uint8_t **caculate_a; int count2,count3; caculate_a = (uint8_t **)malloc(sizeof(uint8_t *)* 3); for (count1 = 0; count1<3; count1++){ //动态数组分配空间 caculate_a[count1] = (uint8_t *)malloc(sizeof(u

创新触手可及:WebSphere CloudBurst V2.0新特性

每一篇创新触手可及系列的文章都会从开发人员和其他从业人员的角度为您介绍关于新兴技术的信息和讨论,以及对前沿的 IBM WebSphere 产品的幕后观点. 新固件,新特性 IBM WebSphere CloudBurst Appliance firmware V2.0 不缺乏新特性.为了激发您对此新版本的兴趣,本文将带您概括地领略一下最重要的几个新特性.后续文章将会详细介绍这些新功能. 那么,我们现在就开始吧! 动态虚拟机操作 在版本 2.0 之前,WebSphere CloudBurst 中虚

C++技巧之二维动态数组类模板

C++提供了许多强大的机制来实现代码的高度复用.来使我们使用我们自已的类就像使用内置类型那样方便快捷.比如模板,运算符重载等等.模板好比如是一个大批量生产函数和类的工厂,使我们不用再去关心与数据类型相关的繁琐编程细节,把我们精力留给那些真正值得我们去认真思考的地方.而运算符重载则使我们的程序更直观更简洁,这不仅使我们更容易读懂我们的程序,而且使我们能以一种更为流畅的方式来表达我们的想法.就像上篇文章说到的,如果我们把动态分配的二维数组用类模板实现,并重载相应的操作符,我们就能十分方便的使用我们自

实现真正意义上的二维动态数组模板

我们可以通过动态数组的反例来确定动态数组应该具有哪些特性.大家都知道以下的方式是定义一个静态数组. int iCount[10]; int iCount[10][10]; 从上面可以看出,定义了静态数组之后,无论程序如果使这个数组,该数组在内存中所占空间的大小,位置是确定不变的. 我们可以得出结论,对于编译器,静态数组的大小和空间是已知的,因此编译器可以自动为该数组分配空间.具体情况是:如果你定义了一个全局数组,编译器将在数据区为你的数组分配一个空间:如果是个局部数组(比如定义在某一个局数中),

MySQL内核:innodb动态数组内部实现

动态数组涉及的文件是innodb存储引擎的三个文件:dyn0dyn.h.dyn0dyn.ic以及dyn0dyn.c. 这是一个基本的组件功能,是作为一个动态的虚拟线性数组.数组的基本元素是byte.动态数组dyn主要用来存放mtr的锁定信息以及log.Dyn在实现上,如果block需要分裂节点,则会使用一个内存堆.每个blok块存储数据的数据字段的长度是固定的(默认值是512),但是不一定会完全用完.假设需要存储的数据项的尺寸大于数据块时,该数据项被分拆,这种情况主要用于log的缓冲. 2. 数

使用::std::vector&amp;lt;&amp;gt;作为管理动态数组的优先选择

摘要: 本文介绍了C++标准库中的容器类vector,分析了它的优点,并且建议在应用程序中使用它作为动态数组的优先选择,而不是MFC的CArray<>等其他类模板.最后介绍了vector的接口和使用时的注意事项. 在一些使用 MFC 的程序中,经常看到许多程序使用 CArray<>,由于 CArray<>的设计问题,造成使用它的代码的复杂化,增加了维护难度.因此建议使用 ::std::vector<> 代替 CArray<>. 另外,也看到一些程

c语动态数组 的问题 把两个有序的数组合成一个数组

问题描述 c语动态数组 的问题 把两个有序的数组合成一个数组 想问下动态数组的问题,要两个有序的数组合成一个,一次性完成. #include stidio.h int main() { int *a;//是不是这里用指针,等下就可以用realloc了. int *b; int i=0,j=0,k; printf ("请输入第一个数组:n"); while ( scanf("%d",&a[i])==1&&a[i]!='n') { i++; }