大量数据进行数组 *** 作的Redim Preserve替代方法

大量数据进行数组 *** 作的Redim Preserve替代方法,第1张

概述大家应该有这样的一个概念,当然,我也是前几天才看到先人的文章中写道的: VB中,不定数组的Redim Preserve方法在数目少的时候,还不影响,但是到了数组项多了,就会拖慢速度。为什么?高手在文中说过:VB中的Redim Preserve是重新开辟了一个指定大小的数组,然后再把你原数组中的数据拷贝过去的。 这样,也就不难理解如果循环中,尤其是大量不定数组的 *** 作过程中,有Redim Preser 大家应该有这样的一个概念,当然,我也是前几天才看到先人的文章中写道的:
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         New         Queue(        Of                 String        )         Dim         kk()         String                 Dim         beginme         Date                 =         Now         For         i         Integer                 =                 0                 To                 10000         Tq.Enqueue(i.ToString)         Next                 ReDim         kk(Tq.Count)         For         k         To         Tq.Count         -                 1         kk(k)         =         Tq.Dequeue         Dim         endme         Date                 =         Now DeBUG.Print(        "        one Time:        "                 &         (endme         -         beginme).ToString)         Sub         Count_Two()         ReDim         kk(        0        )         10000                 ReDim                 Preserve         kk(i) kk(i)         =         i.ToString         two Time:        Sub         button2_Click(        Handles         button2.Click         AddressOf         Count_Two) i.Start()         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 *** 作中作为替代,极大的提升效率。节约时间和计算机计算资源;至于中间插入项什么的,我还没有探究,毕竟暂时用不着。


谢谢大家捧场! 总结

以上是内存溢出为你收集整理的大量数据进行数组 *** 作的Redim Preserve替代方法全部内容,希望文章能够帮你解决大量数据进行数组 *** 作的Redim Preserve替代方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1283868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存