专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VB Dotnet

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

发布时间:2011-06-23 16:03:38 文章来源:www.iduyao.cn 采编人员:星星草
求优化本代码方法或更好的算法
下面是我自己写的代码,但在海量数据计算中时间太长,想请高手们帮忙看能不能再优化一下,或者换种算法都行,只求提高运算速度

结果要求:数组中每一个字符串都是"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条就调用一次
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: