大量数据进行数组操作的Redim Preserve替代方法
2012-08-21 00:51
225 查看
大家应该有这样的一个概念,当然,我也是前几天才看到先人的文章中写道的:
VB中,不定数组的Redim Preserve方法在数目少的时候,还不影响,但是到了数组项多了,就会拖慢速度。为什么?高手在文中说过:VB中的Redim Preserve是重新开辟了一个指定大小的数组,然后再把你原数组中的数据拷贝过去的。
这样,也就不难理解如果循环中,尤其是大量不定数组的操作过程中,有Redim Preserve会拖慢程序速度。这里,我们就必须想一个替代方法。我的方法,就是“队列”
比如循环1000次,用redim preserve来不断扩充数组,需要的复制过程:
初始是1个数据
然后2个数据
然后3个数据
……
然后n个数据
也就是,进行了1+2+3+……+n=n(n+1)/2次数据复制。
而,如果使用队列的方法,增加一个数据,就相当于在火车车厢尾部再挂上一个车厢,而不是 去重新换一列火车,然后然所有的人从一辆车转移到另一辆。
这样算下来,就需要n次处理
最后直接dim r() as integer:redim r(队列中的总项数-1)
再将数据复制进去。这个复制过程又进行n次操作,算起来,一共2n次。
第一种方法,n(n+1)/2
第二种方法,2n
用第一个方法的计算次数做分子,第二种方法计算次数做分母,得到耗费计算次数的比例为:(n+1)/4 当n<=3的时候,redim preserve 的方法效率更高,而当n超过了3的时候,队列的方法(即第二种方法)效率明显高于第一种,这里,附上测试代码和数据说明问题:
VB.NET code
n=10时候:
one Time:00:00:00
two Time:00:00:00
n=100时候:
one Time:00:00:00
two Time:00:00:00.0010000
n=1000时候
one Time:00:00:00.0010001
two Time:00:00:00.0020002
n=10000时候
one Time:00:00:00.0010001
two Time:00:00:00.0700040
n=100000时候
one Time:00:00:00.0170010
two Time:00:00:22.6732968
后面的就太明显了,也太耗时间了,就不贴了
最后,说明下,
【第一】
--这个one Time是指使用队列的方法占用的运行时间
--这个two Time是指Redim Preserve方法占用的时间
高下立判。
【第二】
目前,这种方法适用于在顺序的Redim Preserve操作中作为替代,极大的提升效率。节约时间和计算机计算资源;至于中间插入项什么的,我还没有探究,毕竟暂时用不着。
谢谢大家捧场!
VB中,不定数组的Redim Preserve方法在数目少的时候,还不影响,但是到了数组项多了,就会拖慢速度。为什么?高手在文中说过:VB中的Redim Preserve是重新开辟了一个指定大小的数组,然后再把你原数组中的数据拷贝过去的。
这样,也就不难理解如果循环中,尤其是大量不定数组的操作过程中,有Redim Preserve会拖慢程序速度。这里,我们就必须想一个替代方法。我的方法,就是“队列”
比如循环1000次,用redim preserve来不断扩充数组,需要的复制过程:
初始是1个数据
然后2个数据
然后3个数据
……
然后n个数据
也就是,进行了1+2+3+……+n=n(n+1)/2次数据复制。
而,如果使用队列的方法,增加一个数据,就相当于在火车车厢尾部再挂上一个车厢,而不是 去重新换一列火车,然后然所有的人从一辆车转移到另一辆。
这样算下来,就需要n次处理
最后直接dim r() as integer:redim r(队列中的总项数-1)
再将数据复制进去。这个复制过程又进行n次操作,算起来,一共2n次。
第一种方法,n(n+1)/2
第二种方法,2n
用第一个方法的计算次数做分子,第二种方法计算次数做分母,得到耗费计算次数的比例为:(n+1)/4 当n<=3的时候,redim preserve 的方法效率更高,而当n超过了3的时候,队列的方法(即第二种方法)效率明显高于第一种,这里,附上测试代码和数据说明问题:
VB.NET code
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As New Threading.Thread(AddressOf Count_One) i.Start() End Sub Sub Count_One() Dim Tq As New Queue(Of String) Dim kk() As String Dim beginme As Date = Now For i As Integer = 0 To 10000 Tq.Enqueue(i.ToString) Next ReDim kk(Tq.Count) For k As Integer = 0 To Tq.Count - 1 kk(k) = Tq.Dequeue Next Dim endme As Date = Now Debug.Print("one Time:" & (endme - beginme).ToString) End Sub Sub Count_Two() Dim kk() As String ReDim kk(0) Dim beginme As Date = Now For i As Integer = 0 To 10000 ReDim Preserve kk(i) kk(i) = i.ToString Next Dim endme As Date = Now Debug.Print("two Time:" & (endme - beginme).ToString) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim i As New Threading.Thread(AddressOf Count_Two) i.Start() End Sub End Class
n=10时候:
one Time:00:00:00
two Time:00:00:00
n=100时候:
one Time:00:00:00
two Time:00:00:00.0010000
n=1000时候
one Time:00:00:00.0010001
two Time:00:00:00.0020002
n=10000时候
one Time:00:00:00.0010001
two Time:00:00:00.0700040
n=100000时候
one Time:00:00:00.0170010
two Time:00:00:22.6732968
后面的就太明显了,也太耗时间了,就不贴了
最后,说明下,
【第一】
--这个one Time是指使用队列的方法占用的运行时间
--这个two Time是指Redim Preserve方法占用的时间
高下立判。
【第二】
目前,这种方法适用于在顺序的Redim Preserve操作中作为替代,极大的提升效率。节约时间和计算机计算资源;至于中间插入项什么的,我还没有探究,毕竟暂时用不着。
谢谢大家捧场!
相关文章推荐
- Android编程实现在adapter中进行数据操作的方法
- Android操作sqlite导入大量数据耗时的解决方法
- php使用PDO事务配合表格读取大量数据插入操作实现方法
- 把传过来的Object对象转换成Collection类型的对象。isArray()方法,判定此Class对象是否表示一个数组类。java.lang.reflect.Array 对任意数组进行操作
- C#对List中的数据进行取交集、并集、差集和去重操作的方法
- Fortran 从文件中读取数据放入数组中,然后对其进行bubble sort,使用了一些方法防止人为错误
- C++操作MySQL大量数据插入效率低下的解决方法
- 基于jQuery中对数组进行操作的方法
- Android操作sqlite导入大量数据耗时的解决方法
- 手动输入数组中的数据然后对数组进行操作
- CI框架AR操作(数组形式)实现插入多条sql数据的方法
- 6.用插入排序对任意一组随机数据进行随机数组进行排序(用循环和递归两种方法)
- laravel查询得到的数据(为对象object)无法进行数组循环遍历,而且不能用数组方式访问和查看的原因以及解决方法
- Android操作sqlite导入大量数据耗时的解决方法
- 使用Repeater绑定数据,及提取显示数据进行操作的一点小方法!(模板列)
- 利用GPGPU方法将大量数据通过纹理传输至GPU进行计算
- 这是一个定时脚本,主要功能是遍历该文件夹下的所有文件并存储到数组,对数据中的文件进行操作,一个一个移动到指定的目录下,并删除原有文件
- php实现对两个数组进行减法操作的方法
- C++操作MySQL大量数据插入效率低下的解决方法
- 对数组每个数进行操作的系统方法