LZW compression: Difference between revisions

m
m (Optimized Lua decompress using table.concat. On 1.2mb test data, ~44x faster. 58.8s to 1.3s)
Line 4,904:
{{trans|JavaScript}}
<lang swift>class LZW {
class func compress(_ uncompressed:String) -> [Int] {
var dict = [String : Int]()
 
for i in 0 ..< 256 {
let s = String(UnicodeScalarUnicode.Scalar(UInt8(i)))
dict[s] = i
}
 
var dictSize = 256
var w = wc""
var result = [Int]()
for c in uncompressed {
w let wc = w + String(c)
if let x = if dict[kwc] != nil {
entry w = xwc
} else {
result.append(dict[w]!)
} else if k = dict[wc] = dictSize {+ 1
entry = w += String(first(w)!c)
}
}
 
if w != "" {
result.append(dict[w]!)
}
return result
}
 
class func decompress(_ compressed:[Int]) -> String? {
var dictSize = 256
var wdict = ""[Int : String]()
 
var result = [Int]()
for ci in uncompressed0 ..< 256 {
let wc = w + dict[i] = String(cUnicode.Scalar(UInt8(i)))
if dict[wc] != nil {}
 
w = wc
} else {var dictSize = 256
resultvar w = String(Unicode.appendScalar(dictUInt8(compressed[w0]!)))
dict[wc]var result = dictSize++w
for k in compressed[1 ..< compressed.count] {
w = String(c)
let entry : String
}
if let x = dict[k] {
w = entry = x
} else if k == dictSize {
dict[dictSize++] entry = w + String(first(entry)!w[w.startIndex])
} else {
return nil
}
 
result += entry
dict[dictSize+1] = w + String(entry[entry.startIndex])
w = entry
}
return result
}
if w != "" {
result.append(dict[w]!)
}
return result
}
class func decompress(compressed:[Int]) -> String? {
var dict = [Int : String]()
for i in 0 ..< 256 {
dict[i] = String(UnicodeScalar(i))
}
var dictSize = 256
var w = String(UnicodeScalar(compressed[0]))
var result = w
for k in compressed[1 ..< compressed.count] {
let entry : String
if let x = dict[k] {
entry = x
} else if k == dictSize {
entry = w + String(first(w)!)
} else {
return nil
}
result += entry
dict[dictSize++] = w + String(first(entry)!)
w = entry
}
return result
}
}
 
let comp = LZW.compress("TOBEORNOTTOBEORTOBEORNOT")
printlnprint(comp)
 
if let decomp = LZW.decompress(comp) {
println print(decomp)
}</lang>
{{out}}
Anonymous user