快捷搜索:

启程动态数组V2.0

本文示例源代码或素材下载

简介

大年夜量数据的治理是很多法度榜样员的芥蒂,很难找到一个速率快、效率高、支持超大年夜规模数据的表,在1.0版本的根基上,起程花血本写下了这个强化了数据插入与删除的修正版,起程动态数组是一个功能强大年夜的列表形数据治理链表,使用它可以轻松实现超大年夜数据量的随机插入、删除、改动等操作,它别的一个特征便是速率极快,内存使用率高。

大年夜量数据的治理一定必要占用大年夜量的内存空间,假如这些数据占用的空间大年夜小是随各类前提变更的,我们就不能应用数组来治理这些数据了(事理就不多说了),这时我们必要一个动态数组。MFC供给了一个很好的动态数组类CArray,对付少量数据,应用CArray就足够好用了,然则对付大年夜量数据(10W级)它就力不从心了,由于它的本色便是一个数组,只不过对常用的插入、删除等操作进行了一个繁杂的包装。为了办理这个问题,起程动态数组创始性地将链表与数组奇妙的结合起来,既稀有组的高速随机索引的优点,又有链表的数据量机动多变的特征。

事情道理

起程动态数组的数据布局如图(这是1.0版本的示意图,2.0版在结点中增添了一个唆使当前数据段中已经应用的空间变量)。为了办理大年夜量数据的动态存储问题,起程动态数组将数据分段寄放在链表的节点中,每一段可以保存必然数量的数据,假如数据量增添,则在内存平分配一个新数据段,假如数据削减则开释余暇的数据段,从而有效地办理了该问题。相对付1.0版,2.0版中引入了每个结点中已应用空间用和总余暇空间两个变量,颠末这个处置惩罚,在进行数据的插入删除时就不再必要对全部数组中的数据进行移动而只必要对目标数据段做一个简单的处置惩罚。

插入数据

假如目标数据段有余暇位置,那么只必要将该段进行曲收拾并插入数据;假如目标段没有余暇空间,起程动态数据自动在内存中申请一段新的数据,并将该数据段链接到链表中。

删除数据

找到目标段后,从目标数据段中删除目标数据,假如目标段中只包孕目标数据,起程动态数组自动删除目标段,并掩护好链表的完备性。

添加数据

反省着末一个数据段,假如有空间就不再分配,没有就申请订报的数据段。

随机索引(数据定位)

相对照通俗链表在随机索引方面的不够,起程动态数组在这方面可以说是趋于完美。因为起程动态数组在数据布局上的上风,它在数据定位的时刻是段式跳跃的搜索,是以它的速率获得了有力的保障。另一方面,为了加速索引速率它还颠最后特其余优化,便是设置了一个当前位置的指针,这样不仅在通俗的索引中可以成倍的前进速率,分外是在遍历类的操作时以致可以达到数组的速率。

数据压缩

假如细心的人必然会发明,按照上面的模式中可能存在很严重的空间滥废,事实上假如不作处置惩罚也是如斯,由于在的插入数据时,我只必要插入一个数据,结果却申请了一个完备的数据段,这在空间有限的谋略机中将会造成很大年夜的问题。还记得上面提到的新引入的用来记录余暇空间数量的变量吗?好了,有了它,我们就可以把握有若干空间没有使用到,当这个值达到一个的范围时,起程动态数组自动对它占用的空间进行收拾,颠末收拾后不再必要的空间自动收受接收。当然您可也可强制收拾,只必要调用一个简单的接口就好了。

参数设置

启动动态数组的机能很大年夜程度上依附于参数的设置,关键的参数有勇有2个,一是数据段的大年夜小,一是余暇空间压缩阀,这两个参数应该也是对照好理解的。数据段的大年夜小主要应该根据目标数据的容量及谋略机的内存来设置,压缩阀则要斟酌你的机械的内存以及插入、删除操作的频率。对付10万级的数据量,数据段设成100就差不多了,假如必要大年夜量进行插入、删除压缩阀可适应加大年夜,否则反之。

履行机能

代码的机能预计是大年夜家最为关心的问题,同时也是它存在的根本。因为没有着实的代码做参考,这里只能与MFC的CArray进行对照。在10万级综合操作测试中,起程动态数组耗时300MS阁下,而CArray则必要3000MS,而且由于起程动态数组的耗时与数据量基础是线性关系,而CArray则基础是指数关系,是以数据量越大年夜起程动态数组的机能上风越显着。

测试法度榜样

在开拓这个法度榜样时写了一个响应的测试对象,界面如下图:

“efficiency compare”部分是进行机能对照的,其它的都是进行法度榜样精确性测试用的。做完测试后可以用刷新来显示内存中的数据。

版本历史

2.0:2004-6-3

增强插入删除

1.0:2003- 09-25

保证

本代码可以随意率性应用、改动、传播,但作者纰谬应用该链表造成的后果承担负何直接或间接责任。

写在着末

这是我以为写得最好的一段代码,拿出来共享只盼望能够给大年夜家带来一点点方便。假如大年夜家感觉它有代价将是我最大年夜的快乐!假如发明法度榜样的bug请必然奉告我!盼望大年夜空用的兴奋。

您可能还会对下面的文章感兴趣: