LZW compression: Difference between revisions
Content added Content deleted
m (Optimized Lua decompress using table.concat. On 1.2mb test data, ~44x faster. 58.8s to 1.3s) |
|||
Line 4,904: | Line 4,904: | ||
{{trans|JavaScript}} |
{{trans|JavaScript}} |
||
<lang swift>class LZW { |
<lang swift>class LZW { |
||
class func compress(uncompressed:String) -> [Int] { |
class func compress(_ uncompressed:String) -> [Int] { |
||
var dict = [String : Int]() |
var dict = [String : Int]() |
||
⚫ | |||
for i in 0 ..< 256 { |
for i in 0 ..< 256 { |
||
let s = String( |
let s = String(Unicode.Scalar(UInt8(i))) |
||
dict[s] = i |
dict[s] = i |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
for c in uncompressed { |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
result.append(dict[w]!) |
|||
⚫ | |||
⚫ | |||
} |
} |
||
⚫ | |||
⚫ | |||
var |
var dict = [Int : String]() |
||
⚫ | |||
for |
for i in 0 ..< 256 { |
||
dict[i] = String(Unicode.Scalar(UInt8(i))) |
|||
} |
|||
⚫ | |||
var dictSize = 256 |
|||
var w = String(Unicode.Scalar(UInt8(compressed[0]))) |
|||
var result = w |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
if let x = dict[k] { |
|||
⚫ | |||
} else if k == dictSize { |
|||
⚫ | |||
} else { |
|||
⚫ | |||
} |
|||
⚫ | |||
dict[dictSize+1] = w + String(entry[entry.startIndex]) |
|||
w = entry |
|||
⚫ | |||
⚫ | |||
} |
} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
|||
⚫ | |||
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 |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
|||
⚫ | |||
} |
|||
} |
} |
||
let comp = LZW.compress("TOBEORNOTTOBEORTOBEORNOT") |
let comp = LZW.compress("TOBEORNOTTOBEORTOBEORNOT") |
||
print(comp) |
|||
if let decomp = LZW.decompress(comp) { |
if let decomp = LZW.decompress(comp) { |
||
print(decomp) |
|||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |