【发布时间】: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