您的位置:首页 > 其它

大量数据进行数组操作的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
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操作中作为替代,极大的提升效率。节约时间和计算机计算资源;至于中间插入项什么的,我还没有探究,毕竟暂时用不着。

谢谢大家捧场!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐