【问题标题】:VB.NET, How to improve (speed) for loop In Byte Array?VB.NET,如何提高(速度)字节数组中的循环?
【发布时间】:2016-01-06 07:47:45
【问题描述】:

我在这里想做自己的LZSS算法(LZSS是压缩算法)。但问题是速度。当我尝试压缩具有 3 MB 文件的文件时,这个过程非常长!

之后,我研究了什么可以使时间变长,发现检查每个字节的时间很长。 这是我检查每个字节时的简单代码:

Dim fs As FileStream = New FileStream(ofd.FileName, FileMode.Open)
        Dim buf(fs.Length - 1) As Byte
        fs.Read(buf, 0, fs.Length)

        Dim sise As Integer = fs.Length - 1
        Dim temp2 As Integer = 0
        Dim temp As Byte = 0
        Dim temp3 As Byte = 0

        For i = 0 To sise
            temp = buf(i)
            temp2 = i - 1
            For j = 0 To temp2

                If temp = buf(j) Then

                End If
            Next

        Next

当我运行并打开 27.3 KB 的文件并花费 495 毫秒时,我如何打开 20 MB 的文件并且将花费几分钟甚至几小时。

那么,有什么解决方案,这个简单的代码却要花很多时间..??

【问题讨论】:

  • 您的 for 循环的运行复杂度为 O(N^2),其中 N 为 2000 万。显然这需要很多很多分钟。
  • 是的,我知道,但是算法 lzss 就是这样。示例:samuelrickysamuelrickysaputro 压缩后:samuelrickysaputro(11,11,11) 11,11,11 因为(删除的字符索引,相同的字符索引,相同的长度字符)要做到这一点,我必须做很多 for 循环。
  • 如果你想找出是否有重复的字节:你可以对字节数组进行排序,然后进行线性扫描,比较相邻的元素是否相同。在这种情况下,复杂度将是O(NlogN)
  • @mostruash 不能,因为 LZSS 正在搜索相同的字节模式,例如: byte() = (34,23,55,34,57,84,34,23,55)相同的模式是 (34,23,55)

标签: vb.net algorithm performance for-loop


【解决方案1】:

您的数据压缩方式不可行,因为它的时间复杂度O(N*N*M) 其中 N 是数据大小,M 是最大模式大小,在您的情况下为 N。你需要改变你的方法。

例如,gzip 将与原始文本的距离限制为 32K,并将模式的最大长度限制为 258 字节。在这种情况下,算法的时间复杂度在最坏的情况下会降低到O(N*32K*258)

显然这还不够快。最坏的情况仍然需要很长时间才能运行。也许你应该看看gzip 并决定是否值得提出一个新的数据压缩算法,或者你是否有能力这样做。

【讨论】:

  • 根据您的代码,您可能会查看 Parallel.For 循环来对循环进行多线程处理,以便它使用处理器的多个核心
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 2019-08-11
  • 2020-10-21
  • 2014-01-20
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多