启程动态数组V2.0

2016-01-29 12:14 19 1 收藏

启程动态数组V2.0,启程动态数组V2.0

【 tulaoshi.com - C语言心得技巧 】

启程动态数组V2.0

作者:黄建雄

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)


下载源代码

简介
  大量数据的管理是很多程序员的心病,很难找到一个速度快、效率高、支持超大规模数据的表,在1.0版本的基础上,启程花血本写下了这个强化了数据插入与删除的修正版,启程动态数组是一个功能强大的列表形数据管理链表,利用它可以轻松实现超大数据量的随机插入、删除、修改等操作,它另外一个特点就是速度极快,内存利用率高。
  大量数据的管理必然需要占用大量的内存空间,如果这些数据占用的空间大小是随各种条件变化的,我们就不能使用数组来管理这些数据了(道理就不多说了),这时我们需要一个动态数组。MFC提供了一个很好的动态数组类CArray,对于少量数据,使用CArray就足够好用了,但是对于大量数据(10W级)它就力不从心了,因为它的本质就是一个数组,只不过对常用的插入、删除等操作进行了一个复杂的包装。为了解决这个问题,启程动态数组开创性地将链表与数组巧妙的结合起来,既有数组的高速随机索引的优点,又有链表的数据量灵活多变的特点。

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



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

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

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

随机索引(数据定位)
  相比较普通链表在随机索引方面的不足,启程动态数组在这方面可以说是趋于完美。由于启程动态数组在数据结构上的优势,它在数据定位的时候是段式跳跃的搜索,因此它的速度得到了有力的保障。另一方面,为了加速索引速度它还经过了特别的优化,就是设置了一个当前位置的指针,这样不仅在普通的索引中可以成倍的提高速度,特别是在遍历类的操作时甚至可以达到数组的速度。

数据压缩
  如果细心的人一定会发现,按照上面的模式中可能存在很严重的空间滥废,事实上如果不作处理也是如此,因为在的插入数据时,我只需要插入一个数据,结果却申请了一个完整的数据段,这在空间有限的计算机中将会造成很大的问题。还记得上面提到的新引入的用来记录空闲空间数量的变量吗?好了,有了它,我们就可以把握有多少空间没有利用到,当这个值达到一个的范围时,启程动态数组自动对它占用的空间进行整理,经过整理后不再需要的空间自动回收。当然您可也可强制整理,只需要调用一个简单的接口就好了。

参数设置
  启动动态数组的性能很大程度上依赖于参数的设置,关键的参数有勇有2个,一是数据段的大小,一是空闲空间压缩阀,这两个参数应该也是比较好理解的。数据段的大小主要应该根据目标数据的容量及计算机的内存来设置,压缩阀则要考虑你的机器的内存以及插入、删除操作的频率。对于10

来源:http://www.tulaoshi.com/n/20160129/1485171.html

延伸阅读
标签: Web开发
内容缓存是Web应用中最普通的优化技术之一,例如,可以使用一个自定义地JSP标签——我们将之命名为<jc:cache>——由<jc:cache>和</jc:cache>将每一个需要被缓存的页面片段封装起来。任何自定义标签可以控制它所包含部分 (也即预先封装的页面片段)在何时执行,并且动态输出结果可以被捕获。<jc:cache>标签使得JSP容器(例如Tomcat)只生...
标签: 游戏动漫
《异度之刃》的启程攻略   在《异度之刃》的启程阶段,因为修尔克和莱茵决定找出黑脸报酬,为此两人踏上了旅程。当时他们的第一个目的地就是第六区,在这里就可以打听到想要的情报,为此魔石制造系统也开始了。当来到洞窟的时候,之前打不开的门竟然奇迹般的打开了,穿过大洞的话就可以继续往深处迸发了。   这个时候会发现几...
《求生之路》关于找不到smd.v2.0.final-rbpfc1的问题 我下的是QQ中转站的那个,不知道跟最早那个破解STEAM的是不是一样。。 好像有很多人问关于把SMD.v2.0.Final-RBPFC1解壓放到與steam.exe同一級目錄可找不到SMD.v2.0.Final-RBPFC1的问题 解决办法: Cracked压缩包里有Smd和UnDeadPatch333两个文件夹及一个BLOB文件 Smd和UnDeadPatch...
数组下标 JScript 中的数组是稀疏的。也就是说,假如一个数组具有三个元素,编号分别为 0、1 和 2,您就可以创建元素 50,而不必担心从 3 到 49 的参数。假如该数组有一个自动的 length 变量,(请参阅 内部对象 了解有关数组长度的自动监控的说明),该 length 变量被设为 51,而不是 4。当然您可以创建各元素的编号之间没有间隙的数组,不...
VC++通用GIS功能开发解决方案 2.0v 介绍 作者/潘立群 下载 Demo 示例程序 综述    《VC++通用GIS功能开发解决方案》源代码是基于VC++6.0 MFC 类库,在Win2000平台上开发的。界面部分用到了较低版本的 CJ60Lib 开放源码库,用户可自行替换高...

经验教程

225

收藏

55
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部