首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

求优化本代码方法或更好的算法,该如何处理

2011-12-27 
求优化本代码方法或更好的算法下面是我自己写的代码,但在海量数据计算中时间太长,想请高手们帮忙看能不能

求优化本代码方法或更好的算法
下面是我自己写的代码,但在海量数据计算中时间太长,想请高手们帮忙看能不能再优化一下,或者换种算法都行,只求提高运算速度

结果要求:数组中每一个字符串都是"0","1","3",总长度为了14位,要求把原来每一位中如果是0时就改成1和改成3生成两个新的字符串,例:原字符串"01301301301303 "结果:"11301301301303 ","31301301301303 ","00301301301303 ","03301301301303 "..........每一位改变后生成新字符串,最后的数据不能有重复.

VB.NET code
 Dim s1, s3 As Integer        s3 = TNN集.Length - 1        Dim dict As New Dictionary(Of String, Short) '新的  Dictionary类        For Each ii As String In TNN集            If Not dict.ContainsKey(ii) Then dict.Add(ii, 14) '是否含有  i的健值        Next        Dim i As String        For s1 = 0 To s3            Application.DoEvents() '=========================================================            Dim TS() As Char = TNN集(s1).ToCharArray   '把每条单式拆分成字符数组            For s2 As Short = 0 To 13                Select Case TS(s2)                    Case "3"                        TS(s2) = "1"   '改变每位值                        i = New String(TS)                        If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有  i的健值                        TS(s2) = "0"                        i = New String(TS)                        If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有  i的健值                        TS(s2) = "3"                    Case "1"                        TS(s2) = "3"   '改变每位值                        i = New String(TS)                        If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有  i的健值                        TS(s2) = "0"                        i = New String(TS)                        If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有  i的健值                        TS(s2) = "1"                    Case "0"                        TS(s2) = "1"   '改变每位值                        i = New String(TS)                        If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有  i的健值                        TS(s2) = "3"                        i = New String(TS)                        If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有  i的健值                        TS(s2) = "0"                End Select            Next            Erase TS        Next        Return dict.Keys.ToArray        dict = Nothing        GC.Collect()        GC.WaitForPendingFinalizers()


[解决办法]
1。考虑多线程操作,一个读,一个写,写线程负责转换。因为文件的io操作远慢于字符串的创建。而如果是海量数据,读取,写入的优化对整体效率非常明显,可以考虑分块读取的方式对读取优化,在写入的时候可以直接写入,并分开2个线程实现。
2.海量数据的话,不要都放在内存中,内存分配在数据量大的时候对效率的影响非常明显。
[解决办法]
你没有明白我的意思

dim a(4782970) As BitArray

dim T as int32

T=3进制To10进制(01301301301303)

a(t)=ture

这样无需查询,不会有重复项目。

取出来的时候只需要

FOR I = 0 TO 4782969 
IF A(I)=TURE THEN 值=10进制to3进制(i)
next I
[解决办法]
并且,你用List还有一个重要好处

由于你的效率主要卡在contains这个方法这里,所以你要避免这个方法

你在添加字符串的时候,不要判断contains,就直接添加

然后最后给list调用distinct方法一次性过滤重复的字符串(微软的代码绝对要比你自己写的代码效率高得多)

如果你担心会造成内存占用过大,那么可以阶段性地调用distinct,比如每运行1000条就调用一次

热点排行